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

Часть II

Кувалдин Артем
Разработчик интерфейсов

Позиционирование элементов

Position

– устанавливает способ позиционирования элемента относительно окна браузера или других объектов на веб-странице.

position: static | relative

Position: relative

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

box
box
box

– для задания смещения используются свойства top | right | bottom | left.

div { position: relative; }
.top { top: 10px; }
.right { right: 10px; }
.bottom { bottom: 10px; }
.left { left: 10px; }
.bottom-right { bottom: 10px; right: 10px; }
.top-left { top: 10px; left: 10px; }
top
right
bottom
left
top left
bottom right
div {position: relative;}
.top { top: -10px; }
.right { right: -10px; }
.bottom { bottom: -10px; }
.left { left: -10px; }
.bottom-right { bottom: -10px; right: -10px; }
.top-left { top: -10px; left: -10px; }
top
right
bottom
left
top left
bottom right
div {
    right: -20px;
    left: -20px;
}
.parent {
    direction: rtl;
}
.rtl,
.ltr {
    right: -20px;
    left: -20px;
}
left to right
من اليمين إلى اليسار
.box1 {
    top: -20px;
    bottom: -20px;
}
.box2 {
    top: 20px;
    bottom: 20px;
}
box1
box2
.box1 {
    top: 50%;
    left: 50%;
}
.box2 {
    bottom: 50%;
    right: 50%;
}
.wrap { height: 300px; }
box1
box1

box2
box2

Размеры

width: auto по содержимому или всё пространство
width: 50% от ширины родителя
height: auto по содержимому
height: 50%; от высоты родителя, если его высота отлична от auto
padding: 50% от ширины родителя
margin: 50% от ширины родителя
w3c

Содержащий блок

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

  • Для корневых элементов – это прямоугольник размерами с вьюпорт
  • Для элементов position: relative | static – это границы контента ближайшего предка блочного уровня
  • Относительно спозиционированный блок создаёт новый содержащий блок

Position

position: static | relative | absolute

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

  • Содержащим блоком является ближайший предок c position: relative | absolute | fixed
  • inline, inline-block, table-... -> block
  • У абсолютно спозиционированных элементов не схлапываются внешние отступы
w3c
wrapper
box1
box2
.box {
    position: absolute;
}
wrapper
.box1
.box2

Позиционируется относительно первого предка, у которого position ≠ static (содержащий блок). Если такого нет – позиционируется относительно корневого элемента.

.box {
    position: absolute;
    top: 0;
    left: 0
}
wrapper
.box1
.box2

Позиционируется относительно первого предка, у которого position ≠ static (содержащий блок). Если такого нет – позиционируется относительно корневого элемента.

.wrap {
    position: relative;
}
.box {
    position: absolute;
    top: 0;
    left: 0
}
wrapper
.box1
.box2
.box1 {
    position: absolute;
    right: 0;
    bottom: 0;
}
.box2 {
    position: absolute;
    top: 0;
    left: 0;
}
wrapper
.box1
.box2

.box1 {
    position: absolute;
    top: 10px;
    right: 20px;
    bottom: 30px;
    left: 40px;
}


wrapper
.box1

Можно задавать значения в %. Раccчитываются относительно размеров содержащего блока.

.box1 { position: absolute;
    top: 0;
    right: 50%;
    bottom: 50%;
    left: 0;
}
.box2 { position: absolute;
    top: 50%;
    right: 0;
    bottom: 0;
    left: 50%;
}
wrapper
.box1
.box2

Размеры

width/height: auto по содержимому или координатам
width/height: 50% от ширины/высоты содержащего блока
padding: 50% от ширины содержащего блока
margin: 50% от ширины содержащего блока
Интерактив w3c

Position

position: static | relative | absolute | fixed

Содержащий блок у fixed элементов – это всегда вьюпорт. Во всех случаях.

wrapper
fixed
.fixed {
    position: fixed;
    width: 50%;
    top: 100px;
    left: 100px;
}
Пример

Position

position: static | relative | absolute | fixed | sticky

Элемент отображается как относительно спозиционированный до тех пор, пока не пересечёт специальную границу и тогда он ведёт себя как position fixed.

A
Andrew W.K.
Apparat
B
Battle
...
.dt {
    position: sticky;
    top: 0;
}
Пример

Наложения элементов

Z-ось

viewport
box1
box2
box3

