Раскладки и сетки

Лена Рашкован

Что такое раскладки и сетки

Устаревшие способы раскладки

Современный способ: флексбокс

Современный способ: грид

Как выбрать, какой способ использовать

Немножко про домашку

Раскладка (layout)

взаимное расположение основных элементов страницы.

Раскладки блоков

Сетка (grid)

система непечатаемых линий,
разделяющих страницу.

Большинство дизайнеров
используют сетки для организации
элементов*

- 1 -

Сетка задаёт стандарт
расположения элементов.

Легко выравнивать

Легко добавлять новые

Легче переносить элементы
между страницами

- 2 -

Сетка придаёт странице
гармоничный вид.

Элементы пропорциональны
и структурированы

Сбалансированный макет

Использование сеток полезно
и для разработчиков!

- 3 -

Проще делать адаптивный дизайн.

Адаптивный дизайн

- 4 -

Можно работать без дизайнера.

Проще добавлять страницы,
которых не было в исходном дизайне.

Пользователи тоже любят сетки

- 5 -

Сетка создает на странице ритм.

Приятно для глаз

Удобно читать и искать

- 6 -

Пользователи привыкли к паттернам.

Легче ориентироваться

Быстрее считывать информацию

*Иногда правила осознанно нарушаются

чтобы привлечь внимание

Больше креатива

Мем про анатомию осы

Анатомия сетки

Формат (format)

здесь будет дизайн

лист A4, визитка, окно браузера

Поля (margins)

Поля

отступы от границ формата до контента

Колонки (columns)

Колонки

чем больше колонок, тем гибче сетка

Строки (rows)

Строки

есть в модульных сетках

Модуль (module)

Модуль

основная единица измерения сетки

Модуль (module)

Лежит в основе композиции страницы.
Все элементы пропорциональны модулю.

Делить страницу на модули придумали в середине ХХ века, чтобы упростить конструирование печатного макета.

Идея пришла из архитектуры.

Модуль в архитектуре


от лат. modulus – маленькая мера

Служит для придания соразмерности всему сооружению или его частям.

Модулем часто был конструктивный элемент — кирпич, каменный блок, бревно.

Модуль в античной архитектуре

В античной ордерной системе модулем был радиус колонны у её основания.

В японских жилых домах модулем является размер циновки — татами (90 х 180 см).


Модуль

Область (region)

Область

группа смежных модулей, эл-т композиции

Интервалы (gutters)

Интервалы

пробельные шаги, канавки, желобки???

Направляющие (lines)

Направляющие

формируют стартовые и конечные позиции

Колонтитул (marker)

Колонтитул

названия глав, номера страниц

Основные виды сеток

симметричныеасимметричные

книжные (manuscript)

колоночные (column)

модульные (modular)

иерархические (hierarchical)

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

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

в документах, книгах, презентациях,
везде, где много текста

Книжная сетка в документах
Книжная сетка в книгах

Колоночная сетка

Колоночная сетка

в газетах, журналах и вебе

Симметричная колоночная сетка

Симметричные колоночные сетки

Асимметричная колоночная сетка

Асимметричные колоночные сетки
Колоночная сетка в газете

Блоки текста и изображения разносят по колонкам, чтобы было легче читать.

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

Колоночная сетка в журнале
Колоночная сетка в блоге

Колоночные сетки популярны в вебе


Ширина экрана конечна

Высота может быть любой,
если экран скроллится


Часто используется для построения адаптивных раскладок

Адаптивная раскладка

Адаптивная раскладка, мобильные

Адаптивная раскладка

Адаптивная раскладка, планшеты

Адаптивная раскладка

Адаптивная раскладка, десктопы

Модульная сетка

Модульная сетка

карточки товаров, галерея изображений

Модульная сетка
Модульная сетка
Модульная сетка

Иерархическая сетка

Иерархическая сетка

в вебе: контент в порядке
убывания важности

Иерархическая сетка

Как теперь всё это закодить?

Таблицы
Таблицы разметка

col 1 col 2 col 3
Таблицы результат

1 2 3
Таблицы переполнение контентом

1 2 3
Таблицы резюме

  • колонки выравниваются по высоте
  • адекватна при переполнении
  • куча лишней разметки
  • не семантично
Флоаты
Флоаты разметка

col 1
col 2
col 3
Флоаты результат

1
2
3


Эффект схлапывания родительского блока, если все дочерние зафлоачены

