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

Почему не высота: 0 скрыть мой padded <div>, даже с размером окна: border-box?

Я получил <div> с отступом. Я установил его в height: 0 и дал ему overflow: hidden и box-sizing: border-box.

HTML

<div>Hello!</div>

CSS

div {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    height: 0;
    overflow: hidden;

    padding: 40px;

    background: red;
    color: white;
}

http://jsfiddle.net/FA29u/2/

Как я понимаю, это должно привести к исчезновению <div>.

Однако его все еще видно (в Chrome 31 и Firefox 25 на моем Mac). Объявление height, похоже, не применяется к заполнению, несмотря на объявление box-sizing.

Является ли это ожидаемым поведением? Если да, то почему? Страница MDN на box-sizing, похоже, не упоминает эту проблему.

Не, насколько я могу судить, спецификация - он мне читается, как ширина и высота должны включать отступ, когда box-sizing: border-box (или действительно padding-box).

4b9b3361

Ответ 1

Точное определение border-box:

Таким образом, любая прокладка или граница, указанные на элементе, выложены и вычерчены внутри этой указанной ширины и высоты. Ширина и высота содержимого вычисляются путем вычитания ширины границы и заполнения соответствующих сторон из заданных свойств ширины и высоты.

Таким образом, вы изменяете высоту свойств ширины, но padding и border никогда не меняются.

Поскольку ширина и высота содержимого не могут быть отрицательными ([CSS21], раздел 10.2), это вычисление заполняется на 0.

Тогда, если height равно 0, вы не можете сделать добавление внутри, потому что это означает, что высота будет отрицательной.

Ответ 2

Применяется декларация height: 0;. Если вы оставите его на height: auto;, вы увидите разницу в 20px (высота линии с "Hello!" ), Делая ее общей высотой 100 пикселей. Если высота установлена ​​равной нулю, она достигает всего 80 пикселей: padding-top + padding-bottom = 80px

Итак, ответ: Да, ожидаемое поведение.

Вы можете установить ширину и высоту для любого значения между 0 и 80px (если у вас есть 40px отступов) и по-прежнему получать одинаковые размеры.

Обновление: как упоминал Харди, использование этой дополнительной обертки вокруг этой проблемы.

Демо

HTML:

<div class="div-1">
    <div class="div-2">
        Hello!
    </div>
</div>

CSS

.div-1 {
    padding: 40px;

    /* This is not visible! */
    border: 1px solid dashed;
}
.div-2 {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    height: 0px;
    width: 0px;
    background: red;
    color: white;
    overflow: hidden;
}