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

Часть II

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

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

Position

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

position: static | relative

Position: relative

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

– для задания смещения используются свойства 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%;
}
box1
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

Можно задавать значения в %. Расчитываются относительно размеров СОДЕРЖАЩЕГО блока.

.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 элементов – это всегда viewport. Во всех случаях.

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.

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

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

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

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

3-е ДЗ

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

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;
}

Инлайн элементы избегают 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
Задание 5

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;
  • элементы блочного уровня(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;

Спасибо

Кувалдин Артем
akuv@yandex-team.ru

ДЗ

https://github.com/urfu-2015/verstka-tasks-6

Deadline
12 ноября
02:59:59.999