Je viens de découvrir le box-sizing: border-box
Propriété CSS qui résout pour moi un tas de problèmes de mise en page entre navigateurs.
Le seul problème que j'ai maintenant, c'est que IE7 ne semble pas le prendre en charge. Existe-t-il un hack pour que IE7 le supporte?
Il existe plusieurs façons de le faire, aucune n'est parfaite.
Comme vous le signalez:
<!--[if IE 7]>
Special instructions for IE 7 here
<![endif]-->
Utilisez le dimensionnement des boîtes pour IE8 et 9, puis effectuez des remplacements spécifiques pour IE7. Cette option sera douloureuse.
https://github.com/Schepp/box-sizing-polyfill
Cet excellent Polyfill est un fichier HTC qui modifie le comportement du navigateur par défaut dans IE6 et 7 afin qu'ils utilisent le modèle de boîte W3C. Il convient à une utilisation légère, mais peut entraîner des problèmes s'il est utilisé de manière intensive. À utiliser avec prudence et TEST.
L'approche div imbriquée à l'ancienne est toujours un bon moyen:
<div style="width:100px; border:1px solid black">
<div style="margin:10px">
Content
</div>
</div>
Un div imbriqué non sémantique fournit indirectement le remplissage, avec l'inconvénient que votre balisage devient désordonné. Évidemment, n'utilisez pas de styles en ligne, je les utilise ici à des fins d'illustration.
Le vieil adage N'utilisez jamais de rembourrage sur un élément à largeur fixe reste vrai.
L'inverse est avec le sélecteur d'enfant direct. Supposons que vous ayez une div à largeur fixe contenant du contenu:
<div class="content">
<h1>Hi</h1>
<p>hello <em>there</em></p>
</div>
Vous pouvez ensuite écrire une règle pour ajouter des marges gauche et droite à tous les enfants directs du div:
.content {
width:500px;
padding:20px 0;
}
.content > * {
margin:0 20px;
}
Cela ajoutera une petite marge aux h1 et p, mais pas aux em imbriqués, donnant l'apparence d'un remplissage 20px sur la div de contenu, mais sans déclencher le bug du modèle de boîte.
IE7 est le dernier navigateur à ne pas reconnaître la propriété de dimensionnement de boîte. Si vous recevez peu de trafic d'IE7, vous pourriez envisager de supprimer le support. Votre CSS sera beaucoup plus agréable.
À la fin de 2013, c'est mon option préférée.
EDIT 2017: Il est probablement longtemps passé de supprimer le support d'IE7 maintenant, et d'utiliser simplement border-box.
Vous pouvez utiliser un polyfill pour le faire fonctionner sur certains éléments, mais cela n'a pas fonctionné pour mes champs de saisie.
https://github.com/Schepp/box-sizing-polyfill
box-sizing: border-box;
*behavior: url(/css/boxsizing.htc);
Notez simplement que l'URL de comportement est relative à la page et non au fichier CSS. Utilisez des chemins d'accès relatifs à la racine du site (démarrez l'URL avec une barre oblique, puis allez à partir de là).