【问题标题】:CSS – why doesn’t percentage height work? [duplicate]CSS – 为什么百分比高度不起作用? [复制]
【发布时间】:2011-08-05 04:53:44
【问题描述】:

为什么height 的百分比值不起作用,而width 的百分比值却可以?

For example:

<div id="working"></div>
<div id="not-working"></div>
#working{
    width:80%;
    height:140px;
    background:orange;
}
#not-working{
    width:80%;
    height:30%;
    background:green;
}

#working 的宽度最终为视口的 80%,但#not-working 的高度最终为 0。

【问题讨论】:

  • 不是专家,但我想这与您将要上下滚动网页而不是横向滚动的假设有关...
  • 这里有一个简单而清晰的 CSS height 属性的解释和百分比值:stackoverflow.com/a/31728799/3597276

标签: css height width


【解决方案1】:

另一种选择是将样式添加到 div

<div style="position: absolute; height:somePercentage%; overflow:auto(or other overflow value)">
 //to be scrolled 
</div>

这意味着一个元素是相对于最近的定位祖先定位的。

【讨论】:

  • 感谢为我工作 :)
【解决方案2】:

height 属性中的百分比值有点复杂,widthheight 属性实际上彼此不同。 让我带您了解一下规格。

height属性:

我们来看看what CSS Snapshot 2010 spec says about height

百分比是根据生成框的包含块的高度计算的。如果包含块的高度没有明确指定(即,它取决于内容高度),并且该元素不是绝对定位的,则该值计算为“自动”。根元素上的百分比高度相对于初始包含块。注意:对于包含块基于块级元素的绝对定位元素,百分比是相对于该元素的填充框高度计算的。

好的,让我们一步一步地分解:

百分比是根据生成框的包含块的高度计算的。

containing block 是什么?有点复杂,但是对于默认static位置的普通元素来说,就是:

最近的块容器祖先盒

或英文,它的父框。 (很值得知道fixedabsolute 的职位是什么,但我忽略了这一点,以保持这个答案简短。)

所以举这两个例子:

<div   id="a"  style="width: 100px; height: 200px; background-color: orange">
  <div id="aa" style="width: 100px; height: 50%;   background-color: blue"></div>
</div>

<div   id="b"  style="width: 100px;              background-color: orange">
  <div id="bb" style="width: 100px; height: 50%; background-color: blue"></div>
</div>

在本例中,#aa 的包含块是 #a#b#bb 以此类推。到目前为止,一切顺利。

height 规范的下一句是我在此答案的介绍中提到的复杂性:

如果包含块的高度没有明确指定(即,它取决于内容高度),并且该元素不是绝对定位的,该值计算为'auto'。

啊哈!是否明确指定包含块的高度很重要!

  • height:200px 的 50% 在#aa 的情况下为 100px
  • height:auto 的 50% 是 auto,在 #bb 的情况下为 0px,因为 auto 没有内容可以展开到

正如规范所说,包含块是否被绝对定位也很重要,但让我们继续讨论width

width属性:

那么width 的工作方式是否相同?一起来看看the spec

百分比是根据生成框的包含块的宽度计算的。

看看这些熟悉的例子,从前面的调整到改变width而不是height

<div   id="c"  style="width: 200px; height: 100px; background-color: orange">
  <div id="cc" style="width: 50%;   height: 100px; background-color: blue"></div>
</div>

<div   id="d"  style="            height: 100px; background-color: orange">
  <div id="dd" style="width: 50%; height: 100px; background-color: blue"></div>
</div>
  • width:200px 的 50% 在#cc 的情况下为 100px
  • width:auto 的 50% 是 width:auto 最终结果的 50%,与 height 不同,没有特殊规则可以区别对待这种情况。

现在,这里有个棘手的问题:auto 表示不同的东西,部分取决于它是为width 还是height 指定的!对于height,它仅表示适合内容所需的高度*,但对于widthauto 实际上更复杂。您可以从代码 sn-p 中看到,在这种情况下,它最终成为视口的宽度。

the spec say about the auto value for width 是什么意思?

宽度取决于其他属性的值。请参阅以下部分。

哇,这没用。为了省去您的麻烦,我为您找到了我们用例的相关部分,标题为“计算宽度和边距”,副标题为 "block-level, non-replaced elements in normal flow"

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

'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = 包含的宽度阻止

好的,所以width 加上相关的边距、边框和填充边框都必须加起来等于包含块的宽度(不是 height 工作方式的后代)。再多说一句:

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

啊哈!所以在这种情况下,width:auto 的 50% 是视口的 50%。希望现在一切都变得有意义了!


脚注

* 至少,在这种情况下它很重要。 spec 好吧,现在一切都变得有意义了。