Если элементы находятся в равных условиях – элемент, который находится ниже в потоке, будет выше по оси Z.

box1
box2
box3
.box2, .box3 {
    margin-top: -20px;
}
viewport
box1
box2
box3

z-index

Каждый элемент может находиться как ниже, так и выше других объектов веб-страницы, их размещением по z-оси и управляет z-index.

.box {
    position: relative; /*absolute | fixed*/
    /*z-index: n; где n ∈ Z | auto*/
    z-index: 1;
}

Про z-index

Но не всё так просто...

Контекст наложения

Элементы с общими родителями, перемещающиеся на передний или задний план вместе, известны как контекст наложения.

Условия создания контекста наложения:

  • Если элемент – корневой элемент документа (html)
  • Если элемент позиционирован не статически и его значение z-index не равно auto
  • Если элемент имеет прозрачность менее 1

Нельзя расположить элемент из одного контекста ноложения между элементами другого контекста

Порядок наложения

viewport
7 Элемент (и их потомки) с z-index > 0
6 Элемент (и их потомки) с z-index = 0 или auto. opacity < 1
5 Элементы inline уровня
4 Плавающие элементы
3 Элементы блочного уровня в нормальном потоке
2 Позиционированный элемент (и его дети) с z-index < 0
1 Background и border элемента
red box
green box text!
blue box
viewport
red box
green
box
text!
blue box
red
green
blue
.red {
    position: relative;
    /*z-index: auto;*/
}
viewport
position: relative
display: block;
display: block;
  1. Background и border элемента, который создаёт контекст наложения
  2. Позиционированный элемент (и его дети) с z-index < 0.
  3. Элементы блочного уровня в нормальном потоке
  4. Плавающие элементы
  5. Элементы inline уровня
  6. Позиционированный элемент (и их потомки) с z-index = 0 или auto. opacity < 1
  7. Позиционированный элемент (и их потомки) с z-index > 0
red
green
blue
.red {
    opacity: .99;
}
viewport
opacity: 0.99;
display: block;
display: block;
  1. Background и border элемента, который создаёт контекст наложения
  2. Позиционированный элемент (и его дети) с z-index < 0.
  3. Элементы блочного уровня в нормальном потоке
  4. Плавающие элементы
  5. Элементы inline уровня
  6. Позиционированный элемент (и их потомки) с z-index = 0 или auto. opacity < 1
  7. Позиционированный элемент (и их потомки) с z-index > 0
red
green
blue
.red { position: relative;
    z-index: 0;
}
.green { position: relative;
    z-index: 1;
}
viewport
position: relative;
z-index: 0;
position: relative;
z-index: 1;
display: block;
  1. Background и border элемента, который создаёт контекст наложения
  2. Позиционированный элемент (и его дети) с z-index < 0.
  3. Элементы блочного уровня в нормальном потоке
  4. Плавающие элементы
  5. Элементы inline уровня
  6. Позиционированный элемент (и их потомки) с z-index = 0 или auto. opacity < 1
  7. Позиционированный элемент (и их потомки) с z-index > 0
red
green
blue
.red {
    position: relative;
    z-index: 0;
}
.green {
    position: relative;
    z-index: -1;
}
viewport
position: relative;
z-index: 0;
position: relative;
z-index: -1;
display: block;
  1. Background и border элемента, который создаёт контекст наложения
  2. Позиционированный элемент и его дети) с z-index < 0.
  3. Элементы блочного уровня в нормальном потоке
  4. Плавающие элементы
  5. Элементы inline уровня
  6. Позиционированный элемент (и их потомки) с z-index = 0 или auto. opacity < 1
  7. Позиционированный элемент (и их потомки) с z-index > 0
red
green
blue
.wrap { opacity: 0.99; }
.red {
    position: relative;
    z-index: 999;
}
.green {
    position: relative;
    z-index: 0;
}
viewport
opacity: 0.99;
position: relative;
z-index: 999;
position: relative;
z-index: 0;
display: block;
  1. Background и border элемента, который создаёт контекст наложения
  2. Позиционированный элемент (и его дети) с z-index < 0.
  3. Элементы блочного уровня в нормальном потоке
  4. Плавающие элементы
  5. Элементы inline уровня
  6. Позиционированный элемент (и их потомки) с z-index = 0 или auto. opacity < 1
  7. Позиционированный элемент (и их потомки) с z-index > 0
