¿Por qué el DOCTYPE HTML5 se mete con mi relleno?


Tengo una página html5 con una barra de navegación. Totalmente codificado. Recientemente agregué un doctype al elemento, y ahora estoy obteniendo espacio adicional debajo de mi barra de navegación. Si elimino la declaración doctype, vuelve a la normalidad. He restablecido completamente el relleno, los márgenes, etc. en todo, y reducirlo a una pequeña cantidad de código que ilustra el problema.

La página se puede ver en http://hackthetruth.org/webdesign/broken

¿alguien sabe por qué declarar la doctype está jugando con la altura de un div?

Author: skaffman, 2010-06-09

8 answers

Esta es una consideración interesante y sutil, pero importante cuando se usa inline-block.

La respuesta corta es: establece vertical-align en tu ul a cualquier otra cosa que no sea baseline.

La razón por la que esto funciona es que los bloques en línea se consideran texto, y por lo tanto están sujetos a propiedades basadas en texto como line-height y vertical-align.


La respuesta más larga es la siguiente:

La especificación CSS3 entra en cierta profundidad (quizás confusa) en torno a cómo el modelo de caja obrar. Aquí hay una cita de la especificación de caja CSS3, en la que he destacado la parte que es relevante para este problema:

9.5. "Bloque en línea" o elementos flotantes, no sustituidos

... El valor utilizado de height es el valor calculado, a menos que sea 'auto', cuando el valor utilizado está definido por " 'Auto' alturas para flow roots."

Vamos a comprobar cuáles son las alturas automáticas para las raíces de flujo:

9.10. Alturas 'Auto' para raíces de flujo

En ciertos casos (ver las secciones anteriores), la altura de un el elemento se calcula de la siguiente manera:

  • Si solo tiene hijos de nivel en línea, la altura es la distancia entre la parte superior de la caja de línea superior y la parte inferior de la caja de línea inferior.

...

Las partes de la caja de línea son de interés. Lo que esto implica efectivamente es que cualquier cosa establecida para mostrarse como bloque en línea está sujeta a los diseños de caja implícitos que usa el texto plano.

Es posible que pueda adivinar ahora por qué configurar vertical-align soluciona este problema, pero continuemos rastreando este problema a través de la especificación.

El line-box la definición es un poco mediocre, y el ejemplo en sección 4.2 es solo marginalmente útil.

Volvamos a la especificación CSS 2.1, que hace un trabajo mucho más agradable en explicando los cuadros de línea :

El área rectangular que contiene las cajas que forman una línea se llama caja de línea ... [su altura] está determinada por las reglas dadas en la sección sobre cálculos de altura de línea.

De esta explicación, vemos que las propiedades line-height y vertical-align tienen algo que ver con cómo se calculan las alturas (de los cuadros de línea, por lo tanto, los elementos de bloque en línea). La lectura de los cálculos de la altura de línea casi lo deja claro:

{En caso de que [los recuadros de línea] estén alineados 'arriba' o 'abajo', deben estar alineados para minimizar el recuadros de línea altura.

Así que la altura de nuestro elemento de bloque en línea está siendo afectada por los cálculos de altura de su caja de línea implícita, que a su vez están sujetos a estos cálculos de alineación vertical.

Así que parecería que cuando no usamos baseline como una alineación vertical para un bloque en línea, la caja de línea implícita de la caja se reducirá al tamaño más pequeño que pueda.

Confuso? ...Sí. Simplemente regresa a la respuesta más corta:)

 27
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-23 23:37:14

Tuve el mismo problema con uno de mis sitios. encontré esta respuesta aquí :

"Con un doctype HTML5, las imágenes reciben lo que parece ser el atributo line-height que normalmente recibe el texto, y por lo tanto se obtiene un "margen" debajo de ellas. Puede configurarlos para mostrar: block o line-height: 0, aunque no he probado este último lo suficiente como para estar seguro de que es una buena solución."

Apliqué el line-height:0 al <div> que contenía las imágenes de navegación. Hizo el truco para me.

 44
Author: eamo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-28 18:00:10

Es porque el DOCTYPE cambia el modo de renderizado al Modo de Cumplimiento de Estándares. Específicamente, esto significa que está utilizando el modelo de caja W3C ahora que calcula el ancho / alto para los elementos de bloque de manera diferente que el modo quirks.

Leer más aquí, aquí, y aquí.

 10
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-09 04:16:55

Prueba este:

Css:

html * { margin:0; padding:0; }
 2
Author: Walter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-20 07:44:26

Tuve el mismo problema al actualizar un sitio web XHTML4 a HTML5. Tenía muchos de estos:

<a><img></a>

Que terminó con el relleno extra mágico alrededor de las imágenes. Para mí la solución era simple add añadir este css:

img { vertical-align: top; }
 1
Author: GeekyMonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-14 16:36:50

Mate tienes 2 etiquetas callejeras </div> en esa página. En las líneas 32 y 34. Borrar y volver a intentar. A ver si eso lo arregla.

 0
Author: Strelok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-06 00:26:00

Nunca he usado display: inline-block debido a los problemas de IE7, así que no estoy familiarizado con sus peculiaridades. Parece que no es necesario aplicarlo a ul#pagetab en su situación, ya que no está rodeado de elementos en línea. Simplemente lo convertiría en un elemento de bloque normal. Además, dado que contiene elementos flotantes que no necesitan flotar junto a algunos elementos en línea, simplemente daría ul#pagetab una altura real a través de display: block; overflow: hidden;.

Esto parece resolver todos sus problemas (que no puedo explicar en detalle) y proporciona estilos estilísticamente más apropiados.

 0
Author: Steven Xu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-11 13:34:34

Wow. @ matt tiene razón (no en este caso) y eso es conocimiento general, pero todos están equivocados.

Amigo mira @ tu css, tienes

Pagetab {background-color: #ff2d00; padding: 0px 4px; margin: 0; display: inline-block;}

Pagetab ul {list-style: none; margin: 0px; padding: 0px 4px; display: block;}

Para .....

De modo que la segunda declaración está en ul anidada que se producen en #pagetab. no tienes nada de eso.

Tomé la ul de la declaración para que estén en el elemento correcto. ahora su css tiene 2 estilos que coinciden con ambos (y también se llaman en su selector universal (fyi, que va por encima de su declaración body {})) por lo que son 3 estilos....overkill dude. además, los que no coinciden, lo configura para mostrar: inline-block y luego lo restablece a block...estoy perdido en esta lógica.

SO toma tu ejemplo. cambiar dos estilos de pagetab a esto

Pagetab {

background-color: #ff2d00;
padding: 0px 4px;
margin: 0;

}

Pagetab {

list-style: none;
margin: 0px;
padding: 0px 4px;
display: block;

}

Guárdalo. ahora quítatelo, guárdalo como #2. en FF3. 6 sobre 7 son los mismos.

Si utilizara los validadores que se proporcionan específicamente para resolver/prevenir problemas como este, así como las herramientas de control de calidad (específicamente aquí estoy hablando de los selectores dust-me bookmarklet) resolvería esto en poco tiempo.

De vuelta a los estándares web, gen ed css: * {} es universal, por lo que mientras otra declaración no anule la especificidad de*, lo hará siempre funciona. en inglés, si declara * {margin:0; padding:0; border:none} en la parte superior de su página, no tiene que poner margin:0; padding: 0; en cada elemento. ya lo has hecho.

Los estándares web, te salvarán la vida.

 -2
Author: albert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-31 08:22:31