81 votes

Utilisation de "margin : 0 auto ;" dans Internet Explorer 8

Je suis en train de faire des tests avancés sur IE8, et il semble que l'ancienne technique d'utilisation de la fonction margin: 0 auto; ne fonctionne pas dans tous les cas dans IE8.

Le morceau de HTML suivant donne un bouton centré dans FF3, Opera, Safari, Chrome, IE7, et IE8 compat, mais PAS dans la norme IE8 :

<div style="height: 500px; width: 500px; background-color: Yellow;">
    <input type="submit" style="display: block; margin: 0 auto;" />
</div>

(Comme solution de rechange, je peux ajouter une largeur explicite au bouton).

La question est donc la suivante : quels sont les navigateurs corrects ? Ou s'agit-il d'un de ces cas où le comportement est indéfini ?

(Je pense que todo les navigateurs sont incorrects - le bouton ne devrait-il pas avoir une largeur de 100 % s'il est "display : block" ?)

MISE À JOUR : Je suis un cancre. Puisque input n'est pas un élément de niveau bloc, j'aurais dû le contenir dans un div avec "text-align : center". Cela dit, par curiosité, j'aimerais quand même savoir si le bouton doit être centré ou non dans l'exemple ci-dessus.

POUR LE PRIX : Je sais que je fais des choses bizarres dans l'exemple, et comme je le souligne dans la mise à jour, j'aurais dû simplement l'aligner au centre. Pour la prime, je voudrais des références aux spécifications qui répondent :

  1. Si je définis "display : block", le bouton doit-il être le bouton doit-il avoir une largeur de 100 % ? Ou est-ce indéfini ?

  2. Puisque l'affichage est en bloc, est-ce que "margin : 0 auto ;" centrer le bouton, ou bien pas, ou indéfini ?

0 votes

Vous feriez mieux de vous dépêcher : IE8 RTM est aujourd'hui et sera disponible au téléchargement dans environ 2 heures.

0 votes

Il est encore en version bêta et l'absence de prise en charge complète d'IE8 n'est qu'une des nombreuses choses à corriger avant la sortie de la version.

156voto

Pal Points 1431

Ajout de <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> résout le problème

13 votes

Sans le DOCTYPE, IE passe automatiquement en mode de rendu Quirks. Utile :-)

7 votes

Échec également si vous avez quelque chose avant doctype, (c'est-à-dire des commentaires, une balise html de départ, etc...).

0 votes

Aussi avec bootstrap a cassé tous

71voto

buti-oxa Points 6428

C'est un bug dans IE8.

Commençons par votre deuxième question : "margin : 0 auto" centre un bloc, mais uniquement lorsque la largeur du bloc est inférieure à celle du parent. En général, elles sont identiques. C'est pourquoi le texte de l'exemple ci-dessous n'est pas centré.

<div style="height: 100px; width: 500px; background-color: Yellow;">    
    <b style="display: block; margin: 0 auto; ">text</b>
</div>

Une fois que le style d'affichage de l'élément b est défini sur block, sa largeur correspond par défaut à celle des parents. Spécification CSS 10.3.3 Éléments non remplacés au niveau du bloc dans un flux normal décrit comment : "Si 'width' est défini sur 'auto', toute autre valeur 'auto' devient '0' et 'width' découle de l'égalité qui en résulte." L'égalité mentionnée ici est

margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = largeur du bloc qui le contient

Donc, normalement, tous les autos ont pour résultat que la largeur du bloc est égale à la largeur du bloc contenant.

Toutefois, ce calcul ne doit pas être appliqué à INPUT, qui est un élément remplacé. Les éléments remplacés sont couverts par 10.3.4 Éléments remplacés au niveau du bloc, en flux normal . Le texte dit : "La valeur utilisée de 'width' est déterminée comme pour les éléments remplacés en ligne." La partie pertinente de 10.3.2 Éléments remplacés en ligne est : "si 'width' a une valeur calculée de 'auto', et que l'élément a une largeur intrinsèque, alors cette largeur intrinsèque est la valeur utilisée de 'width'".

Je suppose que le scénario dont CSS se soucie est l'élément IMG. Le logo de Stackoverflow dans cet exemple sera centré par tous les navigateurs.

<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>

L'élément INPUT doit se comporter de la même manière.

5voto

Wolfr Points 2797

Oui, vous pouvez lire la spécification cent fois, et combiner différents morceaux jusqu'à ce que vous ayez une interprétation qui vous semble correcte - mais c'est exactement ce que les vendeurs de navigateurs ont fait et c'est pourquoi nous sommes dans la situation actuelle.

En substance, lorsque vous appliquez une largeur de 100 % à un élément, celui-ci doit s'étendre à 100 % de la largeur de son parent, si ce dernier est un élément de bloc. Vous ne pouvez plus le centrer avec margin: 0 auto; alors qu'il occupe déjà 100% de la largeur disponible.

Pour centrer quoi que ce soit avec margin: 0 auto; vous devez définir une largeur explicite. Pour centrer un élément en ligne, vous pouvez utiliser text-align: center; sur l'élément parent, bien que cela puisse avoir des effets secondaires indésirables si le parent a d'autres enfants.

5voto

porneL Points 42805

Les contrôles de formulaires sont éléments remplacés en CSS.

10.3.4 Éléments remplacés au niveau du bloc, en flux normal

L'utilisation La valeur de "width" est déterminée comme pour les éléments remplacés en ligne. . Ensuite, les règles relatives aux éléments de niveau bloc non remplacés sont appliquées pour déterminer les marges.

Ainsi, le contrôle de formulaire ne devrait pas être étiré à 100% de sa largeur.

Cependant, il devrait être centré. Cela ressemble à un bogue ordinaire dans IE8. Il centre l'élément si vous définissez une largeur spécifique :

<input type="submit" style="display: block; width:100px; margin: 0 auto;" />

3voto

Simon Dyson Points 389

Comme expliqué par buti-oxa, il s'agit d'un bogue dans la façon dont IE8 traite les éléments remplacés. Si vous ne voulez pas ajouter une largeur explicite à votre bouton, vous pouvez le transformer en bloc inline et aligner son contenu au centre :

<div style="height: 500px; width: 500px; background-color: Yellow; text-align: center;">
  <input type="submit" style="display: inline-block;" />
</div>

Si vous voulez que cela fonctionne dans les anciennes versions de Mozilla (y compris FF2) qui ne supportent pas les blocs en ligne, vous pouvez ajouter display: -moz-inline-stack; au bouton.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X