Flexbox в Chrome-как ограничить размер вложенных элементов? [дубликат]
На этот вопрос уже есть ответ здесь:
В Google Chrome Как заставить элемент, вложенный в элемент flexbox (под" элементом flexbox " я подразумеваю дочерний элемент элемента, стилизованного под display:flex), ограничить его размер размером элемента flexbox, в который он вложен под водой? Например, предположим, что у меня есть следующее:
<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>
Поскольку первый потомок div самого внешнего div имеет постоянную высоту, он заканчивается ровно 60px высотой, а поскольку второй потомок div имеет flex-grow 1, он получает оставшуюся часть доступного пространства (в этом случае 100% видового экрана минус 60px). Я могу подтвердить, что размеры этого элемента в соответствии с Inspect Element достаточно велики, чтобы занять все остальное пространство видового экрана.
В Firefox и IE11, из-за height:100%, самый внутренний элемент (id="problem-is-here") принимает высоту, вычисленную для его родителя. Поэтому, поскольку он слишком мал для отображения своего содержимого и overflow установлен в auto, он (а не весь body) получает вертикальную полосу прокрутки. Вот чего я хочу.
В Хроме, однако, самый внутренний элемент отображается с достаточной высотой, чтобы содержать все его содержимое, которое является большей высотой, чем его родитель. Таким образом, поскольку его родитель имеет
overflow:hidden, не появляется полоса прокрутки и избыточное содержимое недоступный. Как я могу сказать Chrome, чтобы он отображал этот самый внутренний элемент с высотой, не превышающей высоту его родителя, если родительская высота определяется flexbox, а не свойством CSS height? Обратите внимание, что я не могу дать ни самому внутреннему div, ни его родителю определенное height значение, так как в приложении, над которым я работаю, количество других членов flexbox может варьироваться.Примечание: я попробовал несколько предложений из других ответов, таких как установка всех элементов иметь min-height:0 вместо auto, или обеспечение того, чтобы flex-basis было установлено в 0, но ни один из них не сработал. См.
Http://plnkr.co/edit/UBRcrNmR5iDbn3EXu6FI?p=preview
Для примера, иллюстрирующего эту проблему. (div с идентификатором heres-the-problem - это тот, высота которого я хочу ограничить высотой его родителя.)
1 ответ:
Во-первых, давайте разберемся с терминологией:
...как заставить элемент, вложенный в элемент flexbox (под" элементом flexbox " я подразумеваю дочерний элемент элемента, стилизованного под
display:flex), ограничить его размер размером элемента flexbox, под которым он вложен?Элемент с
display: flexназываетсяFlex container (технически) илиFlex parent (разговорно).Дочерние элементы контейнера flex называются гибкие элементы . Обратите внимание на слово дети (Первый уровень). Потомки контейнера flex за пределами дочерних элементов не являются элементами flex, и большинство свойств flex к ним неприменимы.
теперь, обращаясь к вашему вопросу:
Проблема в том, что Firefox (и, по-видимому, IE11) имеют иную интерпретацию правила процентной высоты, чем Chrome.В частности, вертикальная полоса прокрутки, которую вы хотите, не отображается в Chrome, потому что вы используете процентные высоты способом, который не соответствует традиционной реализации спецификации .
Другими словами, если вы хотите, чтобы элемент имел процентную высоту, то вы должны указать высоту содержащего блока (т. е. родительского).CSS
heightсвойствоПроцентное соотношение
задает высоту в процентах. Процент рассчитывается по отношению к высоте блока, содержащего сгенерированный блок. Если высота содержащего блока не задана явно и этот элемент не позиционирован абсолютно, то значение вычисляется следующим образом: "авто".Авто
высота зависит от значений других свойств.В вашем коде
body(Уровень 1) имеетheight: 100vh.На один уровень ниже,
.max-flex(Уровень 2) имеетheight: 100%.Четырьмя уровнями ниже,
.large-nested-div(Уровень 4) имеетheight: 100%.Однако на
.variable-flex-content(Уровень 3) нетheightсобственность. Вы определяете высоту с помощьюflex: 1 1 0. Что касается Chrome, то это недостающее звено в цепи и нарушение спецификации. Chrome ожидает увидеть свойствоheight, а когда этого не происходит, он вычисляет высоту доauto.
Chrome vs Firefox (я не тестировал IE11, поэтому не буду упоминать об этом здесь)
Традиционно при вычислении процентных высот браузеры интерпретировали использование спецификации термина "высота" как означающее значение свойства
Однако в последнее время, как отмечалось в этом вопросе и еще в одном и еще в одном, Firefox расширил свою интерпретацию, приняв также высотыheight. Его можно было бы так же легко интерпретировать как высоту (общий термин), но требование свойстваheightстало преобладающей реализацией. Я никогда не видел, чтобыmin-heightилиmax-heightработали на родителя, когда дело касается процентных высот.flex.Непонятно, какой браузер более уступчив.
Не имеет значения, что определение свойства
heightне обновлялось с 1998 года (CSS2 ).
Решение Проблемы
Вместо определения высоты
.variable-flex-contentс помощьюflex: 1 1 0%попробуйте использоватьheight: 100%илиheight: calc(100% - 60px)или абсолютное позиционирование.
Comments