red
green
blue
.red {
    position: relative;
    z-index: 999;
}
.green {
    position: relative;
    z-index: -999;
}
viewport
position: relative;
z-index: 999;
position: relative;
z-index: -999;
display: block;
  1. Background и border элемента, который создаёт контекст наложения
  2. Позиционированный элемент (и его дети) с z-index < 0.
  3. Элементы блочного уровня в нормальном потоке
  4. Плавающие элементы
  5. Элементы inline уровня
  6. Позиционированный элемент (и их потомки) с z-index = 0 или auto. opacity < 1
  7. Позиционированный элемент (и их потомки) с z-index > 0

z-index hell

Группировка z-index

  • 1000–1999 – шапка
  • 2000–2999 – диалоговые окна
  • 3000–3999 – попапы
  • 4000–4999 – suggests

ДЗ 2015

Подсветка строк и колонок в таблице.

td { position: relative; }
td::after {
    position: absolute;
    left: 0;
    top: -5000px;

    width: 100%;
    height: 10000px;

    z-index: -1;

    content: '';
}
z-index: 1;
z-index: -1;

Плавающие элементы

Свойство float


.box {
    /*float: left | right | none*/
    float: left;
}
  • Элемент вынимается из потока и сдвигается влево (для left) или вправо (для right) до того как коснётся либо границы родителя, либо другого элемента с float
  • inline элементы «знают» о float и обтекают элемент по сторонам
  • Создают блочный контекст форматирования
  • Ширина float блока определяется по содержимому
  • Вертикальные отступы margin элементов с float не сливаются с отступами соседей
Float
float-left
Текст или inline-элементы
float-right
Текст или inline-элементы
.float-left {
    float: left;
}
.float-right {
    float: right;
}

Inline элементы избегают float элементы

float-left
Дренаж, вследствие пространственной неоднородности почвенного покрова, упруго дает агрегат. Ожелезнение иссушает осадочный денситомер одинаково по всем направлениям. Заиливание сжимает комковато-порошистый сушильный шкаф.
float-right
Дренаж, вследствие пространственной неоднородности почвенного покрова, упруго дает агрегат.
float-left
Текст или inline-элементы
float-right
Текст или inline-элементы
.float-left {
    float: left;
}
.float-right {
    float: right;
}

Блоки игнорируют float элементы

float-left
Дренаж, вследствие пространственной неоднородности почвенного покрова, упруго дает агрегат. Ожелезнение иссушает осадочный денситомер одинаково по всем направлениям. Заиливание сжимает комковато-порошистый сушильный шкаф.
float-right
Дренаж, вследствие пространственной неоднородности почвенного покрова, упруго дает агрегат.

Отступы не схлапываются

1
margin-right: 20px;
2
margin: 20px;
3

Где 4-ый будет?

1
2
3
4

Где 4-ый будет?

1
2
3
4

Где 4-ый будет?

1
2
3
4

Где 4-ый будет?

1
2
3
4

Где 4-ый будет?

1
2
3
4

Cвойство clear

.box {
    /*clear: left | right | both*/
    clear: left;
}

Применение этого свойства сдвигает элемент вниз до тех пор, пока не закончатся float'ы слева/справа/с обеих сторон.

clear: left

.wrapper {
    clear: left;
}
float: left;
float: right;
wrapper 1
wrapper 2

clear: right

.wrapper {
    clear: right;
}
float: left;
float: right;
wrapper 1
wrapper 2

clear: both

.wrapper {
    clear: both;
}
float: left;
float: right;
wrapper 1
wrapper 2

Блочный контекст форматирования

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

  • float элементы
  • position: absolute | fixed;
  • display: inline-block | table-cell | table-captions (не блочные элементы)
  • блочные элементы c overflow: hidden | auto;
Block formatting contexts
.wrapper1 {
    overflow: hidden;
}
float: left;
float: right;
wrapper 1
wrapper 2
.wrapper2 {
    overflow: hidden;
}
float: left;
float: right;
wrapper 1
wrapper 2
float: left;
box
.box {
   overflow: hidden;
}
float: left;
box

Что будет?

float: left;
float: left;
float: left;
float: left;

Меняем порядок

b1
b2
b3
b4
div { float: right }
b1
b2
b3
b4

Трехколоночный макет

left
right
center
.left { float: left }
.right { float: right }
.center { overflow: hidden }
body { width: 50% }
left
right
center

Спасибо

ДЗ

https://github.com/urfu-2016/markup-task-6