【问题标题】:How position absolute and fixed block elements get their dimension?位置绝对和固定块元素如何获得它们的尺寸?
【发布时间】:2020-10-30 05:46:50
【问题描述】:

其实我看到很多这样的问题,但是我找不到这个问题的正常答案,因为我再次打开这个问题。

当我们有块元素(显示:块)时,该元素包含父组件的全宽,如果元素本身是根元素,则该元素宽度占100%。

但是当我们查看块元素(显示:块)但定位绝对元素时,会出现类似内联块元素的工作(类似块元素但宽度未充满父组件)甚至父元素位置相对。

谁能解释一下为什么位置绝对元素和固定元素的宽度不像显示:块元素那样工作。

https://jsfiddle.net/epbkmzh3/28/

    <div class="container">
      <div style="background: red;"> 1 </div>
    </div>
    
    
    <div class="container" style="position: relative;">
      <div style="position: absolute; background: red;"> 1 </div>
    </div>

【问题讨论】:

    标签: html css


    【解决方案1】:

    这里是详细说明如何找到任何元素的宽度/高度的规范:https://www.w3.org/TR/CSS21/visudet.html

    从那里你可以阅读绝对元素:

    确定这些元素使用值的约束是:

    'left' + 'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' + 'right' = width of containing block

    然后

    如果'left'、'width'和'right'这三个都是'auto':首先将'margin-left'和'margin-right'的任何'auto'值设置为0。然后,如果建立包含静态位置的块的元素的“方向”属性是“ltr”,将“左”设置为静态位置并应用下面的规则三;否则,将“right”设置为静态位置并应用下面的第一条规则。

    还有第三条规则:

    'width' 和 'right' 是 'auto' 而 'left' 不是 'auto',那么 宽度是收缩到适合的 。然后求解'对'

    第一条规则也类似

    如果您继续阅读,您会发现如何计算 shrink-to-fit 宽度。您还会注意到相同的 shrink-to-fit 算法适用于 floatinline-block 元素


    另请注意,固定元素是绝对元素的特例,因此适用相同的规则。唯一的区别是包含块

    固定定位是绝对定位的一个子类别。唯一的区别是对于一个固定定位的盒子,包含块是由视口建立的。 ref


    您还可以看到块元素遵循几乎相同的约束(没有左/右),但the rules are different

    在其他属性的使用值中必须保持以下约束:

    'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containing block

    然后

    如果 'width' 设置为 'auto',则任何其他 'auto' 值都将变为 '0' 并且 'width' 来自结果相等。

    这将使width = width of containing block


    inline-block 元素之间的一个重要区别是绝对元素不会像我们想象的那样占用其内容的宽度。由于上述限制,大多数情况下都会发生这种情况,但请查看以下示例:

    .container {
     clear:left;
     margin:5px;
    }
    <div class="container" style="float:left;position:relative;">
      <div style="display:inline-block; background: red;"> 1 1 1 1 1 1  </div>
    </div>
    
    <div class="container" style="float:left;position:relative;">
      <div style="position: absolute; background: red;"> 1 1 1 1 1 1  </div>
    </div>

    请注意绝对元素将如何包装到尽可能小的尺寸来取消内联块。这是因为包含块也是一个 shrink-to-fit 容器。

    相关:Why everything word-wrap inside an absolute element nested inside a float or inline-block element

    【讨论】:

    • 感谢您的回复,但我不明白这部分''left' + 'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding -right' + 'border-right-width' + 'margin-right' + 'right' = 包含块的宽度'。你的意思是左右属性值改变位置绝对元素的宽度?
    • @MuradSofiyev 是的。尝试设置 left:0 和 right:0 并且您的绝对元素将是其容器的全宽......绝对的宽度并不像您想象的那么容易,如果您查看我分享的链接,您会看到很多基于您是否指定某些属性的情况。默认情况下,您没有指定任何内容,因此它们是自动的,我突出显示了在一切都是自动的情况下适用的规则。在其他情况下,您需要遵循适当的规则
    • 非常感谢。我会阅读这个链接。你今天帮了我很多:)
    • @MuradSofiyev 欢迎您,花时间阅读很多遍,因为从第一次阅读开始理解所有内容并非易事。
    【解决方案2】:

    这是因为absolutefixed 定位将元素从文档流中移除。

    并且由于这些元素已从文档流中删除,因此没有参考它们应该是什么宽度,因此它们只占用与其内容一样多的空间。

    如果它们本质上是块元素(divp 等),它们仍然是“块”元素,除非通过 CSS 更改显示属性。 为清晰起见编辑:即使显示属性通过 CSS 更改,浏览器仍将计算为 display: block

    以下是有关文档流的一些文档: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flow_Layout/In_Flow_and_Out_of_Flow

    重要的部分:

    Taking an item out of flow
    
    All elements are in-flow apart from:
    
        floated items
        items with position: absolute (including position: fixed which acts in the same way)
        the root element (html)
    
    Out of flow items create a new Block Formatting Context (BFC) and therefore everything inside them can be seen as a mini layout, separate from the rest of the page. The root element therefore is out of flow, as the container for everything in our document, and establishes the Block Formatting Context for the document.
    

    【讨论】:

    • 除非显示属性是通过 CSS 改变的。 --> 即使你改变了绝对/固定元素的显示,它仍然会计算为阻塞,所以你不能真正改变此类元素的展示
    • 这不是我要说的。我只是指出absolutefixed 元素仍然是块元素——除非你改变它们。我没有说如果你改变它会影响它们的实际显示方式。
    • 元素仍然是块元素 - 除非你改变它们 --> 不,你不能改变它们:) 尝试让它们 display:inline 你会看到计算值显示是块
    • 我在这里并不反对...是的,它仍将被计算为块,这不会阻止某人将 CSS 显示属性更改为其他内容 - 无论浏览器如何解释它.它会做任何事吗?不。我将对其进行编辑以更清楚地表达我的意图。
    • 也与此有关并且由于这些元素已从文档流中删除,因此没有参考它们应该是什么宽度,因此它们只占用与其内容一样多的空间。 --> inline-block 不会从流程中删除,但也会占用与其内容一样多的空间(对于表格元素也是如此)
    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2011-03-19
    相关资源
    最近更新 更多