Что такое box sizing border box

CSS3: свойство Box-Sizing

Раньше, если мы делали div шириной и высотой 100px, добавляли padding 10px и border 10px, то получался квадрат не 100х100, а 140х140 px:

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Но иногда требуется, чтобы div был фиксированной ширины при любых значениях padding и border. В CSS3 нам поможет свойство box-sizing.

Использование box-sizing

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Поддержка браузерами

Свойство box-sizing поддерживает большинство современных браузеров: Firefox 3.6+, Safari 3+, Opera 8.5+ и Internet Explorer 8+. Актуальные данные можно посмотреть на сайте caniuse.com.

Практический пример

Рассмотрим реальный пример использования свойства box-sizing. Есть меню из пяти пунктов:

Добавим немного CSS, в т.ч. фиксированную ширину меню в 500 px и ширину каждого элемента в 100 px:

Меню выглядит нормально:

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Но при добавлении левого или правого border’а последний пункт меню съезжает, потому что не помещается:

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Но если использовать box-sizing, то этой проблемы нет:

Источник

Box-Sizing: секрет простых лейаутов

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Box-sizing – это свойство CSS, которое делает верстку макетов сайта более понятным. Если вы работали с CSS, то вы знаете, что использование свойств width, padding и border ведет к путанице. Иногда, когда используется свойство width, оно не может быть всегда применено к тому, что вы ожидаете – например ширина width задается в процентах, а граница border указывается в пикселях. Тем не менее, используя свойство box-sizing, ширина блока в 200px будет действительно отображать блок шириной 200px.

Это никак не связано с JavaScript и это также работает в Internet Explorer, начиная с 8й версии.

Блочная модель

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

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Без box-sizing, ширина width представляет собой область содержимого (158px).

Актуальная ширина включает ширину области – content, отступы – padding, и границу – border.

Это означает, что если будет установлена ширина 200px, то элемент займет точно указанный размер, если не будет padding и border. Т.е., свойство width означает ширину контентной области, а не ширину всего блока (включая padding и border).

Если вы хотите сделать ширину блока равной 200px, а потом захотите сделать отступы по 20px с каждой стороны, необходимо позаимствовать 40px (20px для левой и 20px для правой сторон) от этой ширины. То же самое надо сделать, при установке величины border. Все это делает код менее читабельным. Чтобы блок имел общую ширину 200px, необходимо код писать так:

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

Вместо вычисления ширины, включающей отступы и границы, свойство box-sizing в сочетании с border-box использует собственную ширину в качестве общей ширины блока. И предыдущий код можно изменить так:

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

Ниже показано изображение, каким образом свойство box-sizing:border-box расчитывает ширину

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Когда box-sizing включен – ширина width является шириной всего блока.

Ширина контента автоматически подстраивается в зависимости от правого и левого отступа, и значений бордеров.

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

Paul Irish предлагает использовать следующий код для этого:

Свойство box-sizing не новое, и только из-за того, что оно не поддерживалось в браузерах Internet Explorer ниже 8й версии, его не применяли. Теперь, когда вышли новые версии браузеров эта техника работы с box-sizing становится популярной и рекомендуется использовать ее при создании своих сайтов. Для более полной информации о поддерживаемых браузеров, смотрите в таблице.

Также свойство box-sizing, по-умолчанию, встроено в стили популярных фреймворков Bootstrap и Foundation. Оба эти фреймворка применяют значение border-box к абсолютно всем элементам, что делает их системы более понятными.

Источник

CSS Box Sizing

Размер окна CSS

Свойство CSS box-sizing позволяет нам включать заполнение и границу в общую ширину и высоту элемента.

Без CSS окно-Изменение размера свойства

По умолчанию ширина и высота элемента вычисляется так:

Ширина + отступ + граница = фактическая ширина элемента
Высота + отступ + граница = фактическая высота элемента

Это означает, что при задании ширины/высоты элемента элемент часто отображается больше, чем задано (поскольку граница элемента и отступ добавляются к указанной ширине/высоте элемента).

На следующем рисунке показаны два элемента

Пример

.div1 <
width: 300px;
height: 100px;
border: 1px solid blue;
>

.div2 <
width: 300px;
height: 100px;
padding: 50px;
border: 1px solid red;
>

