Высота рендеринга по-разному в Chrome и Firefox [дубликат]
этот вопрос уже есть ответ здесь:
я нашел, если мы установили элемент уровня блока с height:auto
или height: 0~100%
без настройки высоты родителя с явным значением, а его дочерний уровень блока имеет нижнее поле, тогда он будет вычислять высота по-разному в Chrome, но не в Firefox. Для случая, который установлен height: 1%
:
http://codepen.io/anon/pen/BjgKMR
html {
background: pink;
}
body {
background: yellow;
}
div {
height: 1%;
}
inner {
margin-bottom: 30px;
margin-top: 20px;
}
<div>
<p class="inner">block level element</p>
</div>
высота div
блок будет рассчитываться как margin-bottom + content height of p element
. Я смущен почему height: 1%
должно быть вычислено как к auto
потому что родительские элементы(html
и body
tag) не устанавливает свою высоту явно, но имеет разную высоту, поскольку мы просто непосредственно установите высоту в auto
?
если мы непосредственно установить его в height: auto
, он будет явно просто установить высоту в качестве высоты дочернего элемента уровня блока, который не включает его нижний край.
html {
background: pink;
}
body {
background: yellow;
}
div {
height: auto;
}
inner {
margin-bottom: 30px;
margin-top: 20px;
}
<div><p class="inner">block level element</p></div>
я прочитал спецификацию CSS 2.1 и думаю о том, что мой вопрос может быть покрыт темой height property и margin collapse, но все еще не могу понять, почему он ведет себя по-другому в Chrome ver. 47.0.2526, хотя Firefox ver. 44.0.2 отобразит высоту с тем же значением.
перечисленный references:
https://www.w3.org/TR/CSS2/visudet.html#the-height-property
-
10.5: процент
... Если высота содержащего блока не указана явно (т. е. зависит от высоты содержимого), и этот элемент не расположен абсолютно, значение вычисляется как "авто". ...
-
10.6.3: не-замененные элементы блок-уровня в нормальной подаче когда
overflow
равенvisible
.... если "высота" является "авто", высота зависит от того, имеет ли элемент дочерние элементы уровня блока и имеет ли он заполнение или границы:
высота элемента-это расстояние от его верхнего края содержимого до первая применимо следующее:
- в нижний край поля последней строки, если поле устанавливает встроенный контекст форматирования с одной или несколькими строками
- нижний край нижнего (возможно, свернутого) края последнего дочернего элемента в потоке, если нижнее поле дочернего элемента не свернуто с нижним полем элемента
- нижний край границы последнего дочернего элемента в потоке, верхнее поле которого не коллапсирует с нижним полем элемента
- ноль, в противном случае
https://www.w3.org/TR/2011/REC-CSS2-20110607/box.html#collapsing-margins
-
8.3.1 сворачивание поля.
верхний край элемента блока в потоке сворачивается с его первым в потоке блоком на уровне верхнего поля ребенка, если элемент не имеет верхней границы, без верхнего заполнения, и ребенок не имеет зазора.
нижний край блок-бокса в потоке с "высота ""авто" и "мин-высота" нуля рушится с его последним в потоке блок-уровня нижнего поля ребенка, если коробка не имеет нижней прокладки и нижней границы, а нижнее поле ребенка не рушится с верхним полем, которое имеет зазор.
... Если верхнее и нижнее поля коробки примыкают друг к другу, то возможно, что поля свернутся через него. В этом случае положение элемента зависит от его связи с другими элементами, поля которых разваливаются.
- если поля элемента свернуты с верхним полем его родителя, верхний край границы поля определяется как тот же, что и у родителя.
- в противном случае либо родитель элемента не участвует в свертывании поля, либо задействовано только нижнее поле родителя. Положение верхнего края границы элемента такое же, как если бы элемент имел ненулевую нижнюю границу.
1 ответов
Итак, сначала у вас есть стандарты W3C, которые представляют собой набор рекомендаций для разработчиков браузеров.
и тогда у вас есть создатели браузера, которые могут делать все, что хотят (о чем свидетельствует история отклонений от Internet Explorer).
в частности, с процентными высотами CSS существуют четкие различия в поведении между браузерами.
вы опубликовали один пример. Вот еще:
процентные высоты в Flexbox: Chrome / Safari vs Firefox / IE
при работе с flexbox, Chrome и Safari разрешают процентные высоты для элементов flex на основе значения родительского height
собственность. Firefox и IE11/Edge определяют приоритет высоты flex родителя.
похоже, браузеры Webkit придерживаются более традиционной интерпретации спецификации:
процент
Задает процентную высоту. Процент рассчитывается относительно высоты содержащего блока генерируемого бокса. Если высота содержащего блока не указана явно и этот элемент не расположен абсолютно, значение вычисляется в "auto".авто
высота зависит от значений других свойств.
другими словами, для процентной высоты для работы с дочерним элементом в потоке родитель должен иметь установить высоту.
это традиционная интерпретация спецификации: термин "высота" означает значение height
собственность. Мое собственное мнение заключается в том, что этот язык расплывчат и открыт для интерпретации, но height
требование к собственности стало преобладающей реализацией. Я никогда не видел min-height
или max-height
работа с родителем при работе с процентными значениями.
недавно, однако, Firefox и IE расширили свою интерпретацию, чтобы принять высоты flex, также.
примеры Firefox и IE, использующие высоту flex родителя в качестве ссылки для высоты процента ребенка:
- Chrome игнорирует flex-basis в макете столбца
- Chrome / Safari не заполняет 100% высоту Flex parent
- Высота неправильна в элементах flexbox в Chrome
- Flexbox в Chrome--как ограничить размер вложенных стихии?
знать, какие браузеры соответствуют спецификации, немного сложно, потому что, как я упоминал ранее, язык спецификации кажется расплывчатым и открытым для интерпретации.
С последним обновлением этой части определения в 1998 году (в CSS2), и появление новых форм высоты, таких как flex height, обновление кажется давно назревшим.
Я думаю, что это справедливо сказать, что, когда дело доходит до процентных высот, до тех пор, пока определение спецификации не получит обновление, вы можете ожидать различий в визуализации между браузерами.
Альтернативные Решения
вот две альтернативы для рассмотрения при желании дочернего элемента принять полный рост родителя.
применить
display: flex
родителя. Это автоматически устанавливаетalign-items: stretch
, который говорит ребенку, чтобы расширить полную высоту.применить
position: relative
on родитель иposition: absolute; height: 100%; width: 100%
на ребенка. При абсолютном позиционировании процентная высота будет работать без указанной высоты на родителе.