Chrome中的Flexbox - 如何限制嵌套元素的大小? [英] Flexbox in Chrome--How to limit size of nested elements?

查看:113
本文介绍了Chrome中的Flexbox - 如何限制嵌套元素的大小?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Google Chrome中,如何强制嵌套在flexbox成员内部的元素(通过flexbox成员我的意思是用 display:flex )将其大小限制为嵌套在其下的flexbox成员的大小?例如,假设我有以下:

 < div style =display:flex; flex-direction:column; height :100vh; 
< div style =height:60px;>静态标头< / div>
< div style =flex:1 1 0; overflow:hidden;>
< div style =overflow:auto; height:100%; id =problem-is-here>
很多很多内容,方式太多,不适合在视口
< / div>
< / div>
< / div>

因为第一个子 div div 有一个常数高度,它的高度正好为60像素,因为第二个子 div 有一个 flex-grow 为1,它获得剩余的可用空间(在这种情况下,100%的视口减去60px)。



在Firefox和IE11中,由于<$ p> c $ c> height:100%,最内层的元素( id =problem-is-here父母。因此,由于它太小,无法显示其内容,并且 overflow 设置为 auto body )获取垂直滚动条。这是我想要的。



然而,在Chrome中,最内层的元素呈现的高度足以包含其所有内容,其高度大于其父元素。因此,因为其父项具有 overflow:hidden ,则不会出现滚动条,并且无法访问多余的内容。当父高度由flexbox而不是CSS height 属性决定时,如何让Chrome渲染这个最内层元素的高度至多等于其父元素的高度?请注意,我不能给最内层的 div 或其父体定义 height



注意:我已经尝试过其他答案的一些建议,例如将所有元素设置为 min-height:0 而不是 auto ,或确保 flex-basis 设置为 0 ,但这些都没有工作。请参阅



http://plnkr.co / edit / UBRcrNmR5iDbn3EXu6FI?p =预览



以示例说明问题。 ( div 与id heres-the-problem 是我想要的高度限制为其父。)

解决方案

首先,我们来处理这个术语: p>


...如何强制嵌套在flexbox成员内部的元素(通过flexbox的成员我的意思是用 display:flex )样式的元素将其大小限制为嵌套在其下的flexbox成员的大小?


具有 display:flex 的元素称为 flex容器(技术上) / strong>(通俗地)。



flex容器的子项称为 flex项。请注意单词 children (第一级)。






strong> 现在,解决您的问题:



问题是Firefox(显然IE11)



具体来说,您所需的垂直滚动条不会在Chrome中呈现,因为您使用的百分比高度不符合传统实施规范


CSS height 属性



>指定百分比高度。相对于生成的框的包含块的高度计算百分比。如果未明确指定包含块的高度,且该元素未绝对定位,则该值计算为auto。



自动
高度取决于其他属性的值。


换句话说,如果您希望元素具有百分比高度,



在你的代码中, body (级别1)具有 height:100vh



一级向下, .max-flex (级别2)具有 height:100 %



四层以下, .large-nested-div :100%。



但是,在 .variable-flex-content 3),没有 height 属性。您正在使用 flex:1 1 0 定义高度。就Chrome而言,这是链中缺少的链接,违反了规范。 Chrome希望看到 height 属性,如果没有,则计算高度 auto






Chrome vs Firefox 所以我不会在这里提到它)



传统上,当计算百分比高度时,浏览器解释规范使用的术语高度的意思是 height 属性。它可以很容易地解释为高度(通用术语),但 height 属性要求已成为主要的实现。在处理百分比高度时,我从未见过 min-height max-height p>

但是,最近,如本问题和另一个中所述, 另一个,Firefox已扩展其解释以接受 flex 高度,



不清楚哪个浏览器更符合规范。



height 属性定义自1998年以来未更新( CSS2 )。






解决方案 >



而不是使用 flex定义 .variable-flex-content 的高度: 1 1 0%,尝试使用 height:100% height:calc(100% - 60px) c $ c>或绝对定位


