Las alturas se representan de manera diferente en Chrome y Firefox [duplicado]
Descubrí que si configuramos un elemento a nivel de bloque con height:auto
o height: 0~100%
sin configurar la altura del padre con un valor explícito, y su hijo a nivel de bloque tiene un margen inferior, entonces calculará la altura de manera diferente en Chrome, pero no en Firefox. Para el caso que establece 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>
La altura del div
bloque se calculará como margin-bottom + content height of p element
. Estoy confundido acerca de por qué height: 1%
debería calcularse auto
porque los elementos principales ( html
y body
la etiqueta) no establecen su altura explícitamente, sino que tienen una altura diferente, ya que simplemente configuramos la altura directamenteauto
.
Si lo configuramos directamente en height: auto
, claramente solo establecerá la altura como la altura de su elemento secundario a nivel de bloque, que no incluye su margen inferior.
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>
He leído la especificación CSS 2.1 y pienso que mi pregunta podría estar cubierta con el tema de propiedad de altura y colapso de margen, pero todavía no puedo entender por qué se comporta de manera diferente en la versión de Chrome. 47.0.2526, aunque Firefox ver. 44.0.2 mostrará la altura con el mismo valor.
Referencias enumeradas:
https://www.w3.org/TR/CSS2/visudet.html#the-height-property
10,5: porcentaje
... Si la altura del bloque contenedor no se especifica explícitamente (es decir, depende de la altura del contenido) y este elemento no está en una posición absoluta, el valor se calcula como 'automático'. ...
10.6.3: Elementos no reemplazados a nivel de bloque en flujo normal cuando
overflow
se calcula envisible
.... si 'altura' es 'automática', la altura depende de si el elemento tiene hijos a nivel de bloque y si tiene relleno o bordes:
La altura del elemento es la distancia desde el borde superior del contenido hasta el primero aplicable de lo siguiente:
- el borde inferior del cuadro de la última línea, si el cuadro establece un contexto de formato en línea con una o más líneas
- el borde inferior del margen inferior (posiblemente colapsado) de su último hijo de flujo entrante, si el margen inferior del hijo no colapsa con el margen inferior del elemento
- el borde inferior del último elemento secundario cuyo margen superior no colapsa con el margen inferior del elemento
- cero, de lo contrario
https://www.w3.org/TR/2011/REC-CSS2-20110607/box.html#collapsing-margins
8.3.1 colapso de márgenes.
El margen superior de un elemento de bloque de flujo entrante se colapsa con el margen superior de su primer elemento secundario a nivel de bloque de flujo entrante si el elemento no tiene borde superior ni relleno superior y el elemento secundario no tiene espacio libre.
El margen inferior de un cuadro de bloque de flujo de entrada con una 'altura' de 'auto' y una 'altura mínima' de cero colapsa con el margen inferior del último bloque de flujo de entrada secundario si el cuadro no tiene relleno inferior ni borde inferior y el margen inferior del niño no colapsa con un margen superior que tiene espacio libre.
... Si los márgenes superior e inferior de un cuadro están contiguos, es posible que los márgenes colapsen a través de él. En este caso, la posición del elemento depende de su relación con los demás elementos cuyos márgenes se están colapsando.
- Si los márgenes del elemento se contraen con el margen superior de su elemento principal, el borde superior del cuadro se define como el mismo que el del elemento principal.
- De lo contrario, el elemento principal del elemento no participa en el colapso del margen o solo está involucrado el margen inferior del elemento. La posición del borde superior del elemento es la misma que habría sido si el elemento tuviera un borde inferior distinto de cero.
Primero, tenemos los estándares W3C, que son un conjunto de pautas para los fabricantes de navegadores.
Y luego están los fabricantes de navegadores, que son libres de hacer lo que quieran (como lo demuestra el historial de desviaciones de Internet Explorer).
En particular, con las alturas porcentuales de CSS, existen claras diferencias de comportamiento entre los navegadores.
Has publicado un ejemplo. Aquí está otro:
Alturas porcentuales en Flexbox: Chrome/Safari vs Firefox/IE
Cuando se trabaja con flexbox, Chrome y Safari resuelven las alturas porcentuales de los elementos flexibles en función del valor de la height
propiedad principal. Firefox e IE11/Edge priorizan la altura flexible de los padres.
Parece que los navegadores Webkit se adhieren a una interpretación más tradicional de la especificación:
height
propiedad CSSporcentaje
Especifica un porcentaje de altura. El porcentaje se calcula con respecto a la altura del bloque contenedor del cuadro generado. Si la altura del bloque contenedor no se especifica explícitamente y este elemento no está en una posición absoluta, el valor se calcula como "automático".auto
La altura depende de los valores de otras propiedades.
En otras palabras, para que el porcentaje de altura funcione en un hijo entrante, el padre debe tener una altura establecida.
Ésa es la interpretación tradicional de la especificación: el término "altura" significa el valor de la height
propiedad. Mi propia opinión es que este lenguaje es vago y abierto a interpretación, pero el height
requisito de propiedad se ha convertido en la implementación predominante. Nunca he visto min-height
ni max-height
trabajado con un padre cuando se trata de valores porcentuales.
Sin embargo, recientemente, Firefox e IE han ampliado su interpretación para aceptar también alturas flexibles.
Ejemplos de Firefox e IE que utilizan la altura flexible de un padre como referencia para el porcentaje de altura de un niño:
- Chrome ignora la base flexible en el diseño de columnas
- Chrome/Safari no llena el 100% de la altura del padre flexible
- La altura no es correcta en los elementos de flexbox en Chrome
- Flexbox en Chrome: ¿Cómo limitar el tamaño de los elementos anidados?
Saber qué navegadores cumplen con la especificación es un poco difícil porque, como mencioné antes, el lenguaje de la especificación parece vago y abierto a interpretación.
Dado que la última actualización de esta parte de la definición se realizó en 1998 ( CSS2 ) y la llegada de nuevas formas de altura como la altura flexible, parece que hace mucho que se necesita una actualización.
Creo que es justo decir que cuando se trata de alturas porcentuales, hasta que se actualice la definición de especificaciones, se pueden esperar diferencias de representación entre los navegadores.
Soluciones alternativas
Aquí hay dos alternativas a considerar cuando se desea que un elemento secundario ocupe la altura completa del elemento principal.
Aplicar
display: flex
a los padres. Esto establece automáticamentealign-items: stretch
, lo que le indica al niño que expanda la altura total disponible del padre.Aplicar
position: relative
sobre los padres yposition: absolute; height: 100%; width: 100%
sobre el niño. Con posicionamiento absoluto, una altura porcentual funcionará sin una altura especificada en el padre.