2012-06-21 1 views
13

При использовании box-sizing: border-box в CSS я предполагаю, что общая ширина элемента будет определена в его значении «ширина». Поэтому, если я скажу, что ширина деления составляет 20 пикселей, а правая граница - 10 пикселей, в итоге я получаю поле размером 20 пикселей, а половина - это правая граница. Преодолевая его до точки, где я установить ширину 10px и правой границы, тоже, как здесь:Почему размер окна: рамка по-прежнему показывает границу с шириной 0px?

#box{ 
    overflow: hidden; 
    width: 10px; 
    box-sizing: border-box; 
    height: 100px; 
    background: black; 
    border-right: 10px solid red; 
}​ 

коробки будет состоять только из красной границы. Что должно произойти, когда я устанавливаю ширину на 0px? Я думал, что все это исчезнет, ​​но нет, результат точно такой же, как и выше: jsFiddle

Мой вопрос в том, является ли это ожидаемым поведением. Мне кажется непоследовательным. Я бы хотел, чтобы окно исчезло, только манипулируя шириной/высотой. Спасибо за любой вклад.

+0

Какой браузер вы используете? Не все браузеры напрямую поддерживают размер окна. Некоторые из них имеют собственный собственный размер коробки, такой как '-moz-box-sizing' и' -webkit-box-sizing'. Если вы хотите что-то скрывать, рассмотрите использование 'display: none;' или 'visibility: hidden;' – Jrod

+0

Я мог бы также использовать молоток, чтобы сломать яйцо ... но я стараюсь не делать :) Просто шучу, я действительно нужно, чтобы элемент исчезал так ... подумайте о разрезе ... – Seka

+0

Вы имеете в виду какую-то анимацию, где вы медленно уменьшаете ширину до нуля? Не совсем уверен, что вы имеете в виду под щелью. Если бы вы могли уточнить, чего именно вы пытаетесь достичь, возможно, еще одно подходящее решение. Как и в большинстве случаев, есть много способов сделать это. Возможно, молоток с когтями - это плохой выбор, но, возможно, расколотый молот находится прямо вверх по вашей аллее. – Jrod

ответ

14

Область содержимого - это все, что осталось после вычитания ширины границы.

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

указано ширина = 10 точек
ширина границы = 10 точек
Содержимого ширина = указано ширина (10 точек) - граница ширина (10 точек)
Содержимая ширина 10 - 10 = 0

указано ширина = 0 точки
границы ширина = 10 точек
ширина = Содержание указано ширина (0 пикселей) - граница ширина (10 точек)
содержимого ширина 0 - 10 = -10 (что было бы удалить 10 точек, используемых границы)

Но

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

указано ширина = 0 рх
ширина границы = 10 пикселей
Ширина содержимого = заданная ширина (0 пикселей) - ширина границы (10 пикселей)
Ширина содержимого 0 - 10 = 0 (что не удаляет 10 пикселей, используемых границей)

Если вы не хотите использовать display:none; или visibility:hidden;, вам необходимо установить как width:XX; и border-right:XX; к нулю.

+0

Благодарим вас за ответ; ключ был в понимании того, что граница остается из-за отрицательного результата, я думаю. Но, на ваш взгляд, вы думаете, что это последовательное поведение? Интересно, потому что в этом последнем случае пограничный ящик и контент-ящик ведут себя одинаково, что кажется мне настолько интуитивно понятным. Как вы думаете? – Seka

+0

Я согласен, проблема в том, что вы не можете разрешать блоки с отрицательным размером, так вот как они решили справиться с этим. Я не могу придумать лучшую альтернативу. – codewaggle

+1

вот как вы делаете треугольник! https://css-tricks.com/examples/ShapesOfCSS/ –

0

Посмотрите на этот скриншот:

box metrics

Вся коробка 100x100px, как можно было бы ожидать, но фактическая ширина 90px + 10px правая граница. Поэтому, когда вы устанавливаете ширину в 0, ширина по-прежнему равна 0 (не может иметь отрицательную ширину), но у вас все еще есть граница 10px.

+0

Но почему у вас все еще есть граница? Потому что после спецификаций его не должно быть: «Ширина и высота содержимого вычисляются путем вычитания границ и ширины заполнения соответствующих сторон из заданных свойств« ширина »и« высота ». Поскольку ширина и высота содержимого не могут быть отрицательными ([CSS21], раздел 10.2), это вычисление заполняется на 0. " [см. border-box] (http://www.w3.org/TR/css3-ui/#box-sizing0) – Seka

+1

Это то, что происходит. Ширина содержимого (ширина, не считая границ или отступов) равна 0, потому что после вычитания границ и отступов вы остаетесь с отрицательной шириной. Следует отметить, как вы определяете «контент». – sachleen

+0

... так что общая «ширина» элемента должна быть перекрыта до нуля, правильно? Если, определяя ширину: 10px и border-right: 10px, я получаю поле 10px, я должен получить поле 0px, если я определяю ширину до 0px, правильно? Re-quoting Paul Irish: «Если бы я сказал, что ширина 200px [0px], черт побери, это будет 200px [0px] широкоформатным ящиком, даже если у меня 20px отступов [border]». [* {box-sizing: border-box} FTW] (http://paulirish.com/2012/box-sizing-border-box-ftw/) – Seka