Estoy en el proceso de hacer algunas pruebas avanzadas de IE8, y parece que la antigua técnica de uso margin: 0 auto;
no funciona en todos los casos en IE8.
La siguiente pieza de HTML muestra un botón centrado en compatibilidad con FF3, Opera, Safari, Chrome, IE7 e IE8, pero NO en el estándar IE8:
<div style="height: 500px; width: 500px; background-color: Yellow;">
<input type="submit" style="display: block; margin: 0 auto;" />
</div>
(Como solución temporal, puedo agregar un ancho explícito al botón).
Entonces la pregunta es: ¿qué navegadores son correctos? ¿O es este uno de esos casos en los que el comportamiento no está definido?
(Mi opinión es que todos los navegadores son incorrectos, ¿no debería el botón tener un ancho del 100% si es "display: block"?)
ACTUALIZACIÓN: Estoy siendo un tonto. Dado que la entrada no es un elemento a nivel de bloque, debería haberlo contenido dentro de un div con "text-align: center". Habiendo dicho eso, por curiosidad, me gustaría saber si el botón debería o no estar centrado en el ejemplo anterior.
PARA EL BOUNTY: Sé que estoy haciendo cosas raras en el ejemplo y, como señalo en la actualización, debería haberlo alineado en el centro. Para la recompensa, me gustaría referencias a las especificaciones que responden:
Si configuro "display: block", ¿debería el botón tener un ancho del 100%? ¿O es esto indefinido?
Dado que la pantalla es un bloque, debería "margin: 0 auto;" centrar el botón, o no, o indefinido?
fuente
Respuestas:
Es un error en IE8.
Comenzando con su segunda pregunta: “margin: 0 auto” centra un bloque, pero solo cuando el ancho del bloque está configurado para ser menor que el ancho del padre. Por lo general, llegan a ser iguales. Es por eso que el texto del ejemplo siguiente no está centrado.
<div style="height: 100px; width: 500px; background-color: Yellow;"> <b style="display: block; margin: 0 auto; ">text</b> </div>
Una vez que el estilo de visualización del elemento b se establece en bloque, su ancho predeterminado es el ancho principal. La especificación CSS 10.3.3 Los elementos no reemplazados a nivel de bloque en el flujo normal describen cómo: "Si 'ancho' se establece en 'auto', cualquier otro valor de 'auto' se convierte en '0' y 'ancho' se sigue de la igualdad resultante . " La igualdad mencionada allí es
'margin-left' + 'border-left-width' + 'padding-left' + 'ancho' + 'padding-right' + 'border-right-width' + 'margin-right' = ancho del bloque contenedor
Entonces, normalmente todos los autos dan como resultado un ancho de bloque igual al ancho del bloque contenedor.
Sin embargo, este cálculo no debe aplicarse a INPUT, que es un elemento reemplazado. Los elementos reemplazados están cubiertos por 10.3.4 Elementos reemplazados a nivel de bloque en flujo normal . El texto allí dice: "El valor usado de 'ancho' se determina como para los elementos reemplazados en línea". La parte relevante de 10.3.2 Elementos reemplazados en línea es: “si 'ancho' tiene un valor calculado de 'auto', y el elemento tiene un ancho intrínseco, entonces ese ancho intrínseco es el valor usado de 'ancho'”.
Supongo que el escenario que le preocupa a CSS es el elemento IMG. El logotipo de Stackoverflow en este ejemplo estará centrado en todos los navegadores.
<div style="height: 100px; width: 500px; background-color: Yellow;"> <img style="display: block; margin: 0 auto; " border="0" src="http://stackoverflow.com/content/img/so/logo.png" alt=""> </div>
El elemento INPUT debería comportarse de la misma manera.
fuente
Agregar
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
resuelve el problemafuente
Sí, puede leer la especificación cientos de veces y combinar diferentes partes y piezas hasta que tenga una interpretación que se sienta correcta, pero eso es exactamente lo que hicieron los proveedores de navegadores y es por eso que estamos en la situación en la que nos encontramos hoy.
En esencia, cuando aplica un ancho del 100% a un elemento, debe extenderse al 100% del ancho de su padre, si ese padre es un elemento de bloque. No puede centrarlo más con
margin: 0 auto;
entonces, ya que ocupa el 100% del ancho disponible.Para centrar cualquier cosa con
margin: 0 auto;
necesita definir un ancho explícito. Para centrar un elemento en línea, puede usarlotext-align: center;
en el elemento principal, aunque esto podría tener efectos secundarios no deseados si el padre tiene otros elementos secundarios.fuente
Los controles de formulario son elementos reemplazados en CSS.
Por lo tanto, el control de formulario no debe extenderse al 100% de ancho.
Sin embargo, debería estar centrado. Parece un error normal en IE8. Centra el elemento si establece un ancho específico:
<input type="submit" style="display: block; width:100px; margin: 0 auto;" />
fuente
Como lo explica buti-oxa, este es un error con la forma en que IE8 maneja los elementos reemplazados. Si no desea agregar un ancho explícito a su botón, puede cambiarlo a un bloque en línea y alinear el contenido en el centro:
<div style="height: 500px; width: 500px; background-color: Yellow; text-align: center;"> <input type="submit" style="display: inline-block;" /> </div>
Si desea que esto funcione en versiones anteriores de Mozilla (incluido FF2) que no admiten el bloqueo en línea, puede agregarlo
display: -moz-inline-stack;
al botón.fuente
En cuanto a que esto es un "error" en relación con la especificación; no lo es. Como autor de las preguntas de la publicación, el comportamiento para esto sería "indefinido" ya que este comportamiento en IE solo ocurre en los controles de formulario, según las especificaciones:
( http://www.w3.org/TR/CSS21/conform.html#conformance )
¡Salud!
fuente
Una vez más: ¡todos odiamos IE!
<div style="width:100%;background-color:blue;"> <div style="margin:0 auto;width:300px;background-color:red;"> Not Working </div> </div> <div style="width:100%;background-color:green;text-align:center;"> <div style="margin:0 auto;width:300px;background-color:orange;text-align:left;"> Working, but dumb that you have to use text-align </div> </div>
fuente
intente todo lo anterior, termine haciendo esto
<div style="width:100%; background-color:red; text-align:center;"> <div style="width:900px; margin:0 auto; background-color:blue;"> hello </div> </div>
fuente
Agregue
<!doctype html>
en la parte superior de su salida HTML.fuente
No. Eso solo significa que es la única cosa en el espacio verticalmente (asumiendo que no estás usando otro truco para forzar algo más allí también). No significa que tenga que llenar el ancho de ese espacio.
Creo que su problema en este caso es que
input
no es un elemento de bloque de forma nativa. Intente anidarlo dentro de otro div y establezca el margen en eso. Pero no tengo un navegador IE8 para probar esto en este momento, así que es solo una suposición.fuente
"margin: 0 auto" solo centra un elemento en IE si el elemento padre tiene un "text-align: center".
fuente
margin: 0 auto
el elemento debe estar centrado, pero el ancho se deja como está, sea lo que sea que se calcule, sin tener en cuenta la configuración de los márgenes.<INPUT>
etiqueta endisplay:block
, debe centrarse conmargin: 0 auto
.Consulte Detalles del modelo de formato visual: cálculo de anchos y márgenes a partir de las especificaciones de CSS 2.1 para obtener más detalles. Los bits relacionados incluyen:
y
finalmente
fuente