Это лечится распоркой, или clearfix

clear: both

Флоаты результат c распоркой

1
2
3
Флоаты переполнение контентом

1
2
3
Флоаты резюме

  • можно задавать размеры
  • мало разметки
  • колонки не выравниваются по высоте
  • спецэффекты и хаки
  • перекрытие контента при переполнении
Инлайн-блоки
Инлайн-блоки разметка

col 1
col 2
col 3
Инлайн-блоки результат

1
2
3

Пробелы в HTML-коде.
Инлайн-блоки ведут себя как текст.

Лечится по-разному, например, font-size: 0

Инлайн-блоки результат без пробелов

1
2
3
Инлайн-блоки переполнение контентом

1
2
3
Инлайн-блоки выравнивание

1
2
3
Инлайн-блоки резюме

  • реагируют на выравнивание
  • можно задавать размеры
  • переносятся
  • лишние пробелы
  • при переполнении всё может развалиться
  • колонки не выравниваются по высоте
Чем будем раскладывать?

  • таблицы — для табличных данных
  • флоаты — для обтекания текстом
  • инлайн-блоки — только как фолбек
  • флексбокс 👍
  • грид 👍

Флексбокс

flex = гибкий

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

display: flex

флекс-контейнер (flex-container)

флекс-элемент (flex-item)

главная ось (main axis)

поперечная ось (cross axis)

Флекс-элементы располагаются вдоль главной оси.


Свойство flex-direction меняет её направление.

flex-direction: row


по умолчанию



жадина
говядина
солёный
огурец

flex-direction: row-reverse





жадина
говядина
солёный
огурец

flex-direction: column



жадина
говядина
солёный
огурец

flex-direction: column-reverse



жадина
говядина
солёный
огурец

Свойство justify-content управляет выравниванием флекс-элементов вдоль главной оси.

justify-content: flex-start


по умолчанию



жадина
говядина
пустая
шоколадина

justify-content: flex-end





жадина
говядина
пустая
шоколадина

justify-content: center





жадина
говядина
пустая
шоколадина

justify-content: space-between





жадина
говядина
пустая
шоколадина

justify-content: space-around





жадина
говядина
пустая
шоколадина

Поперечная ось всегда перпендикулярна главной оси.


Направление изменить нельзя.



Свойство align-items управляет выравниванием флекс-элементов вдоль поперечной оси.

align-items: stretch


по умолчанию


жадина
говядина
турецкий
барабан

align-items: flex-start




жадина
говядина
турецкий
барабан

align-items: flex-end




жадина
говядина
турецкий
барабан

align-items: center




жадина
говядина
турецкий
барабан

align-items: baseline




жадина
говядина
турецкий

align-self даёт переопределить выравнивание у флекс-элемента.


Значения те же, что и у align-items.


нам
сказали
стоять
в начале
а я буду стоять где захочу

Что если флекс-элементов
много?


надо что-то
написать
чтобы элементов
было
очень много

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


надо что-то
написать
чтобы элементов
было
очень много
и создавалась
иллюзия
что это
осмысленный текст
но смысла
в нём нет
как и в жизни

Переносом элементов управляет свойство flex-wrap, и по умолчанию перенос запрещён.

flex-wrap: nowrap wrap



надо что-то
написать
чтобы элементов
было
очень много
и создавалась
иллюзия
что это
осмысленный текст
но смысла
в нём нет
как и в жизни

flex-wrap: wrap-reverse



надо что-то
написать
чтобы элементов
было
очень много
и создавалась
иллюзия
что это
осмысленный текст
но смысла
в нём нет
как и в жизни

Можно комбинировать направление и перенос в свойстве flex-flow:

.container {
  display: flex;
  flex-flow: row wrap;
}

Когда перенос разрешён, в контейнере образуются строки.

Cвойство align-content управляет распределением строк флекс-элементов вдоль поперечной оси.

align-content: stretch

по умолчанию


надо что-то
написать
чтобы элементов
было
очень много
и создавалась
иллюзия
что это
осмысленный текст
но смысла
в нём нет
как и в жизни

align-content: flex-start



надо что-то
написать
чтобы элементов
было
очень много
и создавалась
иллюзия
что это
осмысленный текст
но смысла
в нём нет
как и в жизни

align-content: flex-end



надо что-то
написать
чтобы элементов
было
очень много
и создавалась
иллюзия
что это
осмысленный текст
но смысла
в нём нет
как и в жизни

