Чому висота: 0 не приховує мій заповнений <div>, навіть із розміром коробки: border-box?


77

У мене є <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) встановлено.


2
Так, якщо ви хочете використовувати цей тип div в реальному світі, вам слід зробити додаткову обгортку DIV всередині цього і перемістити до нього відступ.
Харді

Відповіді:


46

Точне визначення border-box:

Тобто, будь-яке заповнення або облямівка, вказані на елементі, викладаються та промальовуються всередині вказаної ширини та висоти. Ширина та висота вмісту обчислюються шляхом віднімання меж та ширини заповнення відповідних сторін із заданих властивостей «ширина» та «висота».

Таким чином, ви змінюєте властивості висоти та ширини, але paddingі borderніколи не змінюєте.

Оскільки ширина та висота вмісту не можуть бути від’ємними ([CSS21], розділ 10.2), це обчислення розміщено на рівні 0.

Тоді, якщо height0, ви не можете зробити, щоб відступ був всередині, оскільки це означає, що висота буде від’ємною.


4
Правильно , зрозуміло. Що має сенс.
Paul D. Waite

Блискуче пояснення., Дякую. Намагався анімувати дію збільшення / зменшення лівої панелі в простому макеті PANEL + CANVAS, застосовуючи до неї ширину 0-SIZE. це допомагає
:)

13

Заява height: 0;застосовується. Якщо залишити це значення height: auto;, ви побачите різницю в 20 пікселів (висоту рядка з написом "Привіт!"), Що зробить загальною висотою 100 пікселів. Якщо висота встановлена ​​на нуль, вона має лише 80 пікселів:padding-top + padding-bottom = 80px

Тож відповідь така: так, це очікувана поведінка.

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

Оновлення: Як зазначав Харді, використання додаткової оболонки div обходить цю проблему.

Демо

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

1
Отже, ви говорите, що box-sizingне має жодного ефекту на верхній і нижній відступ? Тільки ліворуч та праворуч?
Пол Д. Уейт,

1
Ви не можете встановити width: 0;разом з padding: 40px;обома і зробити його невидимим. Ширину та висоту ширини встановлено на нуль, ви все одно матимете 80px x 80px великий ящик.
kleinfreund

1
Ага, розумію. Отже, за box-sizing: border-boxдопомогою браузера встановить розмір області вмісту таким чином, щоб загальна ширина або висота елемента була якомога ближчою до заданого розміру ширини / висоти. Але область вмісту не може мати негативний розмір, тому відступ завжди буде видно. Зрозумів, дякую.
Пол Д. Уейт,

3
Визначення має сенс, але це, на жаль, має наслідком неможливість встановити результуюче поле в нуль, якщо воно має відступи, незважаючи ні на що.
Метью Дін

5
Іншим обхідним шляхом було б додати елементи ::beforeта ::afterелементи, display: block; height: 40px;щоб створити той самий ефект, який створив би заповнення, зберігаючи при цьому можливість встановити висоту на значення, менші за комбіновану вертикальну "прокладку".
Jon z
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.