Dans le CSS, pourquoi la combinaison de “float: left; display:table; marge: x” sur plusieurs éléments rendent la diminution des marges?

À travailler sur une mise en page, j'ai décidé de tenter combinant un flotteur de mise en page pour les grandes colonnes d'une table avec une mise en page pour les sous-éléments. Ainsi, mon code html/css de balisage a été le long de ces lignes:

HTML:

<div class="column">
    <div class="sub-element"></div>
    <div class="sub-element"></div>
</div>
<div class="column">
    <div class="sub-element"></div>
    <div class="sub-element"></div>
</div>
...

CSS:

.column {
    float: left;
    display: table;
    width: 15%;
    margin: 2%;
    /*  ...  */
}
.sub-element {
    display: table-cell;
    /*  ...  */
}

Spécifiques largeurs et les marges ne sont pas critiques. Voir cette jsFiddle pour un exemple de référence.

Ce que j'ai vu passer, c'est que chaque bloc de colonnes, de gauche à droite sur la page, s'était légèrement plus petite des marges que le dernier. Comme aucun autre balisage ou CSS était présent pour ce faire, j'ai été confondu. Après avoir joué avec des valeurs différentes, j'ai découvert qu'en commentant display: table causé le comportement normal je m'attendais, par exemple, la constante des largeurs de colonne.

Maintenant, je peux utiliser d'autres méthodes pour obtenir la mise en page que je veux, ce n'est pas un problème; mais je suis vraiment curieux de savoir pourquoi ce qui se passe. Toutes les pensées?

MODIFIER

Il semble que ce est une webkit bug. display: table avec flotteur et les marges fonctionne très bien dans Firefox. Toutes les suggestions sur un correctif pour webkit pour la postérité?

MODIFIER

Je viens de tester dans Safari et il semble fonctionner. WTF Chrome??

Montage Final

Après avoir testé dans Firefox 18, Safari et Chrome Canary (en plus de la norme de Chrome), il apparaît que c'est en fait un Chrome bug spécifique.

La meilleure solution est d'ajouter un supplémentaire simple wrapper div à l'intérieur de chacun de ceux flottait à contenir le contenu et les wrappers' CSS pour width: 100%; height:100%; display: table;, puis retirez le display: table à partir de l'extérieur des éléments de flottaison. Fonctionne comme un charme.

http://jsfiddle.net/XMXuc/8/

HTML:

<div class="column">
    <div class="sub-element-wrapper">
        <div class="sub-element"></div>
        <div class="sub-element"></div>
    </div>
</div>
<div class="column">
    <div class="sub-element-wrapper">
        <div class="sub-element"></div>
        <div class="sub-element"></div>
    </div>
</div>
...

CSS:

.column {
    float: left;
    width: 15%;
    margin: 2%;
    /*  ...  */
}
.sub-element-wrapper {
    width: 100%;
    height: 100%;
    display: table;
}
.sub-element {
    display: table-cell;
    /*  ...  */
}
Ce n'est pas censé arriver. Ressemble à un autre WebKit bug si vous me demandez.
Yep, ressemble à WebKit - fonctionne comme prévu dans FireFox.
lol à la poursuite de votre edit - je ne peux pas trouver quelque chose dans les Chrome issue tracker pour ce comportement particulier, mais Chrome est un buggy navigateur, 'nuff said.
ouvert le numéro code.google.com/p/chromium/issues/detail?id=363954
fixe en bêta 35.0.1916.114 et canaries 37.0.1992.1

OriginalL'auteur Ken Bellows | 2013-02-18