align-content: center



надо что-то
написать
чтобы элементов
было
очень много
и создавалась
иллюзия
что это
осмысленный текст
но смысла
в нём нет
как и в жизни

align-content: space-between



надо что-то
написать
чтобы элементов
было
очень много
и создавалась
иллюзия
что это
осмысленный текст
но смысла
в нём нет
как и в жизни

align-content: space-around



надо что-то
написать
чтобы элементов
было
очень много
и создавалась
иллюзия
что это
осмысленный текст
но смысла
в нём нет
как и в жизни

Если активно align-content,
то что с align-items?

align-content: stretch; align-items: center


надо что-то
написать
чтобы элементов
было
очень много
и создавалась
иллюзия
что это
осмысленный текст
но смысла
в нём нет
как и в жизни

Порядок

order: 0

по умолчанию


раз
два
три
четыре
пять
раз 0
два 0
три 0
четыре 0
пять 0

order: [положительное число]



раз
два
три
четыре
пять
раз 0
два 0
три 1
четыре 0
пять 0

order: [отрицательное число]



раз
два
три
четыре
пять
раз 0
два 0
три -1
четыре 0
пять 0

Размеры

Cвойство flex-basis задает размер по главной оси.

Если не указать, то базовый размер возьмётся из ширины или высоты.

flex-basis: 50%


50% по горизонтали
auto

50% по вертикали
auto

Почему размер базовый?

Это исходный размер.

Свободное место можно распределять в соответствии с коэффициентом жадности флекс-элемента (flex-grow).

flex-grow: 0


по умолчанию


😑 0
😐 0
😑 0

flex-grow: 1




😑 0
😜 1
😑 0

flex-grow: 2




😑 0
😒 1
😎 2

Как вычисляется итоговый размер?

  1. Посчитаем свободное место:
    free space = width - ∑ flex-basis
  2. Посчитаем долю свободного места:
    fraction = free space / ∑ flex-grow
  3. Вычислим итоговый размер:
    final size = flex-basis + (fraction × flex-grow)
На размер свободного места ещё могут влиять рамки и отступы :)

Давайте посчитаем


😑 0
😒 1
😎 2
width = 980px
flex-basis = 2×10px + 2×10px + 25px = 65px
  • free space = 980px - 3 × 65px = 785px
  • fraction = 785px / (0 + 1 + 2) = ~262px
  • final size1 = 65px + (262px × 0) = 65px;
  • final size2 = 65px + (262px × 1) = ~326px;
  • final size3 = 65px + (262px × 2) = ~589px;

Что если сумма базовых размеров больше, чем свободного места?

Отрицательное пространство тоже можно распределять в соответствии с коэффициентами сжатия (flex-shrink).

flex-shrink: 1


по умолчанию


😒 ? 1
😜)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) 1
плак ;( 1

flex-shrink: 0




😎 ! 0
😜)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) 1
плак ;( 1

flex-shrink: 0




😎 ! 0
😜)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) 1
не плак :) 0

Хардкорный алгоритм расчёта

С помощью сокращённого свойства flex можно одновременно задать
флекс-элементу flex-grow, flex-shrink
и flex-basis.

flex: [flex-grow] [flex-shrink] [flex-basis]

.elem {
  flex: initial; /* = 0 1 auto — все по умолчанию */









}

flex: [flex-grow] [flex-shrink] [flex-basis]

.elem {
  flex: initial; /* = 0 1 auto — все по умолчанию */
  flex: auto;    /* = 1 1 auto */








}

flex: [flex-grow] [flex-shrink] [flex-basis]

.elem {
  flex: initial; /* = 0 1 auto — все по умолчанию */
  flex: auto;    /* = 1 1 auto */
  flex: none;    /* = 0 0 auto */







}

flex: [flex-grow] [flex-shrink] [flex-basis]

.elem {
  flex: initial; /* = 0 1 auto — все по умолчанию */
  flex: auto;    /* = 1 1 auto */
  flex: none;    /* = 0 0 auto */
  flex: 2;       /* число -> flex-grow,
                    = 2 1 auto */





}

flex: [flex-grow] [flex-shrink] [flex-basis]

