【问题标题】:Difference between width:auto and width:100% - what is it 100% of? (CSS)width:auto 和 width:100% 之间的区别 - 100% 是什么? (CSS)
【发布时间】:2014-06-24 00:22:10
【问题描述】:

为什么将元素设置为position:fixed 会改变其宽度?我知道 HTML 元素默认跨越浏览器窗口的整个宽度,但是当我将标题上的位置设置为固定时,<div> 缩小到零宽度。这是为什么呢?

尝试width:auto 并不能解决它,<div> 的宽度仍然为零!

此示例取自 Code Academy “构建简历”项目,在他们的 Web 基础课程结束时。

我有一个这样的 HTML 文件:

    <!DOCTYPE html>
<html>
    <head>
        <link type="text/css" rel="stylesheet" href="stylesheet.css"/>
        <title></title>
    </head>
    <body>
        <div id="header"></div>
        <div class="left"></div>
        <div class="right"></div>
        <div id="footer"></div>
    </body>
</html>

还有一个像这样的 CSS 文件:

    div {
    border: 5px solid red;
    border-radius: 5px;
}

#header{
    height:30px;
    background-color:orange;
    z-index:1;
}

#footer{
    height:30px;
    background-color:teal;
    clear:both;
}

.left{
    height:300px;
    width:200px;
    float:left;
}

.right{
    height:300px;
    width:200px;
    float:right;
}

更新:我注意到设置width:100% 确实保持了浏览器窗口的宽度。这里发生了什么?我已经阅读了Why does fixed positioning alter the width of an element?,但不确定它在此处如何应用。

编辑:我想我会把它从 cmets 上移开并尝试在这里回答它,以便为我感到困惑的地方提供更多指导: “是的,看起来像“虽然具有 position:absolute 的元素的位置和尺寸是相对于其包含块的,但具有 position:fixed 的元素的位置和尺寸总是相对于初始包含块”是关键部分。所以我看到 position:fixed 将设置我相对于视口的尺寸,但视口不是整个浏览器窗口吗?那么为什么它的大小会折叠为零?除此之外,为什么 width:auto 不修复但是 width:100% 确实使它再次跨越整个水平长度?”

width:autowidth:100% 不同。 width:auto 会将元素的宽度扩展到其包含块内的所有水平空间。由于空间位于包含块的内部,因此不计算边框/填充/边距。

width:100% 做了width:auto 所做的事情并且添加了包含元素的边框/填充/边距的宽度。 difference between width auto and width 100 percent 提供了很好的视觉演示。

所以,当我在 position:fixed 元素上设置 width:auto 时,position:fixed 将元素的宽度收缩包装为其内容的宽度(这没什么),然后宽度自动调整为包含元素,在本例中为 _________(什么?为什么它的宽度为零?)。

当我将其设置为 width:100% 时,它包括 _________ 的填充/边距/边框(什么?为什么它会扩展为水平覆盖整个页面?)。

【问题讨论】:

  • 您是否从您引用的那个问题中阅读了docs
  • 是的,看起来像“虽然带有position:absolute 的元素的位置和尺寸是相对于它的包含块,但带有position:fixed 的元素的位置和尺寸总是相对于初始包含块”是关键部分。所以我看到position:fixed 将设置我的&lt;div&gt; 相对于视口的尺寸,但视口不是整个浏览器窗口吗?那么为什么它的大小会崩溃到零呢?除此之外,为什么width:auto 没有修复它,但width:100% 确实让它再次跨越整个水平长度?
  • 你真正需要阅读的是w3.org/TR/CSS2/visudet.html#abs-non-replaced-width。简而言之,当 left、width 和 right 都是“自动”时,使用的宽度是收缩到适合的。这就是你需要知道的。无论是流入还是流出,相对于视口、初始包含块或其他任何内容都无关紧要。

标签: html css


【解决方案1】:

原因是fixedabsolute 定位都将元素从文档流中取出。这样做的剩余效果是,除非另有明确说明,否则元素现在将根据其内容的大小而不是其父级的大小来增长/缩小。

正如您已经发现的那样,一个简单的解决方法是为其设置 100% 的宽度:

.fixed-element{

  position:fixed;
  width:100%

}

解决quote on fixed positioning的问题:

带有 position:absolute 的元素的位置和尺寸是相对于其包含块的,而带有 position:fixed 的元素的位置和尺寸总是相对于初始包含块。这通常是视口:浏览器窗口或论文的页面框。

我实际上发现它的措辞很糟糕。这并不是说尺寸会增长到视口的大小。相反,它试图区分absolutefixed 定位之间的具体差异。更彻底地说:fixed 元素的尺寸/大小将始终与初始元素相关。而absolute 元素的尺寸/大小将相对于包含元素。这并不明确意味着它会实际上默认占用 100% 的视口...

【讨论】:

  • 感谢这有帮助 - 我没有意识到将元素从流中取出意味着它会根据其内容而不是包含元素的大小来增长/缩小。所以width:auto 这里基本上没有改变宽度的计算方式。因为width:100% 确实有效,100% 是什么?
  • 显然是视口......这正是引用中“相对于”的意思。这并不意味着它会在没有被告知的情况下与它的大小相同,但它确实意味着 100% 等于它。因此在这种情况下 100% = 100% 的视口宽度。
【解决方案2】:

这是默认行为。

阅读http://www.w3.org/wiki/CSS_absolute_and_fixed_positioning#Specifying_dimensions

绝对定位的元素将收缩包装以适应其内容 除非您指定它们的尺寸。 您可以通过以下方式指定宽度 设置左右属性,或者通过设置宽度 可以通过设置顶部和底部来指定高度 属性,或者通过设置 height 属性。

【讨论】:

    猜你喜欢
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2013-07-04
    • 2017-12-04
    • 2020-09-24
    相关资源
    最近更新 更多