2009-04-14 11 views
39

Sé que es incorrecto poner un elemento de bloque dentro de un elemento en línea, pero ¿qué pasa con lo siguiente?¿Es incorrecto cambiar un elemento de bloque a en línea con CSS si contiene otro elemento de bloque?

Imagínese esta marcado válido:

<div><p>This is a paragraph</p></div> 

Ahora agregue este CSS:

div { 
    display:inline; 
} 

Esto crea una situación en la que un elemento en línea contiene un elemento de bloque (el div se convierte en línea y el p es el bloque de forma predeterminada)

¿Los elementos de la página siguen siendo válidos?

¿Cómo y cuándo juzgamos si el HTML es válido, antes o después de aplicar las reglas de CSS?

ACTUALIZACIÓN: ya he aprendido que en HTML5 es perfectamente válida para poner elementos de bloque dentro de las etiquetas de enlace por ejemplo:

<a href="#"> 
     <h1>Heading</h1> 
     <p>Paragraph.</p> 
</a> 

Esto es realmente muy útil si se desea un gran bloque de HTML ser un enlace

+2

Me alegra que html5 considere que este código sea válido, pero válido no es el final de toda la web. The Googles usa un código que parece una sopa de etiqueta horriblemente rota, pero funciona. – JKirchartz

Respuesta

22

Desde el CSS 2.1 Spec:

Cuando una caja de línea contiene una caja a nivel de bloque de flujo de entrada, la caja de línea (y sus ancestros en línea dentro de la misma caja de línea) se rompen alrededor de la caja a nivel de bloque (y cualquier hermano de nivel de bloque que sea consecutivo o separado solo por espacios en blanco plegables y/o elementos de falta de flujo), dividiendo el cuadro en línea en dos cuadros (incluso si alguno de los lados está vacío), uno a cada lado del bloque caja (s) de nivel Los recuadros de línea antes del descanso y después del descanso están encerrados en recuadros de bloques anónimos, y el recuadro de nivel de bloque se convierte en un hermano de esos recuadros anónimos. Cuando una casilla en línea de este tipo se ve afectada por el posicionamiento relativo, cualquier traducción resultante también afecta al cuadro de nivel de bloque contenido en la casilla en línea.

Este modelo se aplicaría en el siguiente ejemplo si las siguientes reglas:

p { display: inline } 
span { display: block } 

Se han usado con este documento HTML:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 
<HEAD> 
    <TITLE>Anonymous text interrupted by a block</TITLE> 
</HEAD> 
    <BODY> 
    <P> 
     This is anonymous text before the SPAN. 
     <SPAN>This is the content of SPAN.</SPAN> 
     This is anonymous text after the SPAN. 
    </P> 
    </BODY> 

El elemento P contiene un trozo (C1) de texto anónimo seguido de un elemento de nivel de bloque seguido de otro fragmento (C2) de texto anónimo. Los cuadros resultantes serían un cuadro de bloque que representa el CUERPO, que contiene un cuadro de bloque anónimo alrededor de C1, el cuadro de bloque SPAN y otro cuadro de bloque anónimo alrededor de C2.

Las propiedades de las carpetas anónimas se heredan de la casilla no anónima adjunta (por ejemplo, en el ejemplo justo debajo del encabezado de la subsección "Cuadros de bloque anónimos", el de DIV). Las propiedades no heredadas tienen su valor inicial. Por ejemplo, la fuente de la casilla anónima se hereda de DIV, pero los márgenes serán 0.

Las propiedades establecidas en los elementos que provocan que se generen cuadros de bloque anónimos aún se aplican a las casillas y el contenido de ese elemento. Por ejemplo, si se ha establecido un borde en el elemento P en el ejemplo anterior, el borde se dibujará alrededor de C1 (abierto al final de la línea) y C2 (abierto al comienzo de la línea).

Algunos agentes de usuario han implementado bordes en líneas que contienen bloques de otras maneras, por ejemplo, envolviendo dichos bloques anidados dentro de "casillas de líneas anónimas" y dibujando así bordes en línea alrededor de dichos cuadros. Como CSS1 y CSS2 no definieron este comportamiento, los agentes de usuario solo de CSS1 y CSS2 pueden implementar este modelo alternativo y aún reclamar conformidad con esta parte de CSS 2.1. Esto no se aplica a los UA desarrollados después de que se publicó esta especificación.

Haga de eso lo que quiera. Claramente, el comportamiento se especifica en CSS, aunque no está claro si cubre todos los casos o si se implementa de manera consistente en todos los navegadores.

+0

Solo por aclaración, me parece que no está mal sino que es parte de la especificación css que 'puedes'. Se requiere trabajo adicional en el navegador para crear bloques anónimos. También no es coherente en todos los navegadores web. – Chad

-1

