Skip to content

Latest commit

 

History

History
335 lines (282 loc) · 21.4 KB

text.md

File metadata and controls

335 lines (282 loc) · 21.4 KB

Модель отображения

Все есть блоки

В HTML документ все есть блоки, но как эти блоки взаимодействуют и как располагаются на странице? Рассмотрим в сегодняшней лекции.

![Все есть блоки](./img/2015-10-17 14-17-01 Яндекс.png) В HTML-документе каждому элементу на странице соответствует прямоугольная область (бокс или блок). Движок рендеринга в браузере определяет размеры и положение боксов на странице, а также их свойства вроде цвета, фоновой картинки для того, чтобы отобразить их на экране.

В языке CSS есть специальная боксовая модель (также блоковая модель или блочная модель, англ. box model), которая описывает, из чего состоит бокс и какие свойства влияют на его размеры. В ней у каждого бокса есть 4 области: margin (внешние отступы), border (рамка), padding (внутренние поля, набивка), и content (контент или содержимое).

Внутренняя область элемента (content area) содержит текст и другие элементы, расположенные внутри (контент или содержимое). У неё часто бывает фон, цвет или изображение (в таком порядке: фоновый цвет скрывается под непрозрачным изображением), и она находится внутри content edge; её размеры называются ширина контента (content width или content-box width), и высота контента (content height или content-box height). Иногда еще говорят «внутренняя ширина/высота элемента»

Ширина элемента расчитывается по формуле

ширина элемента = width + padding-left + padding-right + border-left + border-right

высота элемента = height + padding-top + padding-bottom + border-top + border-bottom

Бокс

Размеры содержимого (content size)

Любой блок имеет ширину и высоту содержимого кооторые можно задать при помощи css правил.

div {
   width: 200px;
   height: 200px;
}

Ширину и высоту можно ограничить как снизу так и сверху, использую свойства min/max-width

div {
  max-width: 100px;
  min-width: 10px
}

Если не задана ширина - в некоторых вслучаях блок заполнит все свободно пространство(в ширину), в других случаях будет зависеть от ширины содержимого(такста, других элементов). Если не задана высота, то высота элемента = высоте содержимого

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

margin

Отступы (margin area) добавляют пустое пространство кокруг элемента и определяют расстояние до соседних элементов.

Величина отступов задается по отдельности в разных направлениях свойствами margin-top, margin-right, margin-bottom, margin-left или общим свойством margin. Если значение не установлено - значение = 0(зависит от элемента)

div {
  margin-top: 10px;
  margin-right: 11px;
  margin-bottom: 12px;
  margin-left: 13px;
}
/*Сокращенная форма записи*/
p {
 /*margin: [top] [right] [bottom] [left]*/
  margin: 10px 11px 12px 13px;
}
p {
 /* 3 парметра*/
 /*margin: [top] [right & left] [bottom]*/
  margin: 10px 11px 12px;
}
p {
 /* 2 парметра*/
 /*margin: [top & bottom] [right & left]*/
  margin: 10px 11px;
}
p {
  /* 1 парметр*/
 /*margin: [top & bottom & right & left]*/
  margin: 10px;
}