.elem {
  flex: initial; /* = 0 1 auto — все по умолчанию */
  flex: auto;    /* = 1 1 auto */
  flex: none;    /* = 0 0 auto */
  flex: 2;       /* число -> flex-grow,
                    = 2 1 auto */
  flex: 50%;     /* единица измерения длины -> flex-basis = 50%,
                    = 0 1 50% */



}

flex: [flex-grow] [flex-shrink] [flex-basis]

.elem {
  flex: initial; /* = 0 1 auto — все по умолчанию */
  flex: auto;    /* = 1 1 auto */
  flex: none;    /* = 0 0 auto */
  flex: 2;       /* число -> flex-grow,
                    = 2 1 auto */
  flex: 50%;     /* единица измерения длины -> flex-basis = 50%,
                    = 0 1 50% */
  flex: 2 50%;   /* flex-grow & flex-basis,
                    = 2 1 50% */

}

flex: [flex-grow] [flex-shrink] [flex-basis]

.elem {
  flex: initial; /* = 0 1 auto — все по умолчанию */
  flex: auto;    /* = 1 1 auto */
  flex: none;    /* = 0 0 auto */
  flex: 2;       /* число -> flex-grow,
                    = 2 1 auto */
  flex: 50%;     /* единица измерения длины -> flex-basis = 50%,
                    = 0 1 50% */
  flex: 2 50%;   /* flex-grow & flex-basis,
                    = 2 1 50% */
  flex: 2 0 50%;
}
Особенности внешних отступов:

  • часть базового размера элемента
  • соседние складываются
  • отступ с auto заберет все свободное место по своему направлению

Как можно выровнять элемент по центру?

Родителю — display: flex,
ребёнку — margin: auto


стою по-царски по центру и чихал на все выравнивания
caniuse.com/#feat=flexbox ↑2.91%

Полезные ссылки


  1. Гайд по флексбоксу
  2. Flexbox Playground
  3. Игра для изучения флексбокса

Грид

grid = сетка

Даёт возможность располагать элементы по сетке!

display: grid

грид-контейнер (grid-container)

грид-элемент (grid-item)

линия (grid-line)

ячейка (grid-cell)

область (grid-area)

дорожка (grid-track)

интервал (grid-gap)

Чтобы наполнить сетку колонками и строками существуют свойства
grid-template-columns и grid-template-rows.

.container {
  display: grid;
  grid-template-columns: 100px auto 100px; /* ширины столбцов */
  grid-template-rows: 100px 100px 100px;   /* высоты рядов    */
}
1 2 3 4
1 2 3 4
.container {
  display: grid;
  grid-template-columns: 100px auto 100px; /* ширины столбцов */
  grid-template-rows: 100px 100px 100px;   /* высоты рядов    */
}
a
1 2 3 4
1 2 3 4
a
.container {
  display: grid;
  grid-template-columns: 100px auto 100px; /* ширины столбцов */
  grid-template-rows: 100px 100px 100px;   /* высоты рядов    */
}
a
b
1 2 3 4
1 2 3 4
a
b
.container {
  display: grid;
  grid-template-columns: 100px auto 100px; /* ширины столбцов */
  grid-template-rows: 100px 100px 100px;   /* высоты рядов    */
}
a
b
c
1 2 3 4
1 2 3 4
a
b
c
.container {
  display: grid;
  grid-template-columns: 100px auto 100px; /* ширины столбцов */
  grid-template-rows: 100px 100px 100px;   /* высоты рядов    */
}
a
b
c
d
1 2 3 4
1 2 3 4
a
b
c
d
.container {
  display: grid;
  grid-template-columns: 100px auto 100px; /* ширины столбцов */
  grid-template-rows: 100px 100px 100px;   /* высоты рядов    */
}
a
b
c
d
e
1 2 3 4
1 2 3 4
a
b
c
d
e
.a {
  grid-row: 1 / 2;
  grid-column: 1 / 4;
}

1 2 3 4
1 2 3 4
a
b
c
d
e
.a {
  grid-row: 1 / 2;
  grid-column: 1 / 4;
}

.b {
  grid-row: 2 / 4;
  grid-column: 1 / 2;
}

1 2 3 4
1 2 3 4
a
b
c
d
e
.a {
  grid-row: 1 / 2;
  grid-column: 1 / 4;
}

.b {
  grid-row: ➩ 1 / 4;
  grid-column: 1 / 2;
}