Creo que (x) html es válido, css es válido. Es el resultado valido? Sí, si está buscando en el navegador como lo desea.

+0

El problema con el uso de navegadores para validar el código es que necesita volver a validar la página para cada nueva versión de cada navegador en cada sistema donde desea que la página funcione ... – Guffa

+0

Sí, eso es un problema real, lo sé. El navegador no es validador :) Y creo que la pregunta sobre la validación de HTML + CSS es una cuestión de gusto. Factor humano. –

15

Independientemente de si es válido o no, la estructura del elemento es incorrecta. La razón por la que no se colocan elementos de bloque dentro de elementos en línea es para que el navegador pueda representar los elementos de una manera fácilmente predecible.

Aunque no rompa ninguna regla para HTML o CSS, aún crea elementos que no se pueden representar como se pretendía. El navegador debe manejar los elementos como si el código HTML no fuera válido.

+3

entonces, ¿qué hace usted, cuando necesita una fila completa en una tabla para hacer clic? – mgPePe

+2

@mgPePe: hay varias opciones. Puede poner un enlace en cada celda de la fila, puede usar Javascript para capturar el evento click en la fila, o puede usar algo diferente de una tabla. – Guffa

+0

Sí, JS es una buena solución. Lo que terminé haciendo fue tener un 'a' con un' intervalo de visualización anidado = "bloque" 'de acuerdo con este ejemplo: http://www.jakpsatweb.cz/css/css-vertical-center-solution.html – mgPePe

2

El HTML se valida independientemente del CSS, por lo que la página seguirá siendo válida. Estoy bastante seguro de que la especificación CSS tampoco dice nada al respecto, pero no me cites sobre eso. Sin embargo, sería muy cuidadoso al usar una técnica como esta, ya que si bien podría funcionar como se pretende en algunos navegadores, necesitarías probarlos todos, no veo que se hagan muchas garantías.

5

El HTML y el CSS seguirán siendo válidos. Idealmente, no tendría que hacer algo como esto, pero ese fragmento de CSS en realidad es una forma práctica (y sintácticamente válida pero no semánticamente válida) de obtener el doble margen de error de Internet Explorer sin recurrir a hojas de estilo condicionales o hacks que invalidarán tu CSS El (X) HTML tiene más valor semántico que el CSS, por lo que es menos importante que el CSS sea semánticamente válido. En mi opinión, es aceptable porque resuelve un problema molesto del navegador sin invalidar su código.

1

¿Los elementos de la página siguen siendo válidos?

"Válido" en un sentido HTML, sí; HTML no sabe nada sobre CSS.

Sin embargo, el renderizado que obtiene en el navegador no está "definido" por la especificación CSS, por lo que podría parecerse a cualquier cosa. Si bien podría incluir esa regla en los hacks de CSS dirigidos a un navegador en particular (donde sabe cómo ese navegador representa este caso), no debería ser servido a los navegadores en general.

+1

y para preguntarle ... ¿cómo se puede hacer clic en una fila completa de una tabla? – mgPePe

+0

@mgPePe: Pones un enlace en cada celda y lo configuras en 'display: block' para que llene el ancho de la celda. – bobince

+0

surgen 2 preguntas: ¿puedo tener ' [..más tramos]' y también: ¿puedo entonces poner 'vertical-align: middle' en el bloque span, sería eso ¿Sé valido? – mgPePe

-1

No, no es una elección incorrecta. Podemos usar según los requisitos.

-1

Si sigue una lógica y termina implementándola así, NO ESTÁ EQUIVOCADA. Las cosas que funcionan no son "incorrectas" solo porque son raras. Sí, es bastante inusual, pero AYUDA y no es un error. Es intencional. HTML y CSS deberían servirle, no al revés, así que nunca escuche los comentarios diciéndole que no lo haga solo porque es feo.

Es típico llamar a una solución "inválida" y sugerir un largo camino alrededor del bloque. A veces puedes reconsiderar lo que hiciste. Pero puede haber muchas razones para lo que hiciste y ellas no las consideran.

Yo uso bloques dentro de líneas regularmente. Es válido y funciona, simplemente no es necesario en la mayoría de los casos. Y qué. Recuerda cuando XHTML nos dijo que siempre pusiéramos comillas en las propiedades (¡y todos te gritaron si no lo hiciste!), Ahora HTML5 permite omitirlas si no hay espacio adentro. ¿Qué pasó con esa última barra después de etiquetas singulares? "< br/>"? Venga. Los estándares cambian Pero los navegadores también mantienen las cosas que no son estándar. CENTER está en desuso estamos en 2013 y todavía funciona. TABLA para el centrado vertical A veces es la única forma. DIV dentro de A para hacer que se desplace como lo planeó? Sólo sigue adelante.

Enfóquese en las cosas importantes.

Cuestiones relacionadas