Если указать другие единицы измерения (Пример):

  • em - считается относительно размера шрифта родителя
  • rem - считается относительо размера шрифта корневого элемента
  • vw/vh - рачитывается отсительно размеров viewport(1vw = 1% от viewport`а )
  • % - считается относительно ширины радителя и margin-top/bottom не исключение

padding

Поля элемента (padding area) — это пустая область, окружающая контент. Она может быть залита каким-то цветом, покрыта фоновый картинкой, а её границы называются край поля (padding edge). Если значения padding = 0, то padding edge схлапывается с content edge

Размеры полей задаются по отдельности с разных сторон свойствами padding-top, padding-right, padding-bottom, padding-left или общим свойством padding. Пример

border

Область рамки (border area) окружает поля элемента, а ее граница называется край рамки (border edge). Ширина рамки задается отдельным свойством border-width или в составе свойства border. Размеры элемента с учетом полей и рамки иногда называют внешней шириной/высотой элемента.

div {
  border-width: 1px;
  /*top | right | bottom | left*/
  border-width: 1px 2px 3px 4px;
  /*thin | medium | thick*/
  border-width: thin;
}

Рамке можно задавать цвет(border-color) и стиль(border-style) при помощи свойств (w3c)

box-sizing

Если элементу явно не задавать ширину - элемент займет всю ширину своего родителя(т.е. ширина самого элемента займет всю ширину). Ширина содержимого(content width) будет расчитываться автоматически относительно padding, border, margin. width = element width - padding-left - padding-right - margin-left - margin-right - border-left-width - border-right-width(Пример)

Если элементу ЯВНО задать ширину то ширина самого элемента будет расчитывать по формуле:

Element width = width + padding-left + padding-right + border-left + border-right

(Пример) и элемент может вылезти за границы своего родителя.

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

Свойство box-sizing позволяет изменить этот алгоритм, чтобы свойства width и height задавали размеры не контента, а размеры блока.

Значения свойства box-sizing:

  • content-box - Основывается на стандартах CSS, при этом свойства width и height задают ширину и высоту контента и не включают в себя значения отступов, полей и границ.
  • padding-box(только в FF) - Свойства width и height включают в себя значения полей, но не отступов (margin) и границ (border).
  • border-box - Свойства width и height включают в себя значения полей и границ, но не отступов (margin). Эта модель используется браузером Internet Exporer в режиме совместимости.
/*box-sizing: content-box | border-box | padding-box*/
width: 200px;
padding: 10px;
margin: 10px;
border: 1px solid;

Пример

Поток документа

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

Элементы можно вкладывать друг в друга. Чем раньше в коде расположен элемент, тем выше он расположен на странице. Любой элемент с позиционированием static (position: static;) находится в общем потоке документа. Пример элементов в потоке

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

Существует несколько основных типов элементов:

  • Блочные элементы
  • Строчные элементы

Блочные элементы

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

Анонимные боксы

Анонимный бокс - это бокс, к которому нельзья обратиться из css.

Блочные элементы(по-умолчанию):

  • p
  • h1, h2, h3, h4, h5, h6
  • ol, ul
  • pre
  • address
  • blockquote
  • dl
  • div
  • fieldset
  • form
  • hr
  • table

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

div {
  width: 200px;
  height: 200px;
}

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

Можно задавать внутренние отступы(padding):

div {
  padding: 10px 11px 12px 13px;
}

Если для блока задана ширина, и добавить внетренние отступы - ширина элемента видимой части элемента(без margin) = ширина контента + отступы справа и слева. Аналогично высота элемента = высота контента + внетренние отступы по вертикали. (Пример) Что бы этого избежать можно использовать свойство box-sizing(см. выше) Если ширину не задавать, то элемент займет всю ширину и будет от этой ширины отталкиваться(т.е. ширина содержимого будет меняться, а не ширина самого элемента, см, выше)

Можно задавать отступы внешние(margin)

div {
  margin: 10px 11px 12px 13px;
}

Значения можно указывать в %, em, rem, vw, vh и т. д. Если указывать значени в процентах - значение расчитывается от ШИРИНЫ родителя(неважно, по горизонтали или по-вертикали, Пример, сделано это для того что бы не уйти в рекурсию по высоте).

Схлапывание внешних отступов. Если расположить блочные элементы друг за другом и указать им вертикальные отступы - то между элементами будет отступ = max(margin-bottom(вержнего элемента), margin-top(нижнего элемента))

.box1{
  margin: 10px 0;
}
/*Расстояние межде box1 и box2 будет 20px*/
.box2{
  margin: 20px 0;
}
/*Расстояние межде box2 и box3 будет 30px*/
.box3{
  margin: 30px 0;
}

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

Схлапывание отступов между родителем и потомком(для вертикальных отступов).

h1 {
  margin: 0;
}
div {
  margin: 40px 0 25px 0;
}
p {
  margin: 20px 0 0 0;
}
<h1>Heading content</h1>
<div>
  <p>Paragraph content</p>
</div>

Пример

результат

Возможно вы ожидали, что отступ от p до div будет 20px. Отступ просочится через родительский элемент наружу. Назвревает вопрос: "Как же тогда сдалать отступ относительно родителя?". Для этого нужно у родительского элемента указать padding или border не нулевой.

h1 {
  margin: 0;
}
div {
  margin: 40px 0 25px 0;
  border-top: 1px solid #000;
}
p {
  margin: 20px 0 0 0;
}
<h1>Heading content</h1>
<div>
  <p>Paragraph content</p>
</div>

Пример

результат

Если не хочется чтобы были границы(border) обычно используют padding: 1px и значение margin уменьшают на 1px

margin: auto

У margin есть значение auto, которое автоматически расчитывается браузером. Если ширина не задана - margin: auto; то же самое что margin: 0;. Если ширина указана - значени auto расчитывается автоматически.

<div class=ml>margin-left: auto</div>
<div class=mr>margin-right: auto</div>
<div class=m>margin: 0 auto</div>
div {
  width: 200px;
}
.ml {
  /*По-правому краю*/
  margin: 0 0 0 auto;
}
.mr {
  /*По-левому краю(по умолчанию)*/
  margin: 0 auto 0 0;
}
.m {
  /*По центру*/
  margin: 0 auto;
}

Пример

Инлайн элементы

Инлайн(inline) элементы располагаются друг за другом в одной строке, при необходимости строка переносится.

Особенности строчных элементов:

  1. До и после строчного элемента отсутствуют переносы строки.
  2. Ширина и высота строчного элемента зависит только от его содержания, задать размеры с помощью CSS нельзя.
  3. Можно задавать только горизонтальные отступы(горизонтальные отступы не схлапываются).
<p>Some <em>emphasized</em> text</p>

Элемент P - блочный элемент с нескольким инлайн-элементами внутри. "emphasized" - инлайн элемент, но другие элементы ("Some" и "text") являются инлайн-элементами созданные блочным элементом P(это и есть анонимный инлайн бокс). Такие анонимные инлайн боксы наследуют некоторые свойства от родителей. Ненаслудуемые свойства устанавлиаются по умолчанию. Например цвет унаследуется от родителя, а фон останется прозрачным.

Пример

Строчные элементы(по умолчанию):

  • b, big, i, small, tt
  • abbr, acronym, cite, code, dfn, em, kbd, strong, samp, var
  • a, bdo, br, img, map, object, q, script, span, sub, sup
  • button, input, label, select, textarea

Инлайн контекст форматирования:

  • Можно увеличить размеры элемента за счет увеличения размера шрифта или размера высоты строки (свойства line-height, Пример, относительные размеры считаются относительноо размера шрифта элемента к которому применено свойство).
  • Можно указвать внутренние отступы, правда только горизонтальные отступы будут будут влиять на окружающий контент (Пример).
  • Можно указывать внешние отступы, которые так же как и внутренние отступы влияют на окружающий контент только по горизонтали (Пример).
  • Можно указывать вертикально выравнивание отсительно друг друга при помощи свойства vertical-align: top | bottom | middle | baseline (Пример)

Инлайн-блочные элемента

Особенности инлайн-блочных элементов:

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

У всех элементов по-умолчанию установлено свойствао display, которое отвечает за тип контейнера (а иногда ещё и контейнера-потомка), который будет сгенерирован элементом.