1 2 3 4
1 2 3 4
a
b
c
d
e
.a {
  grid-row: 1 / 2;
  grid-column: 1 / 4;
  ➩ z-index: 1;
}
.b {
  grid-row: 1 / 4;
  grid-column: 1 / 2;
}
1 2 3 4
1 2 3 4
a
b
c
d
e
.a {
  grid-column: span 3;
}

    
1 2 3 4
1 2 3 4
a
b
c
d
e
.a {
  grid-column: span 3;
}

    
.b {
  grid-row: span 2;
}
1 2 3 4
1 2 3 4
a
b
c
d
e

Размер дорожки можно указывать в fr – долях свободного места.

Свободное место вычисляется после расположения всех элементов фиксированных размеров.

.container {
  display: grid;
  grid-template-columns: 100px 1fr 1fr;
  grid-template-rows: 100px 100px 100px;
}
1 2 3 4
1 2 3 4
a
b
c
d
e

В контейнере можно создавать именованные области с помощью свойства grid-template-areas.

Поместить элемент в область можно свойством grid-area.

.container {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 100px 100px 100px;
  grid-template-areas: 'sand  water'
                       'sand  water'
                       'grass grass';
}
.a {
  grid-area: grass;
}
.b {
  grid-area: sand;
}
.c {
  grid-area: water;
}
a
b
c
.container {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 100px 100px 100px;
  grid-template-areas: 'sand  water'
                       'sand  water'
                       '.     grass';
}
.a {
  grid-area: grass;
}
.b {
  grid-area: sand;
}
.c {
  grid-area: water;
}
a
b
c

Свойство grid-template:

.container
{
  display: grid;
  grid-template: 'header  header'  100px
                 'sidebar content' 1fr
                 'footer  footer'  100px
                  / 300px 1fr;
}

Используя свойство grid-gap, можно управлять размером интервалов между линиями.

Интервал только между строками — grid-row-gap, только между колонками — grid-column-gap.

.container {
  grid-column-gap: 1%;
  grid-row-gap: 16px;
}
a
b
c
d
e

12 одинаковых колонок

Писать руками?

.container {
  grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr...;
}

Есть функция repeat()

.container {
  grid-template-columns: repeat(12, 1fr);
}
caniuse.com/#feat=css-grid ↑5.63%

Полезные ссылки


  1. Grid Explained In 7 Minutes
  2. Гайд по гриду
  3. Grid By Example
  4. Игра для изучения грида

Флексбокс или грид?

Флексбокс
Грид

1
2
3

.container {
  display: flex;
}
.column-i {
  flex: auto;
}
.container {
  display: grid;
  grid-template-columns:
              1fr 1fr 1fr;
}
Флексбокс
  • одно измерение
    — строка или колонка

  • главное — элементы и их распределение
Грид
  • два измерения
    — строки и колонки

  • главное — сетка
Home
Logout
Флексбокс
.header {
  display: flex;
  align-items: center;
}


.logout {
  margin-left: auto;
}
Грид
.header {
  display: grid;
  grid-template-columns:
                repeat(10, 1fr);
}
.logout {
  grid-column: 10;
}

Подходы можно совмещать

.container {
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  grid-template-rows: 50px 350px 50px;
}
.header {
  display: flex;
  align-items: center;
}
.logout {
  margin-left: auto;
}
.header {
  grid-column: span 12;
}
.menu {
  grid-column: span 2;
}
.content {
  grid-column: span 10;
}
.footer {
  grid-column: span 12;
}

Две новости

Используя флексбокс и грид,
можно сверстать всё что угодно

А таблицы пригодятся для вёрстки электронных писем

Про домашку

Медиа-выражения –

условное применение CSS-правил.

Одна разметка, разные наборы стилей.

Задаются с помощью at-правила @media, за которым следует условие:
Media Type задает тип устройства

  • all – все устройства (по умолчанию)
  • print — принтеры и режим предпросмотра
  • screen — устройства с экраном
  • speech — скринридеры
Media Features задают технические характеристики устройства

  • width – ширина вьюпорта
  • height — высота вьюпорта
  • orientation — ориентация вьюпорта
  • resolution — разрешение устройства вывода
Ширина вьюпорта
/* для мобильных */
body {
  background: red;
}

/* для планшетов */
@media screen and (min-width: 768px) {
  body {
    background: yellow;
  }
}

/* для десктопов */
@media screen and (min-width: 1280px) {
  body {
    background: blue;
  }
}

Полезные ссылки


  1. @media на MDN
  2. Responsive Design Tutorial