【讨论】:

  • 如果可能,+10 会给这个“+10”。
  • 很棒的解释-谢谢!我在 id='b' 框中添加了一些字母,以便它实际上有一个高度。 box id='bb' 的高度仍然为 0 - 为什么?不应该是box id='b'的内容高度的一半吗?
  • @Adam 对于高度,#bb 的高度是 auto 的 50%,和 auto 一样,因为 #bb 里面什么都没有,所以等于 0。事实上,#b父母最终有一个高度并不会改变它的高度是自动的事实。
  • "如果 'width' 设置为 'auto',则任何其他 'auto' 值都将变为 '0' 并且 'width' 从结果相等中得出。" .....这句话我真的很困惑,你能澄清一下吗?
  • @Flimm 你能解释一下为什么在弹性项目的孩子上设置% 高度即使在父母没有明确指定高度的情况下也有效?我的意思是,当您在 flex 项中具有 flex 容器、flex 项和内部 div 时 - 当您在该内部 div 上的 % 中设置高度时,它会从 flex 子项继承高度(flex 项的高度是否“设置”并不重要) "到auto)。
【解决方案3】:

我认为你只需要给它一个父容器......即使该容器的高度是以百分比定义的。 这个接缝工作得很好:JSFiddle

html, body { 
    margin: 0; 
    padding: 0; 
    width: 100%; 
    height: 100%;
}
.wrapper { 
    width: 100%; 
    height: 100%; 
}
.container { 
    width: 100%; 
    height: 50%; 
}

【讨论】:

  • 例如,如果您有标题,您也可以这样做来减去像素,否则当您调整窗口大小时,百分比可能会计算错误。高度:计算(100% - 100px);对于较旧的浏览器,请使用: height: -o-calc(100% - 100px); /* 歌剧 / 高度:-webkit-calc(100% - 100px); / google, safari / height: -moz-calc(100% - 100px); / 火狐*/
【解决方案4】:

块元素的高度默认为块内容的高度。所以,给定这样的事情:

<div id="outer">
    <div id="inner">
        <p>Where is pancakes house?</p>
    </div>
</div>

#inner 将增长到足以容纳段落,#outer 将增长到足以容纳#inner

当您将高度或宽度指定为百分比时,这是相对于元素父级的百分比。在宽度的情况下,除非另有说明,否则所有块元素都与它们的父元素一样宽,一直到&lt;html&gt;;因此,块元素的宽度与其内容无关,width: 50% 会产生明确定义的像素数。

但是,块元素的高度取决于其内容,除非您指定特定高度。因此,父母和孩子之间存在关于高度的反馈,并且说height: 50% 不会产生明确定义的值,除非您通过为父元素指定特定高度来打破反馈循环。

【讨论】:

  • 正确且解释清楚。它们之间的区别在于默认情况下,宽度由其父元素的值定义,而高度由其内容的“值”定义。父母的价值与内容的价值
  • 那么有没有办法让高度响应?即 - 您有一排使用 CSS 背景颜色创建的彩色方块,并且您希望这些方块随屏幕调整大小。 jjsFiddle
  • @ChrisM - 根据你想使用它的方式,只需将相等的填充设置为你想要的盒子宽度的一半:jsfiddle.net/en9xyv30/1 如果你想要盒子里的内容,它可能需要绝对定位 - 只需将顶部、右侧、底部和左侧都设置为 0(或者如果您需要一些填充,则设置为 0 以外的相同值)并且内容将与框一起调整大小。
  • 您也可以使用大众单位。 vw 是一个单位,它是视口宽度的百分比。所以,像 height: 10vw;宽度:10vw;将缩放到屏幕宽度并保持正方形。请参阅caniuse.com/#feat=viewport-units 了解浏览器兼容性。
  • 使用vw 单位替换百分比时要小心,因为如果您决定将元素放入另一个容器中,这会让您的生活变得非常困难。
【解决方案5】:

没有内容,高度就没有价值来计算百分比。但是,如果未指定父级,则宽度将从 DOM 中获取百分比。 (使用您的示例)将第二个 div 放在第一个 div 内,将呈现结果...下面的示例...

<div id="working">
  <div id="not-working"></div>
</div>

第二个 div 将是第一个 div 高度的 30%。

【讨论】:

  • 这让我想明白了。我忘记了当你构建你的 react 元素时,你必须将整个 return 包含在一个 div 中。所以我有我的#app div,然后是一个没有 id 的 div,然后是我试图调整大小的 3 个 div...非常感谢大家! :)
【解决方案6】:

你需要给它一个高度的容器。 width 使用视口作为默认宽度

【讨论】:

  • 正确,但另请参阅@mu 的答案以了解原因。
猜你喜欢
  • 2013-05-14
  • 2014-10-16
  • 2015-10-22
  • 2015-09-29
  • 2019-09-30
  • 1970-01-01
相关资源
最近更新 更多