Свойство box-sizing решает эту проблему.

С помощью окна CSS-изменение размера свойства

Свойство box-sizing позволяет нам включать заполнение и границу в общую ширину и высоту элемента.

Если установить box-sizing: border-box; на элементе Padding и граница включены в ширину и высоту:

Вот такой же пример, как и выше, с box-sizing: border-box; Добавлено в оба элемента

Пример

.div1 <
width: 300px;
height: 100px;
border: 1px solid blue;
box-sizing: border-box;
>

.div2 <
width: 300px;
height: 100px;
padding: 50px;
border: 1px solid red;
box-sizing: border-box;
>

Так как результат использования box-sizing: border-box; намного лучше, многие разработчики хотят, чтобы все элементы на своих страницах работали таким образом.

Приведенный ниже код гарантирует, что все элементы имеют размер в этом более интуитивно понятным способом. Многие браузеры уже используют box-sizing: border-box; для многих элементов формы (но не все, поэтому входные и текстовые области выглядят по-разному по ширине: 100%;).

Применение этого ко всем элементам является безопасным и мудрым:

Пример

Tip: Try to remove the box-sizing property from the style element and look what happens. Notice that the width of input, textarea, and submit button will go outside of the screen.

Источник

Раз­ме­ры бло­ков, или На­зад в бу­ду­щее

Мы стоим на пороге третьей эры Открытого веба (век таблиц и однопиксельных гифов уже не более, чем история), и наши инструменты и процессы развиваются, начиная походить на инструменты обычных программистов — это скрипты сборки, препроцессоры, линтеры (при некотором приближении, напоминающие компиляторы), автоматическое тестирование и контроль версий.

Те из вас, кто помнит тяжелые старые времена, помнит и неправильную блочную модель, которую IE использовал вместо стандартной модели W3C. В этой модели рамка ( border ) и отступ ( padding ) считались частью ширины ( width ) и высоты ( height ) блока, в то время как в модели W3C отступ и рамка прибавлялись к ширине и высоте при расчёте конечных размеров блока. В модели IE свойство width отражало конечную ширину блока, в то время как в модели W3C оно отражало ширину контентной части блока (то есть части блока, в которой находится непосредственно его содержимое). Чтобы заставить IE играть по правилам, мы должны были использовать хак блочной модели Тантека Челика.

Пора переключиться на border-box? Скопировать ссылку

Использование border-box по умолчанию никогда не будет включено в стандарт, так как это скажется на отображении слишком большого количества сайтов, но не пришло ли время переключиться на использование его для всех элементов на всех проектах с помощью универсального селектора, как предлагает Пол? Об этом я думал в последнее время.

Если дело касается только моих собственных проектов или проектов с небольшими командами разработчиков, которых я знаю и с которыми могу общаться непосредственно, я думаю, сказал бы — да, это стоит сделать. Но когда речь идет о руководстве для многих разработчиков, проектах с открытым исходным кодом или демо-материалах, доступных для просмотра большому количеству пользователей, с которыми я никогда не общался, я всё ещё сомневаюсь.

За и против Скопировать ссылку

Определенно, в лагере профессионалов есть несколько наиболее известных разработчиков. Пол Айриш, несомненно, фанат своего дела. Он подытоживает разочарование от текущей модели:

Уф. Если я говорю, что ширина блока должна быть 200 пикселей, то блок должен занимать 200 пикселей по ширине, даже если у него есть отступы по 20 пикселей.

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

Джереми Кит просто называет её «очень крутой». В то же время, Стефани Рюис в удивляется в комментарии:

Мы должны лоббировать смену модели W3C. Я постоянно слышу, что разработчики разочарованы.

К слову о «неправильной блочной модели», как мы привыкли её называть. Я думаю, проблема в том, что вы не можете управлять контентной областью блока, и любое изменение отступа или рамки окажет на нее влияние. Я понимаю, что людям может быть проще оформлять блоки таким способом, но это не волшебная палочка, и вам придется смириться с другими сложностями«.

Спецификация недостаточно подробно описывает, как это должно работать, чтобы реализовать это при помощи CSS3 Box, вот что я могу сказать.

В то время как Дэвид Барон (тоже представитель Mozilla, а также рабочей группы CSS) заявляет:

