🔍 Начните печатать, чтобы искать по книге или перейти к нужной странице по номеру
Удобно листать не только прокруткой, но и клавишами‑стрелками:
Эта книга — пошаговая инструкция по вёрстке сайтов на языках ХТМЛ и ЦСС. Вы узнаете не только как сверстать сайт, но и как опубликовать его в интернете, настроить красивый шаринг в соцсети и подключить системы аналитики.
Отдельный раздел книги посвящён работе с верстальщиком: как ставить задачи, получать предсказуемый результат и правильно принимать и внедрять вёрстку.
Знакомство с ХТМЛ и ЦСС
Модули
Расстановка
Страницы
Спецэффекты
Контроль качества
Публикация
Как работать с верстальщиком
Эта книга — пошаговая инструкция по вёрстке сайтов на языках ХТМЛ и ЦСС. Вы узнаете не только как сверстать сайт, но и как опубликовать его в интернете, настроить красивый шаринг в соцсети и подключить системы аналитики.
Отдельный раздел книги посвящён работе с верстальщиком: как ставить задачи, получать предсказуемый результат и правильно принимать и внедрять вёрстку.
Знакомство с ХТМЛ и ЦСС
Модули
Расстановка
Страницы
Спецэффекты
Контроль качества
Публикация
Как работать с верстальщиком
flex-basis часто используют для вёрстки по сетке. Например, так может выглядеть простейшая сетка на 4 колонки.
Начнём с разметки. Без стилей колонки заняли всё доступное пространство.
<div class="row">
<div class="col-4">
<!-- Колонка на всю ширину страницы -->
</div>
</div>
<div class="row">
<div class="col-3">
<!-- Колонка на три четверти страницы -->
</div>
<div class="col-1">
<!-- Колонка на четверть страницы -->
</div>
</div>
<div class="row">
<div class="col-1">
<!-- Колонка на четверть страницы -->
</div>
<div class="col-1"></div>
<div class="col-1"></div>
<div class="col-1"></div>
</div>Стилизуем .row — флекс‑контейнер, этаж сетки. Теперь колонки прижались друг к другу у левого края.
.row {
display: flex;
flex-direction: row; /* Раскладываем флекс-элементы по колонкам */
justify-content: flex-start; /* Прижимаем флекс-элементы к левому краю */
flex-wrap: nowrap; /* Если места для элементов не хватает, запрещаем их перенос на следующую строку */
margin-left: -10px; /* Компенсируем межколонник */
margin-right: -10px;
}Стилизуем колонки и зададим их размеры. Появился межколонник, а колонки стали занимать фиксированную ширину.
.col-1,
.col-2,
.col-3,
.col-4 {
flex-grow: 0; /* Не даём элементу растягиваться больше указанного размера */
flex-shrink: 0; /* Не даём элементу уменьшаться меньше указанного размера */
padding-left: 10px; /* Задаём межколонник падингами */
padding-right: 10px;
}
.col-1 {
flex-basis: 25%;
}
.col-2 {
flex-basis: 50%;
}
.col-3 {
flex-basis: 75%;
}
.col-4 {
flex-basis: 100%;
}Обратите внимание: отступы между колонками мы задали не с помощью gap, а с помощью падингов у колонок и отрицательных маржинов у этажей. Всё потому, что flex-basis не учитывает gap: колонки получают точно 25%, 50% и 75% ширины, а дополнительный межколонник выталкивает их за пределы этажа:
.row {
display: flex;
flex-direction: row;
justify-content: flex-start;
flex-wrap: nowrap;
margin-left: -10px;
margin-right: -10px;
gap: 20px;
}
.col-1,
.col-2,
.col-3,
.col-4 {
flex-grow: 0;
flex-shrink: 0;
padding-left: 10px;
padding-right: 10px;
}
Чтобы колонками было проще управлять, параметризуем ширину межколонника. Для этого нам понадобится ЦСС‑переменная и функция calc для расчётов:
.row {
--gutter: 20px; /* Вводим переменную для межколонника */
--halfGutter: calc(var(--gutter) / 2); /* Считаем половинку межколонника для маржинов и падингов */
display: flex;
flex-direction: row;
justify-content: flex-start;
flex-wrap: nowrap;
margin-left: calc(-1 * var(--halfGutter)); /* В ЦСС нельзя просто написать -var(--halfGutter), приходится изощряться с умножением на -1 */
margin-right: calc(-1 * var(--halfGutter));
}
.col-1,
.col-2,
.col-3,
.col-4 {
flex-grow: 0;
flex-shrink: 0;
padding-left: var(--halfGutter);
padding-right: var(--halfGutter);
}flex-basis часто используют для вёрстки по сетке. Например, так может выглядеть простейшая сетка на 4 колонки.
Начнём с разметки. Без стилей колонки заняли всё доступное пространство.
<div class="row">
<div class="col-4">
<!-- Колонка на всю ширину страницы -->
</div>
</div>
<div class="row">
<div class="col-3">
<!-- Колонка на три четверти страницы -->
</div>
<div class="col-1">
<!-- Колонка на четверть страницы -->
</div>
</div>
<div class="row">
<div class="col-1">
<!-- Колонка на четверть страницы -->
</div>
<div class="col-1"></div>
<div class="col-1"></div>
<div class="col-1"></div>
</div>Стилизуем .row — флекс‑контейнер, этаж сетки. Теперь колонки прижались друг к другу у левого края.
.row {
display: flex;
flex-direction: row; /* Раскладываем флекс-элементы по колонкам */
justify-content: flex-start; /* Прижимаем флекс-элементы к левому краю */
flex-wrap: nowrap; /* Если места для элементов не хватает, запрещаем их перенос на следующую строку */
margin-left: -10px; /* Компенсируем межколонник */
margin-right: -10px;
}Стилизуем колонки и зададим их размеры. Появился межколонник, а колонки стали занимать фиксированную ширину.
.col-1,
.col-2,
.col-3,
.col-4 {
flex-grow: 0; /* Не даём элементу растягиваться больше указанного размера */
flex-shrink: 0; /* Не даём элементу уменьшаться меньше указанного размера */
padding-left: 10px; /* Задаём межколонник падингами */
padding-right: 10px;
}
.col-1 {
flex-basis: 25%;
}
.col-2 {
flex-basis: 50%;
}
.col-3 {
flex-basis: 75%;
}
.col-4 {
flex-basis: 100%;
}Обратите внимание: отступы между колонками мы задали не с помощью gap, а с помощью падингов у колонок и отрицательных маржинов у этажей. Всё потому, что flex-basis не учитывает gap: колонки получают точно 25%, 50% и 75% ширины, а дополнительный межколонник выталкивает их за пределы этажа:
.row {
display: flex;
flex-direction: row;
justify-content: flex-start;
flex-wrap: nowrap;
margin-left: -10px;
margin-right: -10px;
gap: 20px;
}
.col-1,
.col-2,
.col-3,
.col-4 {
flex-grow: 0;
flex-shrink: 0;
padding-left: 10px;
padding-right: 10px;
}
Чтобы колонками было проще управлять, параметризуем ширину межколонника. Для этого нам понадобится ЦСС‑переменная и функция calc для расчётов:
.row {
--gutter: 20px; /* Вводим переменную для межколонника */
--halfGutter: calc(var(--gutter) / 2); /* Считаем половинку межколонника для маржинов и падингов */
display: flex;
flex-direction: row;
justify-content: flex-start;
flex-wrap: nowrap;
margin-left: calc(-1 * var(--halfGutter)); /* В ЦСС нельзя просто написать -var(--halfGutter), приходится изощряться с умножением на -1 */
margin-right: calc(-1 * var(--halfGutter));
}
.col-1,
.col-2,
.col-3,
.col-4 {
flex-grow: 0;
flex-shrink: 0;
padding-left: var(--halfGutter);
padding-right: var(--halfGutter);
}Два элемента с flex‑basis: 150px занимают ровно по 150 пк
Первый элемент занимает 150 пк, а второй увеличивается так, чтобы занять всё свободное пространство
Два элемента делят свободное пространство в соотношении 2:1
Три элемента делят контейнер в соотношении 2:1:2
Свойство flex-grow задаёт коэффициент, определяющий, какую долю свободного места получит элемент. Предположим, что в контейнере с двумя элементами у первого элемента задан flex-grow: 2, а у второго — flex-grow: 1. Тогда эти элементы поделят свободное пространство в пропорции 2:1.
flex-grow задаётся безразмерными положительными числами. Эти числа могут быть и дробными: например, 1,618, золотое сечение. Значение по умолчанию равно 0 — элемент получит минимальный размер по своему содержимому.
Свойство flex-grow задаёт коэффициент, определяющий, какую долю свободного места получит элемент. Предположим, что в контейнере с двумя элементами у первого элемента задан flex-grow: 2, а у второго — flex-grow: 1. Тогда эти элементы поделят свободное пространство в пропорции 2:1.
flex-grow задаётся безразмерными положительными числами. Эти числа могут быть и дробными: например, 1,618, золотое сечение. Значение по умолчанию равно 0 — элемент получит минимальный размер по своему содержимому.
Два элемента с flex‑basis: 150px занимают ровно по 150 пк
Первый элемент занимает 150 пк, а второй увеличивается так, чтобы занять всё свободное пространство
Два элемента делят свободное пространство в соотношении 2:1
Три элемента делят контейнер в соотношении 2:1:2
flex-grow: 1 удобно использовать для создания адаптивных колонок, равномерно делящих доступное пространство:
.cols {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
gap: 18px;
}
.cols > * {
flex-grow: 1;
flex-basis: 0;
}<div class="cols">
<div>Первая колонка</div>
…
<div>Четвёртая колонка</div>
</div>
<div class="cols">
<div>Первая колонка</div>
<div>Вторая колонка</div>
</div>
<div class="cols">
<div>Первая колонка</div>
…
<div>Пятая колонка</div>
</div>flex-grow: 1 удобно использовать для создания адаптивных колонок, равномерно делящих доступное пространство:
.cols {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
gap: 18px;
}
.cols > * {
flex-grow: 1;
flex-basis: 0;
}<div class="cols">
<div>Первая колонка</div>
…
<div>Четвёртая колонка</div>
</div>
<div class="cols">
<div>Первая колонка</div>
<div>Вторая колонка</div>
</div>
<div class="cols">
<div>Первая колонка</div>
…
<div>Пятая колонка</div>
</div>Чтобы управлять порядком отдельных элементов во флекс‑контейнере, используют свойство order. По умолчанию его значение равно 0. Соответственно, элементы с order: 1 станут в конце главной оси, а элементы с order: -1 — в начале.
Возьмём адаптивные колонки из предыдущего примера:
.cols {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
gap: 18px;
}
.cols > * {
flex-grow: 1;
flex-basis: 0;
}Переставим вторую колонку в начало и дадим ей вдвое больше места:
.cols > *:nth-child(2) {
order: -1;
flex-grow: 2;
}Чаще всего order используют для адаптации в мобильной версии. Скажем, если в двух колонках идёт текст, описывающий иллюстрацию, а в последней колонке сама иллюстрация, то в мобильной версии стоит переставить изображение в начало с помощью order: -1
Чтобы управлять порядком отдельных элементов во флекс‑контейнере, используют свойство order. По умолчанию его значение равно 0. Соответственно, элементы с order: 1 станут в конце главной оси, а элементы с order: -1 — в начале.
Возьмём адаптивные колонки из предыдущего примера:
.cols {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
gap: 18px;
}
.cols > * {
flex-grow: 1;
flex-basis: 0;
}Переставим вторую колонку в начало и дадим ей вдвое больше места:
.cols > *:nth-child(2) {
order: -1;
flex-grow: 2;
}Чаще всего order используют для адаптации в мобильной версии. Скажем, если в двух колонках идёт текст, описывающий иллюстрацию, а в последней колонке сама иллюстрация, то в мобильной версии стоит переставить изображение в начало с помощью order: -1
Два элемента с
Два элемента с
Первый элемент занимает 600 пк, а второй уменьшается, чтобы вместиться в контейнер
Первый элемент уменьшается в два раза быстрее второго
Свойство flex-shrink задаёт коэффициент, определяющий, какую долю недостающего места отдаст элемент. flex-shrink используют, чтобы обозначить, какие элементы уменьшаются, какие нет и с какой скоростью. Предположим, что в контейнере с двумя элементами у первого элемента задан flex-shrink: 2, а у второго — flex-shrink: 1. Тогда первый элемент освободит в два раза больше места для оставшихся элементов, чем второй.
flex-shrink задаётся безразмерными положительными числами. Значение по умолчанию равно 1 — если места не хватит, элементы уменьшатся равномерно.
Пример четырёхколоночной сетки на флексбоксе
Свойство flex-shrink задаёт коэффициент, определяющий, какую долю недостающего места отдаст элемент. flex-shrink используют, чтобы обозначить, какие элементы уменьшаются, какие нет и с какой скоростью. Предположим, что в контейнере с двумя элементами у первого элемента задан flex-shrink: 2, а у второго — flex-shrink: 1. Тогда первый элемент освободит в два раза больше места для оставшихся элементов, чем второй.
flex-shrink задаётся безразмерными положительными числами. Значение по умолчанию равно 1 — если места не хватит, элементы уменьшатся равномерно.
Два элемента с
Два элемента с
Первый элемент занимает 200 пк, а второй уменьшается, чтобы вместиться в контейнер
Первый элемент уменьшается в два раза быстрее второго
Пример четырёхколоночной сетки на флексбоксе