In Google Chrome, how do I force an element nested inside of a member of a flexbox (by "member of a flexbox" I mean a child of an element styled with display:flex) to limit its size to the size of the flexbox member it's nested under? For example, suppose I have the following:

<div style="display:flex; flex-direction:column; height:100vh;">
  <div style="height:60px;">Static header</div>
  <div style="flex: 1 1 0; overflow:hidden;">
     <div style="overflow:auto; height:100%;" id="problem-is-here">
       Lots and lots of content, way too much to fit in the viewport
     </div>
  </div>
</div>

Because the first child div of the outermost div has a constant height, it ends up exactly 60px tall, and because the second child div has a flex-grow of 1, it gets the rest of the space available (in this case, 100% of the viewport minus 60px). I can confirm that this element's dimensions according to Inspect Element are just large enough to take up the rest of the viewport space.

In Firefox and IE11, due to the height:100%, the innermost element (id="problem-is-here") takes on the height computed for its parent. Therefore, since it is too small to display its content and overflow is set to auto, it (and not the entire body) gets a vertical scrollbar. This is what I want.

In Chrome, however, the innermost element is rendered with enough height to contain all of its content, which is a larger height than its parent. Thus, because its parent has overflow:hidden, no scrollbar appears and the excess content is inaccessible. How do I tell Chrome to render this innermost element with height at most equal to that of its parent, when the parent height is determined by a flexbox, not a CSS height property? Note that I can't give either the innermost div or its parent a definite height value since in the application I'm working on, the number of other flexbox members can vary.

Note: I have tried a few suggestions from other answers, such as setting all elements to have min-height:0 instead of auto, or ensuring flex-basis is set to 0, but none of these have worked. See

http://plnkr.co/edit/UBRcrNmR5iDbn3EXu6FI?p=preview

for an example that illustrates the problem. (The div with id heres-the-problem is the one whose height I want limited to the height of its parent.)

解决方案

First, let's tackle the terminology:

...how do I force an element nested inside of a member of a flexbox (by "member of a flexbox" I mean a child of an element styled with display:flex) to limit its size to the size of the flexbox member it's nested under?

An element with display: flex is called a flex container (technically) or flex parent (colloquially).

The children of a flex container are called flex items. Note the word children (first-level). Descendents of a flex container beyond the children are not flex items and most flex properties don't apply to them.


Now, addressing your question:

The problem is that Firefox (and apparently IE11) have a different interpretation of the percentage height rule than Chrome.

Specifically, the vertical scrollbar you want is not rendering in Chrome because you're using percentage heights in a way that doesn't conform with the traditional implementation of the spec.

CSS height property

percentage
Specifies a percentage height. The percentage is calculated with respect to the height of the generated box's containing block. If the height of the containing block is not specified explicitly and this element is not absolutely positioned, the value computes to "auto".

auto
The height depends on the values of other properties.

In other words, if you want an element to have a percentage height, then you must specify a height on the containing block (i.e. the parent).

In your code, body (level 1) has height: 100vh.

One level down, .max-flex (level 2) has height: 100%.

Four levels down, .large-nested-div (level 4) has height: 100%.

However, at .variable-flex-content (level 3), there is no height property. You are defining the height with flex: 1 1 0. As far as Chrome is concerned, this is a missing link in the chain and a violation of the spec. Chrome is expecting to see the height property, and when it doesn't, it computes the height to auto.


Chrome vs Firefox (I haven't tested IE11, so I won't mention it here)

Traditionally, when calculating percentage heights, browsers have interpreted the spec's use of the term "height" to mean the value of the height property. It could just as easily be interpreted as a height (generic term), but the height property requirement has become the predominant implementation. I've never seen min-height or max-height work on a parent when dealing with percentage heights.

Recently, however, as noted in this question and another one and another one, Firefox has broadened its interpretation to accept flex heights, as well.

It's not clear which browser is more compliant.

It doesn't help matters that the height property definition hasn't been updated since 1998 (CSS2).


The Solution

Instead of defining the height of .variable-flex-content with flex: 1 1 0%, try using height: 100% or height: calc(100% - 60px) or absolute positioning.

这篇关于Chrome中的Flexbox - 如何限制嵌套元素的大小?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