Насколько я вижу, «за» и «против» таковы:

За Скопировать ссылку

Против Скопировать ссылку

Что вы думаете? Скопировать ссылку

Через неделю в блоге появилась еще одна запись, уже с результатами оригинального опроса. Мы решили опубликовать перевод записи с результатами здесь же.

Результаты опроса Скопировать ссылку

В приведённой таблице под «командным проектом» понимается проект, в котором разработчики знакомы с человеком, принимающем решение об использовании модели border-box — например, группа разработчиков в одной компании или группа друзей, с которыми вы близко общаетесь в ходе работы. Под «публичным проектом» понимается проект, в котором разработчиком может быть кто угодно, с кем вы, вероятно, не можете лично согласовать выбор модели — проект с открытым исходным кодом или публичное API.

Хотя это не окончательные результаты голосования, есть признаки того, что разработчики комфортно чувствуют себя при использовании модели border-box (или планируют её использовать) и рады использовать ее в «командных проектах». Меня немного удивило количество разработчиков, уже использующих эту модель. Число разработчиков, предпочитающих применять модель border-box в «публичных проектах» ниже, но все равно на 20% выше, чем число тех, кто не планирует этого делать. Если результаты опроса что-то значат, не удивляйтесь, если встретите все больше проектов, использующих модель, формально считающуюся неправильной.

Я оставлю опрос открытым в надежде собрать больше ответов. Но поскольку соотношение результатов в box-sizing: border-box; составило 60 к 40 в течение недели, я не жду, что результат значительно изменится.

Вы все еще можете принять участие в опросе. К сожалению, результаты опроса сейчас скрыты. Но это только подогревает наше любопытство. Расскажите: а что вы думаете о возможности выбора блочной модели? Используете box-sizing: border-box; в текущих проектах? Планируете использовать?

Источник

Свойства блочной модели CSS. Объяснение с примерами

Приветствую всех жителей хабравиля! Сегодня я подготовил для вас материал по основам по блочной модели CSS. Безусловно, многие из вас знают о чём идёт речь, но сегодня я постараюсь объяснить прописные истины более понятно и наглядно, что поможет вам создавать веб-сайты, с идеально подходящими друг другу элементами (с точностью до пикселя), и научит более точно использовать свойства размеров, полей, отступов и границ. Итак, всех приглашаю под кат и погнали!

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Оглавление

Зачем изучать блочную модель CSS?

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Блочная модель CSS состоит из свойств: box-sizing, padding и margin. Если их не использовать, то получим что-то похожее ​

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxВеб-сайт без полей и отступов

Но если вы будете правильно использовать свойства блочной модели, ваш сайт будет выглядеть так ​

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxВеб-сайт, использующий свойства блочной модели

В этой статье мы поговорим о том, как использовать эти свойства:

Как использовать свойства блочной модели CSS

Давайте посмотрим на несколько примеров, где мы можем использовать свойства блочной модели CSS. Мы собираемся проанализировать сайт, показанный выше. ​

Давайте внимательнее посмотрим на навигационную панель (navbar). Вы можете заметить разницу между примером, в котором используется свойство padding, и примером, в котором его нет:

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxЭлементы навигационной панели, использующие свойство padding

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxРаздел содержимого, использующий свойство padding

Структура блочной модели CSS

Говоря о блочной модели, стоит воспринимать её как луковицу. И эта «луковица» имеет 4 слоя:

1 слой: Content

2 слой: Padding

3 слой: Border

4 слой: Margin

1 слой блочной модели: Content

В HTML все ведет себя как ящик с контентом. Давайте вставим контент с изображением котенка. ​

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxПервый слой

2 слой блочной модели: Padding

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxВторой слой

3 слой блочной модели: Border

4 слой блочной модели: Margin

Следующим и последним слоем блочной модели CSS является слой полей. Он обертывает наш контент + отступ + границу следующим образом

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxЧетвёртый слой

Итак, давайте посмотрим, как эти свойства работают в проекте.

Как настроить проект

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Это руководство подходит для всех, в том числе для новичков. Если вы хотите писать код, выполните следующие действия.

Откройте VS Code или Codepen.io и напишите этот код ​ внутри тега body:

Очистите стили нашего браузера по умолчанию ​

Теперь давайте стилизуем наш блок ​

