Высота рендеринга по-разному в 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.

    ... если "высота" является "авто", высота зависит от того, имеет ли элемент дочерние элементы уровня блока и имеет ли он заполнение или границы:

    высота элемента-это расстояние от его верхнего края содержимого до первая применимо следующее:

    1. в нижний край поля последней строки, если поле устанавливает встроенный контекст форматирования с одной или несколькими строками
    2. нижний край нижнего (возможно, свернутого) края последнего дочернего элемента в потоке, если нижнее поле дочернего элемента не свернуто с нижним полем элемента
    3. нижний край границы последнего дочернего элемента в потоке, верхнее поле которого не коллапсирует с нижним полем элемента
    4. ноль, в противном случае

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 придерживаются более традиционной интерпретации спецификации:

в CSS height свойства

процент
Задает процентную высоту. Процент рассчитывается относительно высоты содержащего блока генерируемого бокса. Если высота содержащего блока не указана явно и этот элемент не расположен абсолютно, значение вычисляется в "auto".

авто
высота зависит от значений других свойств.

другими словами, для процентной высоты для работы с дочерним элементом в потоке родитель должен иметь установить высоту.

это традиционная интерпретация спецификации: термин "высота" означает значение height собственность. Мое собственное мнение заключается в том, что этот язык расплывчат и открыт для интерпретации, но height требование к собственности стало преобладающей реализацией. Я никогда не видел min-height или max-height работа с родителем при работе с процентными значениями.

недавно, однако, Firefox и IE расширили свою интерпретацию, чтобы принять высоты flex, также.

примеры Firefox и IE, использующие высоту flex родителя в качестве ссылки для высоты процента ребенка:

знать, какие браузеры соответствуют спецификации, немного сложно, потому что, как я упоминал ранее, язык спецификации кажется расплывчатым и открытым для интерпретации.

С последним обновлением этой части определения в 1998 году (в CSS2), и появление новых форм высоты, таких как flex height, обновление кажется давно назревшим.

Я думаю, что это справедливо сказать, что, когда дело доходит до процентных высот, до тех пор, пока определение спецификации не получит обновление, вы можете ожидать различий в визуализации между браузерами.


Альтернативные Решения

вот две альтернативы для рассмотрения при желании дочернего элемента принять полный рост родителя.

  1. применить display: flex родителя. Это автоматически устанавливает align-items: stretch, который говорит ребенку, чтобы расширить полную высоту.

  2. применить position: relative on родитель и position: absolute; height: 100%; width: 100% на ребенка. При абсолютном позиционировании процентная высота будет работать без указанной высоты на родителе.