Подтвердить что ты не робот

В CSS почему комбинация "float: left; display: table; margin: x" на нескольких элементах уменьшает маржи?

При работе над макетом я решил попробовать комбинировать макет с плавающей точкой для основных столбцов с табличным расположением подэлементов. Таким образом, моя разметка html/css была следующей:

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;
    /*  ...  */
}

Конкретные ширины и поля не являются критическими. См. этот jsFiddle для ссылочного примера.

То, что я увидел, состояло в том, что каждый блок столбцов, идущий слева направо по странице, имел немного меньшие поля, чем последние. Поскольку никакой дополнительной разметки или CSS не было, чтобы это произошло, я был в замешательстве. После игры с разными значениями я обнаружил, что комментарий display: table вызвал нормальное поведение, которое я ожидал, например. постоянные ширины столбцов.

Теперь я могу использовать альтернативные методы для получения макета, который я хочу, это не проблема; но мне действительно интересно, почему это происходит. Любые мысли?

ИЗМЕНИТЬ

Похоже, это ошибка webkit. display: table с поплавком и полями отлично работает в Firefox. Любые предложения по исправлению для webkit для потомков?

Далее EDIT

Я просто тестировал в Safari и, похоже, там тоже работает. WTF Chrome

Окончательный EDIT

После тестирования в Firefox 18, Safari и Chrome Canary (в дополнение к стандартным Chrome), похоже, что это на самом деле ошибка Chrome.

Самое простое исправление заключается в том, чтобы добавить простой дополнительный обертку div внутри каждого из плавающих, чтобы содержать контент, и установить CSS-обложки в width: 100%; height:100%; display: table;, а затем удалить display: table из внешних элементов, которые будут перемещаться. Работает как шарм.

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;
    /*  ...  */
}
4b9b3361

Ответ 1

Этого не должно быть. Горизонтальные поля на таблицах уровня блока должны вычисляться так же, как и с любыми другими незаменяемыми элементами уровня блока, как описано в разделе раздела 10.3.3 в CSS2.1 spec, независимо от который используется алгоритм компоновки таблиц. В частности, значения процентов для полей должны рассчитываться на основе ширины содержащего блока элемента, который вы показываете в виде таблицы; поскольку все ваши элементы являются братьями и сестрами, которые имеют один и тот же родительский элемент и одинаковое процентное значение маржи, они должны быть равноудаленными, если они являются плавающими блочными блоками.

Во всех браузерах, кроме Google Chrome, элементы равноудалены, как и ожидалось. Поэтому я думаю, что это еще одна ошибка Chrome.

Если вы прокомментируете объявление display: table, которое, как вы говорите, заставляет поведение вернуться к нормальной работе, браузеры все равно будут генерировать анонимные блок-таблицы в ваших поплавках, чтобы содержать ячейки таблицы. Это не должно отрицательно влиять на макет, но если это так, я не могу комментировать дальше, поскольку я не очень хорошо знаком с тем, как макет таблицы работает с точки зрения CSS.