Блочная верстка div — основы. Способы размещения блоков горизонтально Отступ от блока css

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

Блочная модель и позиционирование

Немного повторения. В статье об упоминалось, что все блочные элементы имеют прямоугольную форму. Они располагаются на веб-странице один под другим — такой порядок следования блочных элементов называют общим потоком. Рассмотрим на примере расположение бл. эл. в общем потоке:




div-контейнер

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

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

    Порядок позиционирования в CSS определяется свойством position. Свойство position имеет пять значений:

    • static — применяется по умолчанию, и не изымается из общего потока веб-документа. К блокам с таким значением позиционирования не применимы параметры top, right, bottom и left.
    • inherit — задает блоку значения родительского элемента
    • relative — относительное поз — ие
    • absolute — абсолютное позиц — ие
    • fixed — фиксированное позицио — е

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

    Относительное позиционирование
    Относительное позиционирование подразумевает изменение положения блочного элемента исходя из его первоначального расположения. Иными словами — отправной точкой для отсчета параметров перемещения блока служат его исходные координаты.

    Вот только место, только что покинутое элементом, из общего потока не изымается. Переместившись на другую позицию, блок по-прежнему влияет на соседние веб-конструкции, как если бы, он оставался на месте.
    Предлагаю посмотреть действие свойства position: relative; на примере. Использован предыдущий код, с добавлением ширины всем блокам по 150px , также обнулены все отступы и поля по умолчанию, и еще для тега div добавили следующее:

    position:relative;
    top: 30px;
    left:80px;

    Теперь посмотрите скриншот.

    Как видите, div переместился вправо и вниз относительно своих прежних координат. Блок li остался на прежнем месте. Подняться на освободившееся место ему мешает особенность значения relative, упомянутое выше. Но есть еще одна особенность у относительного позиционирования.

    Блок div перекрыл часть нижнего элемента, это сделано специально, для наглядности. Данная особенность позволяет накладывать одни элементы дизайна на другие. В этой статье было рассмотрено лишь относительное позиционирование. Остальные значения свойства CSS position будут представлены в следующем посте.

    Часто на практике приходится решать задачу группирования и выравнивания контента средствами CSS. Сегодня мы рассмотрим основные способы размещения элементов в горизонтальный ряд.

    Материал данной статьи призван помочь начинающим веб-дизайнерам в освоении приемов верстки web-страниц.

    Из чего выбрать или методы

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

    • метод «Float»
    • метод «Inline-block»
    • метод «Table-cell»

    Каждый из них имеет свои преимущества, области применения и недостатки. Рассмотрим их по порядку.

    «Для рывка» или немного теории

    Все структурные элементы HTML можно условно разделить на:

    Инлайновые (встроенные) – типа img, span и им подобные. У нас нет возможности менять их фон и задавать им произвольные линейные размеры.

    Блочные – занимающие всю ширину родительского блока, всегда начинаются с новой строки – p, h, div .

    Наглядный пример встроенных и блочных структур приведен ниже:

    Метод «Float»

    Как уже известно (см. выше), блочный элемент размещается с новой строки вне зависимости от заданной ему ширины (width ). По этому, уменьшая горизонтальный размер div -а, в рядок блочки не построить.

    Наиболее популярный (особенно среди начинающих верстальщиков), метод решения это использование свойства float .

    CSS свойство float обрело большую популярность и практическую ценность после перехода от табличного способа верстки к блочному.

    Float: left (right) трансформирует блочный элемент в плавающий, выравнивает по левому (правому) краю родительского блока и устанавливает обтекание справа (слева) текстом и другими элементами.

    Для примера, создадим четыре блока, которые нужно разместить в ряд:

    < html> < head> < meta charset= "utf-8" > < link rel= "stylesheet" media= "all" type= "text/css" href= "style.css" /> < body> < div class = "bblock" > Строим < div class = "bblock" > горизонтальный < div class = "bblock" > ряд < div class = "bblock" > из дивов

    И внешнюю таблицу стилей с следующим содержимым:

    div { float: left; /*Задаем обтекание*/ line- height: 120px; font- size: 40px; background: dodgerblue; color: white; margin- top: 60px; width: 320px; /*Фиксируем ширину блока*/ }

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

    Иногда на практике бывает необходимо выровнять блоки по правому краю родительского элемента. Изменим обтекание блоков в предыдущем примере:

    float: right;

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

    Для того, чтобы прервать обтекание элементов с какого-то конкретного места, используйте строчку:

    < div style= "clear: both;" >

    В рассмотренном выше примере расстояния между блоками мы задавали при помощи отступа margin-right . Но что делать, если у вас при верстке страницы возникла задача: разместить блоки в ряд, центрировать их, да и еще чтобы отступы были только между ними, но никак не снаружи?

    Алгоритм действий следующий.

    < div class = "wrap" > < div class = "bblock" > Строим < div class = "bblock" > горизонтальный < div class = "bblock" > ряд < div class = "bblock" > из дивов

    Wrap { width: 1310px; /*фиксируем ширину обертки*/ margin: 0 auto; /*центрируем ее*/ background: darkgray; height: 120px; /*Задаем высоту обертки*/ } . bblock { float: left; /*Задаем обтекание*/ line- height: 120px; /*Высота строки + верт. центрирования текста*/ font- size: 40px; background: dodgerblue; color: white; width: 320px; /*Фиксируем ширину блока*/ margin- right: 10px; text- align: center; /*Центрируем текст по горизонтали*/ } . wrap : last- child { margin- right: 0px; /*Убираем поле последнего div-а*/ }

    В результате получаем такую картину:

    Ну что же, всех практических ситуаций не рассмотришь, по этому перейдем к общим особенностям.

    Важно!!!

    Метод «Inline-block»

    Как строчные так и блочные элементы имеют свои преимущества и недостатки в контексте каждой конкретной решаемой задачи. А что если объединить их преимущества?

    Встречайте, гвоздь программы – свойство display: inline-block .

    display: inline-block генерирует блочно-строчный элемент, который по сути является строчным, но сохраняет блочные свойства – позволяет изменять линейные размеры, задавать поля, отступы и т.д.

    Блочно-строчный элемент имеет следующие свойства:

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

    Рассмотрим пример создания простого навигационного меню, содержащего картинку и ссылку.

    < div class = "nav" > < p>< img src= "./vaden-pro-logo.png" alt= "" /> < p class = "string" >< a href= "#" > Ссылка меню 1 длиннее обычного < div class = "nav" > < p>< img src= "./vaden-pro-logo.png" alt= "" /> < p class = "string" >< a href= "#" > Ссылка меню 2 < div class = "nav" > < p>< img src= "./vaden-pro-logo.png" alt= "" /> < p class = "string" >< a href= "#" > Ссылка меню 3 < div class = "nav" > < p>< img src= "./vaden-pro-logo.png" alt= "" /> < p class = "string" >< a href= "#" > Ссылка меню 4

    Nav { display: inline- block; /*Задаем блочно-строчное отображение*/ width: 180px; /*задаем ширину блока*/ background: dodgerblue; } . string { text- align: center; /*Равняем текст по-горизонтали*/ }

    В результате получаем такую менюшку:

    Как видим, получилось кривовато... Но расстраиваться мы не намерены, по-этому применяем к нашим дивам CSS свойство vertical-align (подробнее см. ниже):

    vertical- align: top;

    Теперь наша навигационная панель выровнялась по верхней линии:

    Конечно, приведенный пример является примитивным, но я уверен, что на его основе вы сможете создать настоящий шедевр!!!

    Важно!!!

    • Для древних версий Firefox добавляем строчку:

      display: - moz- inline- stack;


      и оборачиваем элемент в дополнительную div-обертку.
    • IE 7 и более ранние версии - добавляем строчки:

      zoom: 1 ; /*задаем hasLayout*/ * display: inline; /*звездочка – хак для IE */ _height: 250px; /*в IE6 не работает min-height*/

    • Замечу, что на указанные строчки избирательно реагируют конкретные браузеры (на первую – Firefox, на остальные - IE).

    Метод «Table»

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

    Свойства display: table (table-cell , inline-table ), позволяют выполнять табличное форматирование элементов без применения HTML таблиц.

    Для горизонтального размещения блоков нам понадобится родительский элемент, имеющий свойство display: table , и дочерние элементы (ячейки), имеющие свойство display: table-cell :

    < div class = "wrap" > < div class = "bblock" > Строим < div class = "bblock" > табличный < div class = "bblock" > ряд < div class = "bblock" > из дивов

    Bblock { display: table- cell; font- size: 32px; width: 200px; height: 200px; background: gold; text- align: center; vertical- align: middle; } . wrap { display: table; border- spacing: 20px 20px; background- color: darkgray; }

    Важно!!!

    1. В отличии от методов «Inline-block» и «float», при уменьшении ширины окна веб-браузера, ячейки не перемещаются вниз.
    2. У вас нет возможности задавать свойство margin для ячеек псевдотаблицы.
    3. Кросс-браузерность. Свойства из семейства display: table* не поддерживаются IE6, IE7. Кроме того, в IE8 вы можете наблюдать динамическую ошибку рендеринга псевдотабличных элементов в виде рандомно пропадающих ячеек. Данная ошибка чаше всего проявляется при первичной прорисовке документа

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

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

    Дело в том, что div верстка сайта позволяет задавать множество css-свойств, недоступных для таблиц. Кроме того, самый главный недостаток табличной системы состоит в том, что таблица не будет показана на экране до тех пор, пока она не будет полностью загружена браузером. Если весь сайт сделан в таблице, то он появится на дисплее лишь после того, как будет полностью загружен весь html-код страницы.

    Тег DIV и свойство float

    Основа блочной системы — это тег

    , который является контейнером для контента. Внутри него также могут содержаться другие контейнеры
    .

    Использовать тег DIV — не сложнее, чем . Как правило, стандартная структура сайта формируется следующим образом: существует основной контейнер

    (часто ему присваивается класс с названием wrapper, container, main и т.д.). Внутри этого контейнера располагаются блоки меню, контентной части, сайдбара.

    По умолчанию, каждый новый блок располагается с новой строки. Для того, чтобы расположить блок слева или справа от другого (например, чтобы расположить сайдбар справа), используется свойство float. По умолчанию оно имеет значение «none», но можно также выставлять значения «left» и «right».

    Рассмотрим это свойство на примере с двумя блоками.

    Блок для контента
    Блок для сайдбара

    Этот код даст следующий результат:

    Свойство clear

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

    Для того, чтобы избежать этого, блочная верстка div использует свойство clear, которое должно быть задано для того блока, который мы хотим расположить с новой строки. Чаще всего для этого ему задается значение «both», но можно также задать значения «left» или «right», если мы хотим не просто расположить блок на новой строке, но и задать ему выравнивание.

    Дополним вышеуказанный пример новым элементом:

    Блок для контента
    Блок для сайдбара
    Новый блок, расположенный снизу

    Результат:

    Отступы в блочной верстке

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

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

    Margin: 20px 10px 0 40px

    Блок с такими параметрами будет располагаться на 20 пикселей ниже вышестоящего элемента, на десять пикселей от правостоящего элемента, будет иметь нулевой отступ снизу и будет иметь отступ размером в 40 пикселей слева.

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

    Можно также задавать отдельные свойства для отдельных граней с помощью margin-top, margin-bottom, margin-left, margin-right (и аналогично для padding). В таком случае, если какая-то из граней не будет указана, то отступ с ее стороны будет равен нулю или будет определен общими свойствами css, заданными для блоков на странице.

    Любой блочный элемент состоит из набора свойств, подобно капустным листам накладываемых друг на друга. Основой блока выступает его контент (это может быть текст, изображение и др.), ширина которого задается свойством width , а высота через height ; вокруг контента идут поля (padding ), они создают пустое пространство от контента до внутреннего края границ; затем идут собственно сами границы (border ) и завершают блок отступы (margin ), невидимое пустое пространство от внешнего края границ. Порядок влияния этих свойств на блок четко определён и не может быть нарушен. На рис. 3.1 показан блок в виде набора этих свойств.

    Рис. 3.1. Свойства, формирующие блочный элемент

    Для наглядности свойства блока можно представить в виде матрёшек (рис. 3.2). Любую маленькую матрёшку можно вставить в более крупную матрёшку, но никак не наоборот.

    Рис. 3.2. Матрёшки

    На деле ни одно из этих свойств не является обязательным, в том числе и контент, поэтому вы можете формировать любые блоки, содержащие комбинации свойств padding , border и margin или вообще обойтись без них.

    Поля

    Полем будем называть расстояние от внутреннего края границы или края блока до воображаемого прямоугольника, ограничивающего содержимое блока. Из-за того, что значения полей могут различаться на каждой стороне, применяют выражения «верхнее поле» или «поле сверху», и им подобные для других сторон. Обозначение «поля» следует понимать как одинаковое значение полей для всех сторон. Основное предназначение полей - создать пустое пространство вокруг содержимого блочного элемента, например текста, чтобы он не прилегал плотно к краю элемента. Использование полей повышает читабельность текста и улучшает внешний вид страницы. В примере 3.1 показано использование полей для оформления текста.

    Пример 3.1.Использование свойства padding

    Поля

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

    Результат примера показан на рис. 3.3.

    Рис. 3.3. Поля вокруг текста

    Значения полей не могут быть отрицательными.

    Границы

    Границы это линии вокруг полей элемента на одной, двух, трёх или всех четырёх его сторонах. У каждой линии есть толщина, стиль и цвет. Для создания рамки применяется универсальное свойство border одновременно задающее все эти параметры, а для создания линий на отдельных сторонах элемента можно воспользоваться свойствами border-left , border-top , border-right и border-bottom , соответственно устанавливающих границу слева, сверху, справа и снизу. В примере 3.2 показано добавление линии слева от элемента.

    Пример 3.2. Красная пунктирная линия

    XHTML 1.0 CSS 2.1 IE Cr Op Sa Fx

    Линия

    Результат данного примера показан на рис. 3.4.

    Рис. 3.4. Линия возле текста

    Расстояние от линии до текста регулируется значением padding .

    Отступы

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

    Для отступов характерны следующие особенности.

    • Отступы прозрачны, на них не распространяется цвет фона или фоновая картинка, заданная для блока. Однако если фон установлен у родительского элемента, он будет заметен и на отступах.
    • Отступы в отличие от полей могут принимать отрицательное значение, это приводит к сдвигу всего блока в указанную сторону. Так, если задано margin-left : -10px , это сдвинет блок на десять пикселов влево.
    • Для отступов характерно явление под названием «схлопывание», когда отступы у близлежащих элементов не суммируются, а объединяются меж собой.
    • Отступы, заданные в процентах, вычисляются от ширины контента блока. Это касается как вертикальных, так и горизонтальных отступов.

    В примере 3.3 показано схлопывание отступов и их прозрачность.

    Пример 3.3. Использование отступов

    XHTML 1.0 CSS 2.1 IE Cr Op Sa Fx

    Отступы

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

    Результат данного примера показан на рис. 3.5. Обратите внимание, что расстояние между блоками равно 20 пикселов, а не 40, которые получаются суммированием верхнего и нижнего отступа у блоков. Это происходит за счёт эффекта схлопывания, при котором близлежащие отступы объединяются.

    Рис. 3.5. Отступы в элементе

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

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

    • width - ширина контента, т.е. содержимого блока;
    • padding-left и padding-right - поле слева и справа от контента;
    • border-left и border-right - толщина границы слева и справа;
    • margin-left и margin-right - отступ слева и справа.

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

    Рис. 3.6. Ширина блока

    Если значение width не задано, то оно по умолчанию устанавливается как auto . В этом случае ширина блока будет занимать всю доступную ширину при сохранении значений полей, границ и отступов. Под доступной шириной в данном случае подразумевается ширина контента у родительского блока, а если родителя нет, то ширина контента браузера.

    Допустим, для слоя написан следующий стиль.

    Width: 300px; /* Ширина контента */ margin: 7px; /* Значение отступов */ border: 4px solid black; /* Параметры границы */ padding: 10px; /* Поля вокруг текста */

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

    Ширина = 300 + 7 + 7 + 4 + 4 + 10 + 10 = 342

    Надо отметить, что блочная модель с формированием ширины несет в себе кучу неудобств. Постоянно приходится заниматься вычислениями, когда требуется задать определенную ширину блока. Также начинаются проблемы при сочетании разных единиц измерения, в частности, процентов и пикселов. Предположим, что ширина контента задана как 90%, если сюда приплюсовать поля и границы, заданные в пикселах, то нельзя вычислить суммарную ширину блока, поскольку проценты напрямую в пикселы не переводятся (в CSS3 так суммировать можно, только поддерживается эта возможность далеко не всеми браузерами). В итоге может получиться так, что общая ширина блока превысит ширину веб-страницы, что приведёт к появлению горизонтальной полосы прокрутки. Выходов из подобной ситуации два - поменять алгоритм блочной модели и воспользоваться вложенными слоями.

    Алгоритм блочной модели

    Как уже упоминалось, ширина блока формируется из ширины контента и значений полей, границ и отступов. В браузере Internet Explorer в режиме совместимости (иными словами, когда не указан доктайп) алгоритм меняется автоматически и ширина всего блока устанавливается равной width . Остальные браузеры так просто не меняют алгоритм, к тому же вы знаете, что режим совместимости это зло. В CSS3 есть замечательное свойство box-sizing , которое нам и пригодится. При значении border-box ширина начинает включать поля и границы, но не отступы. Таким образом, подключая box-sizing со значением border-box к своему стилю, мы можем задавать ширину в процентах и спокойно указывать border и padding , не боясь, что изменится ширина блока. К сожалению, с этим свойством связана небольшая проблема, как обычно относящаяся к браузерам - не все браузеры его понимают. Радует, что браузеры хотя бы поддерживают специфические для каждого браузера свойства. В табл. 3.1 приведена поддержка браузерами.

    Табл. 3.1. Поддержка браузерами свойства box-sizing
    Браузер Internet Explorer Chrome Opera Safari Firefox
    Версия 8.0+ 2.0+ 7.0+ 3.0+ 1.0+
    Свойство box-sizing -webkit-box-sizing box-sizing -webkit-box-sizing -moz-box-sizing

    Как видно из таблицы, в свойствах разброд и шатание, поэтому придется делать гибрид и указывать все три свойства одновременно (пример 3.4).

    Пример 3.4. Ширина блока

    XHTML 1.0 CSS 3 IE 7 IE 8+ Cr Op Sa Fx

    Ширина блока

    Ширина блока 100%

    Данный пример будет работать во всех браузерах, указанных в табл. 3.1, однако невалиден в CSS3 из-за применения нестандартных свойств начинающихся на -moz и -webkit. Ширина блока составляет 100% с учетом значений padding . Без свойства box-sizing в браузере появится горизонтальная полоса прокрутки.

    Вложенные слои

    Использование свойства box-sizing всем хорошо, кроме того, что не работает в старых версиях IE. Если вы верстаете сайт с учетом IE7 и IE6, вам подойдёт старый проверенный метод с вложением слоев. Идея простая - для внешнего блочного элемента задаётся только необходимая ширина, а для вложенного блока всё остальное - поля, границы и отступы. Поскольку по умолчанию ширина блока равна доступной ширине родителя, получится, что блоки в каком-то смысле накладываются друг на друга, при этом фактическая ширина такого комбинированного элемента будет чётко задана. В примере 3.5 показано использование вложенных слоев.

    Пример 3.5. Вложенные слои

    XHTML 1.0 CSS 2.1 IE Cr Op Sa Fx

    Ширина блока

    Ширина слоя 100%

    Результат данного примера показан на рис. 3.7.

    Рис. 3.7. Ширина блока в процентах

    Преимуществом вложенных слоев является использование отступов (box-sizing их не учитывает), универсальность метода, также то, что фон по желанию можно добавлять к одному или другому слою. Тем самым несколько меняется внешний вид элементов, это особенно актуально при включении фоновых рисунков. Из недостатков метода можно отметить добавление дополнительного блока, который усложняет структуру кода, особенно при частом применении метода. Но это можно считать мелочью по сравнению с преимуществами.

    На высоту блока действуют те же правила, что и на ширину. А именно, высота складывается из значений высоты контента (height ), полей (padding ), границ (border ) и отступов (margin ). Если свойство height не указано, то оно считается как auto , в этом случае высота контента вычисляется автоматически на основе содержимого. На рис. 3.8 показаны свойства, дающие итоговую высоту, которая обозначена чёрной пунктирной линией.

    Рис. 3.8. Высота блока

    Вместе с тем, несмотря на схожесть принципов построения ширины и высоты, у них есть существенные различия. Это касается того случая, когда значение width и height не указано, тогда по умолчанию оно принимается как auto . Для ширины блока - это максимально доступная ширина контента, а для высоты блока - это высота контента. Также для ширины блока известна ширина родителя, даже если она не указана явно. Это позволяет устанавливать значение width в процентах. Использование же процентов для height ни к чему не приведёт, потому что высота родителя не вычисляется и её надо указывать. В примере 3.6 показано, как задать высоту блока в процентах.

    Пример 3.6. Высота блока

    XHTML 1.0 CSS 2.1 IE Cr Op Sa Fx

    Высота блока

    Высота слоя 100%

    Результат данного примера показан на рис. 3.9.

    Рис. 3.9. Высота блока в процентах

    Для тега

    в примере родителем выступает тег , поэтому для него устанавливаем значение height равным 100%. В то же время на действуют те же правила, что и на
    , поэтому величина в процентах будет вычисляться не от высоты страницы, а от высоты контента. Так что для родителя , которым является тег , также требуется поставить значение height равным 100%. Только в этом случае высота блока в процентах будет зависеть от высоты страницы.

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

    С высотой связана ещё одна особенность - при превышении содержимого блока его размеров при заданной высоте, содержимое начинается отображаться поверх блока (рис. 3.10).

    Рис. 3.10. Превышение размеров блока

    Код, приводящий к подобному результату, приведен в примере 3.7.

    Пример 3.7. Превышение размеров блока

    XHTML 1.0 CSS 2.1 IE Cr Op Sa Fx

    Высота блока

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

    Охотничий участок льва может иметь длину и ширину до тридцати километров.

    Чтобы избежать подобных неприятностей, высоту контента лучше не задавать, тогда высота блока будет вычисляться автоматически. Впрочем, бывают случаи, когда высота должна быть чётко указана, тогда рекомендуется к стилю добавить свойство overflow со значением auto или hidden . Результат у них разный, auto добавляет полосы прокрутки автоматически, когда они требуются (рис. 11а), hidden скрывает всё, что не помещается в заданные размеры (рис. 11б).

    а. Значение auto

    б. Значение hidden

    Рис. 11. Использование свойства overflow

    Фон

    Если задать одновременно цвет фона и пунктирную границу блока, то становится заметно, что граница проходит внутри цветной области. Правда в разных браузерах наблюдается разночтение, в частности Internet Explorer до версии 7.0 включительно содержит ошибку, при которой фон выводится по внутреннему краю границы (рис. 12в). Начиная с версии 8.0 эта ошибка исправлена, и фон выводится по стандартам (рис. 12г). Браузеры Opera (рис. 12а), Firefox (12б), Safari и Chrome (рис. 12д) фон выводят правильно. Небольшие различия наблюдаются при отображении пунктирной рамки, но они не влияют на блочную модель.

    д. Safari, Chrome

    Рис. 12. Отображение фона в браузере

    В примере 3.8 показано, как создать код для получения подобной границы.

    Пример 3.8. Фон и граница

    XHTML 1.0 CSS 2.1 IE 7 IE 8+ Cr Op Sa Fx

    Рамка

    Опаньки...

    Различия в подходе браузеров при рисовании границ заметны только на цветном фоне и пунктирных линиях. Для сплошной рамки вид блока в браузерах будет практически одинаковым.

    Блочная модель CSS в английском языке называется Box model (box - это коробка). Этот перевод немного помогает понять суть блочной модели. Суть в том, что при формировании страницы на экране используются блоки - прямоугольные области экрана.

    Блочная модель CSS - это одна из основ для понимания CSS, модель форматирования документа.

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

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

      И

      .
    • Строчные элементы - теги которые не создают своих блоков, а влияют на отображение содержимого блока. Пример таких тегов - , , и другие.

    Давайте на примере рассмотрим отличия этих групп элементов.

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

    Блок тега p. Этот кусок текста выделен тегом em.

    Этот пример наглядно показывает что теги

    И

    создают свои блоки. Каждый блок начался с новой строки. Для блока
    была задана ширина и высота, а блок

    Занял всю ширину экрана, его высота равна высоте его содержимого. Чтобы это было видно, для обоих элементов установлен жёлтый фоновый цвет.

    Тег просто отформатировал текст внутри блока

    Подробнее про блоки.

    Любой блочный элемент имеет установленный набор свойств, которые можно менять при помощи CSS.

    Основа блока - его контент или содержание, ширина поля контента задаётся свойством width , а высота свойством height . Но у блока есть и другие поля, они как листья капустны накладываются друг на друга.

    Проще показать это в виде рисунка.

    Мы видим, что кроме самого поля контента, у блока есть ещё три свойства:

    • Внутренний отступ - padding - по английский "набивка". Набивка - то, что набито, чем заполнена внутренность чего-либо. padding - это часть блока от края контента до границы.
    • Граница - border - по английский и есть "граница". Границу блочного элемента можно установить разными стилями: сплошной линией, точками, пунктиром; можно установить цвет границы. Подробно о том, как управлять свойством border речь пойдёт ниже.
    • Внешний отступ - margin - по английски "маржа". В экономическом значении маржа значит разницу между себестоимостью и ценой.

    В рамках этой статьи свойство outline мы рассматривать не будем. Только отмечу: на размер блока это свойство не влияет.

    Остальными свойствами можно управлять при помощи CSS устанавливая их размер и некоторые другие стилевые значения. Давайте рассмотрим это на примере.

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

    Блок тега div.

    Блок тега p. Этот абзац имеет знаяения свойств по умолчанию.

    Стиль: padding: 10px.

    Стиль: margin: 30px.

    Результат должен быть такой:


    Рисунок 2. Работа примера №2.

    Мы видим чёрную (black ) рамку толщиной 3px вокруг блока, созданного тегом

    . Первый абзац отформатирован по умолчанию, за исключением фонового цвета. Во втором абзаце установлен внутренний отсуп (padding ) размером 10px , видно что вокруг текста площадь заливки фоновым цветом увеличилась. Третий абзац не имеет внутреннего отступа, но задан внешний отступ margin размером 30px . Мы видим что расстояне между этим и вторым абзацем больше, чем между вторым и первым - это работает внешний отступ.

    Границы и отступы не являются обязательными свойствами блока, значения всех их может быть равно нолю.

    Как устанавливаются фоновые цвета для этих свойств?

    • Внутренний отступ - padding - всегда имеет цвет фона самого элемента, заданного в свойстве background-color .
    • Граница - border - её цвет задаётся свойством border-color .
    • Внешний отступ - margin - он всегда прозрачен, поэтому цвет этой области совпадает с фоновым цветом элемента родителя (в нашем случае это белый фоновый цвет элемента установленный по умолчанию).

    Расширенные возможности управления свойствами блока

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


    Рисунок 3. Блочная модель CSS.

    Рассмотрим подробнее свойства блоков и приведём примеры их использования.

    Внутренний отступ - padding

    Внутренний отступ - padding - расстояние от внутреннего края границы до условного прямоугольника, ограничивающего контент блока. Так как внутренний отступ может быть разным у каждой стороны блока, то говорят «верхний внутренний отступ» или «отступ сверху». Стоит отметить что в разных книгах по CSS для свойства padding используются различные переводы, в некоторых он называется просто отступ, в других поле, а отступом называют свойство margin .

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

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

    Результат должен быть такой:

    Рисунок 4. Работа примера №3.

    Мы видим красиво оформленный блок с внутренними отступами до границы.

    Граница - border

    Границы - это линии вокруг внутреннего содержимого элемента. Границу можно установить для всех сторон блока, или для любого числа. Для границы можно задать толщину, стиль и цвет. Для создания рамки (границы), как писалось ранее, в CSS существует свойство border . В этом свойстве можно прописать все характеристики рамки (толщину, стиль и цвет). А для создания границ на отдельных сторонах блока нужно воспользоваться свойствами border-top , border-right , border-bottom и border-left .

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

    Результат выполнения кода должен быть такой:


    Рисунок 5. Работа примера №4.

    Внешний отступ - margin

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

    Особенности внешних отступов.

    • Внешний отступ всегда прозрачен. Он не принимает цвет фона или фоновое изображение установленное для блока, к которому он относится. Однако, он принимает фон родительского элемента.
    • Внешние отступы суммируются. Если между блоками заданы отступы по 25px, то расстояние между ними будет не 50px, а 25px, так как внешние отступы накладываются друг на друга.
    • Для внешнего отступа можно задавать отрицательное значение. Такое значение сдвигает блок, например объявление margin-left : -20px сдвинет блок влево на двадцать пикселей.
    • Отступы можно задавать в процентах, такие отступы вычисляются от размера блока контента. Это будет делаться в отношении как горизонтальных, так и вертикальных отступов.
    Блочная модель CSS

    Прошли тысячелетия. Механизм, предназначенный для работы вечно, остановился. Системы жизнеобеспечения были повреждены.

    Прошли тысячелетия. Механизм, предназначенный для работы вечно, остановился. Системы жизнеобеспечения были повреждены.

    Странник оглянулся вокруг. Во всех направлениях до горизонта была пустыня.

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

    Рисунок 6. Работа примера №5.

    Для тега

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

    Один тег

    Помещён в блок

    с установленным фоновым цветом. Видно что внешний отступ тега

    Принял фоновый цвет тега

    . А теги

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

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

    Задано объявление margin : 20px , видно что внешние отступы абзацев сливаются и расстояние между абзацами равно не 40px, а 20px.

    Ширина блока - составная величина, она складывается из суммы значений нескольких свойств:

    • width - ширина содержимого блока;
    • padding-left и padding-right - внутренний отступ слева и справа от содержимого;
    • border-left и border-right - толщина границы слева и справа;
    • margin-left и margin-right - внешний отступ слева и справа.

    Значения некоторых свойств могут быть равны нолю, тогда они не влияют на ширину блока.

    На рисунке 7 блок обозначен чёрной пунктирной линией.


    Рисунок 7. Ширина блока.

    Если в блоке значение width не задано в таблице стилей, то оно устанавливается по умолчанию как auto . В этом случае поле контента займёт всю доступную ширину (родительский блок или, если его нет, окно браузера), но размеры всех отступов и граница при этом сохранятся.

    Посчитаем ширину блока на примере следующего стиля:

    Width: 400px; /* Ширина блока */ padding: 5px; /* Отступ до границы */ border-width: 3px; /* Толщина границы */ margin: 7px; /* Внешний отступ */

    Сложим все слагаемые, составляющие ширину блока:

    Ширина блока = 400 + 5*2 + 3*2 + 7*2 = 430px.

    Устаревшая блочная модель

    Исторически так сложилось, что метод расчёта ширины блока описанный выше использовался не всегда. На данный момент он является стандартом, принятым концерном W3C. Но раньше свойство width не было равно полю контента, а представляло собой постранство блока, которое включает свойство border . Источником такой блочной модели была компания MicroSoft и на её основе работал браузер Internet Explorer до версии 7. На рисунке продемонстрировано сравнение двух блочных моделей.

    Рисунок 8. Две блочные модели.

    В сети сохранилось огромное количество старых документов, которые создавались в старой блочной модели, которую также называют «режим совместимости». Поэтому списывать её со счетов не стоит.

    Важно знать : если в документе на задан , то браузеры переходят в режим совместимости.

    Свойство box-sizing

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

    Подробно вникать в суть проблему не будем, это не уровень этой статьи. Тут только отмечу, что устаревшая система иногда оказывается полезной. Для возможности менять алгоритм блочной модели в CSS3 ввели полезное свойство box-sizing . При значении border-box ширина блока начинает включать поля и границы, но не внешние отступы. Таким образом, назначая свойству box-sizing значение border-box , мы можем задавать ширину блока width в процентах и спокойно указывать свойства border и padding нужной нам величины, не боясь, что изменится ширина блока.

    При формировании высоты блока используется та же формула, что и при формировании ширины блока. Высота блока - это сумма высоты поля контента, границы, внутреннегот и внешнего отступов (верхних и нижних конечно же). Если значение свойства height не указано, то по умолчанию устанавливается значение auto , в этом случае высота поля контента вычисляется автоматически и зависит от самого контента.

    На рисунке 9 показаны все свойства, из которых складывается суммарная высота блока, обозначенного чёрным пунктиром.


    Рисунок 9. Высота блока.

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

    Давайте сразу передём к примеру и рассмотрим случай, в котором свойствам блока width и height назначены значения 200% .

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

    Блоку также задан фоновый цвет, чтобы была видна его площадь. Вот как он выглядит:

    Рисунок 10. Работа примера №6.

    Мы видим что по горизонтали образовалась полоса прокрутки, размер которой в два раза превышает размер окна браузера, т.е. блок по ширине всегда равен 200% от родительского элемента - окна браузера. Но во вертикали такого эффекта нет. Использование процентов для указания высоты не имеет смысла, так как высота высота родителя по умолчанию не существует и её надо указывать.

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

    Блок с шириной = 200% и высотой = 100%.

    Тут родительскому элементу для

    - тегу , установлена высота величиной 50px, и высота для
    установлена 100%. То есть этот тег имеет высоту 50px.

    Рисунок 11. Работа примера №7.

    Видно, что площадь окрашенная в цвет #F3F3D6 увеличилась. Если окно браузера ещё уменьшить по высоте, то появится вертикальная полоса прокрутки, чего в прошлом примере не было.

    Если в этом примере Но как сделать так, чтобы задать блоку параметр height в процентах и это работало. Попробуйте изменить прошлый пример и для селектора body установить свойство height равное 100% . Такой пример работат не будет. Почему? Потому что для тега высота определяется относительно его родителя - тега , а там высота не задана. Значит 100% от ничего равно ничего. Чтобы решить эту проблему нужно написать такой стиль:

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

    Блок с шириной и высотой = 200%.

    Только установив высоту в 100% для тегов и мы сможем установить высоту в процентах для тега

    и она будет работать.

    Рисунок 12. Работа примера №8.

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

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

    Прошли тысячелетия. Механизм, предназначенный для работы вечно, остановился. Системы жизнеобеспечения были повреждены.

    На примере видно, что текст вышел за границы блока.

    Рисунок 13. Работа примера №9.

    Избежать подобного очень просто - достаточно не задавать высоту контента (height ). Впрочем, иногда нужно строго определить высоту блока. В этом случае можно использовать свойство overflow со значением auto . Это свойство будет в блоке создавать полосу прокрутки в случае, если размер контента привысит размер блока.

    Добавим в стиль примера №9 свойство overflow со значением auto и результат будет таким:

    Рисунок 14. Свойство overflow со значением auto.

    У свойства overflow есть другое значение, которым также можно регулировать высоту блока - hidden (англ. скрытый). Это значение просто скрывает всё, что не влазит в установленные размеры блока.

    Рисунок 14. Свойство overflow со значением hidden.

    Минимальная и максимальная ширина элемента

    В этой статье также уместно вспомнить свойства min-width и max-width устанавливающие минимальную и максимальную ширину элемента соответственно.

    Свойство min-width работает так: если пользователь меняет размеры окна браузера, то ширина блока не становиться меньше минимальной, а в таком случае появляется полоса прокрутки. Значение ширины элемента будет зависеть от значений свойств width , max-width и min-width .

    В таблице приведены правила расчёта браузерами ширины блока при использовании этих свойств.

    Табл. 1. Ширина элемента
    Значения свойств Ширина
    min-width < width < max-width width
    min-width > width > max-width min-width
    min-width > width < max-width min-width
    min-width < width width
    min-width > width min-width
    min-width > max-width min-width
    min-width < max-width max-width

    Свойство max-width - устанавливает максимальную ширину элемента. Пример использования свойства max-width :

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

    Прошли тысячелетия. Механизм, предназначенный для работы вечно, остановился. Системы жизнеобеспечения были повреждены.

    Странник оглянулся вокруг. Во всех направлениях до горизонта была пустыня.

    Минимальная и максимальная высота элемента

    Аналогично есть свойства для назначения минимальной и максимальной высоты элемента: min-height и max-height .