Все готово, приступим к программированию! ​

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Свойство Padding

Но сначала давайте обсудим практическое использование свойства padding. Затем мы увидим, как использовать это свойство.

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

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxЭлементы навигационной панели, использующие свойство padding

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxраздел содержимого с использованием свойства заполнения

Как использовать свойство padding в CSS

Ниже представлены названия четырех свойств заполнения:

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxСвойства padding

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxВторой слой

Чтобы воссоздать результаты, указанные выше, ​ напишите этот код в свой CSS: ​

Откроем консоль разработчика и перейдем в вычисляемый раздел:

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Давайте попробуем добавить отступ только к одной стороне нашего контента (только с правой стороны):

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxсвойство padding-right

Чтобы воссоздать результаты, указанные выше, ​ напишите этот код в свой CSS: ​

Теперь откройте вычисляемый раздел в консоли разработчика ​

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Свойство Border

Обычно вы будете использовать свойство border при создании кнопок. Вот демонстрация GIF ​

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxКнопки, использующие свойство Border

Обратите внимание, как появляется белая рамка вокруг кнопки, когда наводится указатель мыши на кнопку.

Как использовать свойство границы в CSS

Есть три важных параметра свойства границы:

border style: solid (сплошная линия) / dotted («точечная» линия) / dashed (пунктир)

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxСинтаксис свойства границы

Как я перечислил выше, существует три стиля свойства границы. В этом примере мы будем использовать пунктирный стиль:

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Чтобы воссоздать приведенные выше результаты, напишите этот код в своем CSS: ​

Откроем консоль и посмотрим расчеты блочной модели:

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Свойство Margin

Обычно я использую свойство margin, чтобы добавить отступ между моим контентом и экраном на макете рабочего стола. Посмотрите на эту гифку:

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxДобавление отступов на сайт

Обратите внимание, что я добавил поля к левому и правому краям веб-сайта выше ​

Вот еще один пример использования свойства margin: ​

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxДобавление отступов на сайт

Как использовать свойство margin в CSS

Margin имеет всего четыре свойства поля:

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxСвойства margin

Давайте добавим отступ к нашему контенту. Весь наш набор смещается из-за margin, как в этом GIF:

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxСмещение

Чтобы воссоздать приведенные выше результаты, напишите этот код в своем CSS: ​

Можем еще раз проверить расчеты: ​

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Давайте попробуем добавить поле только к одной стороне нашего контента (только левой стороне):

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxСвойство margin-left

Чтобы воссоздать результаты выше, напишите этот код в своем CSS ​

На консоли мы видим, что поле в 50 пикселей применено только к левой стороне

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border box

Свойство box-sizing

Это свойство определяет, как будут рассчитываться поля, отступы и границы. Есть три типа вычислений (можно называть их свойствами):

Примечание:

Мы не будем обсуждать padding-box, поскольку его поддерживает только Firefox, и он используется не очень часто.

В чем разница между content-box и border-box в CSS?

И border-box, и content-box работают одинаково. Посмотрите на эти изображения: ​

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxБлоки, использующие свойство border-box Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxБлоки, использующие свойство content-box

Итак, в чем здесь главное отличие? Разница заметна, когда мы добавляем поля, границу или отступы к нашим блокам.

Когда мы используем box-sizing: content-box, который является значением по умолчанию, он добавит поля, отступы и границы за пределами поля, например: ​

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxЗаполнение применяется стандартно

Вы также можете увидеть расчеты здесь: ​

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxРасчеты с content-box

Это означает, что все может выйти из-под контроля, и вы можете получить неожиданный результат. Это означает, что при таком подходе, будет сложно создавать адаптивные веб-сайты. Вместо этого всегда используйте свойство box-sizing: border-box.

Но когда мы используем свойство box-sizing: border-box, оно добавит поля, отступы и границы вовнутрь блока, например: ​

Что такое box sizing border box. Смотреть фото Что такое box sizing border box. Смотреть картинку Что такое box sizing border box. Картинка про Что такое box sizing border box. Фото Что такое box sizing border boxПрименение вовнутрь блока

Заключение

Вот собственно и всё. Для желающих оставлю ссылку на видео-инструкцию к данному уроку от автора (Джоя Шахеба):

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *