🔍 Начните печатать, чтобы искать по книге или перейти к нужной странице по номеру
Удобно листать не только прокруткой, но и клавишами‑стрелками:
Эта книга — пошаговая инструкция по вёрстке сайтов на языках ХТМЛ и ЦСС. Вы узнаете не только как сверстать сайт, но и как опубликовать его в интернете, настроить красивый шаринг в соцсети и подключить системы аналитики.
Отдельный раздел книги посвящён работе с верстальщиком: как ставить задачи, получать предсказуемый результат и правильно принимать и внедрять вёрстку.
Знакомство с ХТМЛ и ЦСС
Модули
Расстановка
Страницы
Спецэффекты
Контроль качества
Публикация
Как работать с верстальщиком
Эта книга — пошаговая инструкция по вёрстке сайтов на языках ХТМЛ и ЦСС. Вы узнаете не только как сверстать сайт, но и как опубликовать его в интернете, настроить красивый шаринг в соцсети и подключить системы аналитики.
Отдельный раздел книги посвящён работе с верстальщиком: как ставить задачи, получать предсказуемый результат и правильно принимать и внедрять вёрстку.
Знакомство с ХТМЛ и ЦСС
Модули
Расстановка
Страницы
Спецэффекты
Контроль качества
Публикация
Как работать с верстальщиком
Советуем перед началом вёрстки сбросить стандартные стили, обнулить отступы, нормализовать поведение по умолчанию, избавиться от неочевидных свойств. Такие стили называют ресетом (англ. reset — «сброс»). Ресет делается добавлением особого кода в начало файла со стилями. Приведём пример минимального ресета и прокомментируем решения в нём.
Начинаем с волшебной формулы для всех элементов и псевдоэлементов, заставляющей браузер учитывать внутренние поля и рамку в ширине и высоте элемента.
Просим браузер не увеличивать кегль при повороте телефона в ландшафтную ориентацию. Значения с префиксами нужны, потому что мобильный Сафари поддерживает только вариант с -webkit-, а Файрфокс на Андроиде — только вариант с -moz-.
Обнуляем отступы по умолчанию у текстовых элементов. Отступы между элементами лучше задавать не у самих элементов, а у их комбинаций.
Заодно убираем буллиты в списках. Чаще всего элементы списка оформляют втяжкой.
Нормализуем поведение медиа‑элементов. Делаем их блочными и адаптивными.
Просим браузер унаследовать настройки шрифта в контролах от окружающего текста, чтобы они не были слишком мелкими.
*, *::before, *::after {
box-sizing: border-box;
}
html {
-moz-text-size-adjust: none;
-webkit-text-size-adjust: none;
text-size-adjust: none;
}
body, h1, h2, h3, h4, p, ul, ol, li,
figure, blockquote, dl, dd {
margin: 0;
}
ul, ol {
list-style: none;
}
img, picture, video, svg {
display: block;
max-width: 100%;
height: auto;
}
input, textarea, select, button {
font: inherit;
}*, *::before, *::after {
box-sizing: border-box;
}
html {
-moz-text-size-adjust: none;
-webkit-text-size-adjust: none;
text-size-adjust: none;
}
body, h1, h2, h3, h4, p, ul, ol, li,
figure, blockquote, dl, dd {
margin: 0;
}
ul, ol {
list-style: none;
}
img, picture, video, svg {
display: block;
max-width: 100%;
height: auto;
}
input, textarea, select, button {
font: inherit;
}Советуем перед началом вёрстки сбросить стандартные стили, обнулить отступы, нормализовать поведение по умолчанию, избавиться от неочевидных свойств. Такие стили называют ресетом (англ. reset — «сброс»). Ресет делается добавлением особого кода в начало файла со стилями. Приведём пример минимального ресета и прокомментируем решения в нём.
Начинаем с волшебной формулы для всех элементов и псевдоэлементов, заставляющей браузер учитывать внутренние поля и рамку в ширине и высоте элемента.
Просим браузер не увеличивать кегль при повороте телефона в ландшафтную ориентацию. Значения с префиксами нужны, потому что мобильный Сафари поддерживает только вариант с -webkit-, а Файрфокс на Андроиде — только вариант с -moz-.
Обнуляем отступы по умолчанию у текстовых элементов. Отступы между элементами лучше задавать не у самих элементов, а у их комбинаций.
Заодно убираем буллиты в списках. Чаще всего элементы списка оформляют втяжкой.
Нормализуем поведение медиа‑элементов. Делаем их блочными и адаптивными.
Просим браузер унаследовать настройки шрифта в контролах от окружающего текста, чтобы они не были слишком мелкими.
Когда готов макет и общая сетка, первое, что мы хотим сделать — задать внешние поля и формат страницы. По умолчанию в браузерах содержимое тянется на всю ширину окна с полями в 8 пикселей.
Чтобы задать формат, используют обёртки, классы, задающие максимальную ширину, поля и положение содержимого на странице. Формат может быть резиновым, фиксированным или комбинированным.
Самая простая «резиновая» обёртка может выглядеть так:
.layoutContainer {
margin-left: 6%; /* Задаём правое и левое поле в 6% от ширины окна */
margin-right: 6%;
}
«Фиксированная» обёртка жёстко задаёт ширину:
.layoutContainer {
width: 960px;
margin-left: auto; /* Центрируем с помощью автомаржинов */
margin-right: auto;
padding-left: 20px; /* Добавляем фиксированные поля в 20 пк, чтобы содержимое не прилипало к краям окон шириной менее 960 пк*/
padding-right: 20px;
}
Их комбинация, обёртка с ограничением максимальной ширины и резиновыми полями, обычно выглядит так:
.layoutContainer {
max-width: 960px; /* Задаём максимальную ширину */
margin-left: auto;
margin-right: auto;
padding-left: 20px;
padding-right: 20px;
}
Обёрткой может быть общий контейнер, в который завёрнуто всё содержимое страницы, или класс, который добавляют «этажам» страницы.
Контейнер‑обёртка подойдёт для случаев, когда структура содержимого страниц одинаковая и однотипная, например, для статей в блоге.
Класс‑обёртка подойдёт для случаев, когда часть содержимого страницы может не подчиняться ограничениям. Скажем, шапка и подвал тянутся на всю ширину окна, а содержимое страницы — ограничено по ширине.
Когда готов макет и общая сетка, первое, что мы хотим сделать — задать внешние поля и формат страницы. По умолчанию в браузерах содержимое тянется на всю ширину окна с полями в 8 пикселей.
Чтобы задать формат, используют обёртки, классы, задающие максимальную ширину, поля и положение содержимого на странице. Формат может быть резиновым, фиксированным или комбинированным.
Самая простая «резиновая» обёртка может выглядеть так:
.layoutContainer {
margin-left: 6%; /* Задаём правое и левое поле в 6% от ширины окна */
margin-right: 6%;
}
«Фиксированная» обёртка жёстко задаёт ширину:
.layoutContainer {
width: 960px;
margin-left: auto; /* Центрируем с помощью автомаржинов */
margin-right: auto;
padding-left: 20px; /* Добавляем фиксированные поля в 20 пк, чтобы содержимое не прилипало к краям окон шириной менее 960 пк*/
padding-right: 20px;
}
Их комбинация, обёртка с ограничением максимальной ширины и резиновыми полями, обычно выглядит так:
.layoutContainer {
max-width: 960px; /* Задаём максимальную ширину */
margin-left: auto;
margin-right: auto;
padding-left: 20px;
padding-right: 20px;
}
Обёрткой может быть общий контейнер, в который завёрнуто всё содержимое страницы, или класс, который добавляют «этажам» страницы.
Контейнер‑обёртка подойдёт для случаев, когда структура содержимого страниц одинаковая и однотипная, например, для статей в блоге.
Класс‑обёртка подойдёт для случаев, когда часть содержимого страницы может не подчиняться ограничениям. Скажем, шапка и подвал тянутся на всю ширину окна, а содержимое страницы — ограничено по ширине.
Ваш дизайн может работать не на всех размерах экрана. На мобильном телефоне может не поместиться меню или некрасиво переноситься текст. Чтобы адаптировать страницу к мобильному телефону и другим устройствам, введём понятие «точек излома».
Точка излома, breakpoint, — ширина экрана, при которой одна версия вёрстки сменяется на другую. Например, при ширине экрана менее 991 пикселя меню могло бы занять всю ширину экрана и стать прокручиваемым. Используем для этого медиавыражения.
Чтобы решить, при каких условиях медиавыражения должны срабатывать, используют два подхода: по устройствам и по содержимому. В первом случае мы решаем, что у страницы есть отдельный дизайн для разных устройств, экранов: например, мобильных, лаптопов и десктопов. Затем для каждого из устройств определяем точки излома.
В большинстве популярных ЦСС‑фреймворков эти точки выглядят так:
| Узкие мобильные | < 576 пк |
| Мобильные | < 768 пк |
| Лаптопы | ≥ 768 пк |
| Десктопы | ≥ 992 пк |
| Широкие десктопы | ≥ 1400 пк |
Вы можете использовать любые другие значения, опираясь на статистику экранов посетителей сайта или на значения, заданные в вашем ЦСС‑фреймворке.
Например, на сайте бюро мы остановились на трёх типах устройств:
| Мобильные | ≤ 960 пк |
| Лаптопы | > 960 пк |
| Десктопы | > 1400 пк |
Советуем использовать как можно меньше устройств и точек излома. Чем их больше, тем больше вариантов раскладки нужно придумать, сверстать и проверить. Если шапка и подвал адаптируются к двум устройствам, это даёт
Медиавыражения
Ваш дизайн может работать не на всех размерах экрана. На мобильном телефоне может не поместиться меню или некрасиво переноситься текст. Чтобы адаптировать страницу к мобильному телефону и другим устройствам, введём понятие «точек излома».
Точка излома, breakpoint, — ширина экрана, при которой одна версия вёрстки сменяется на другую. Например, при ширине экрана менее 991 пикселя меню могло бы занять всю ширину экрана и стать прокручиваемым. Используем для этого медиавыражения.
Чтобы решить, при каких условиях медиавыражения должны срабатывать, используют два подхода: по устройствам и по содержимому. В первом случае мы решаем, что у страницы есть отдельный дизайн для разных устройств, экранов: например, мобильных, лаптопов и десктопов. Затем для каждого из устройств определяем точки излома.
В большинстве популярных ЦСС‑фреймворков эти точки выглядят так:
| Узкие мобильные | < 576 пк |
| Мобильные | < 768 пк |
| Лаптопы | ≥ 768 пк |
| Десктопы | ≥ 992 пк |
| Широкие десктопы | ≥ 1400 пк |
Вы можете использовать любые другие значения, опираясь на статистику экранов посетителей сайта или на значения, заданные в вашем ЦСС‑фреймворке.
Например, на сайте бюро мы остановились на трёх типах устройств:
| Мобильные | ≤ 960 пк |
| Лаптопы | > 960 пк |
| Десктопы | > 1400 пк |
Советуем использовать как можно меньше устройств и точек излома. Чем их больше, тем больше вариантов раскладки нужно придумать, сверстать и проверить. Если шапка и подвал адаптируются к двум устройствам, это даёт
Медиавыражения
Адаптация может понадобиться не только на уровне всего сайта, но и на уровне отдельных элементов. Например, адрес компании в подвале может постепенно сокращать свой текст, когда перестаёт помещаться:
Большая Новодмитровская улица, 36, строение 2
Большая Новодмитровская улица, 36, стр. 2
Б. Новодмитровская ул., 36, стр. 2
В таких случаях точки излома лучше выбирать исходя из содержимого и использовать Container Queries — медиавыражения, отталкивающиеся от размеров контейнера, а не от размеров окна:
<footer>
<div class="address">
Б<span class="sacrifice--second">ольшая</span><span>.</span> Новодмитровская ул<span class="sacrifice--second">ица</span><span>.</span>,
36, стр<span class="sacrifice--first">оение</span><span>.</span> 2
</div>
</footer>Для логичных переносов склеили неразрывными пробелами части адреса, сильно связанные друг с другом по смыслу: «Большая Новодмитровская улица», «36, строение 2»
.address {
container-type: inline-size; /* Объявляем .address контейнером, с шириной которого можно делать медиавыражения */
}
.address .sacrifice--first + span,
.address .sacrifice--first + span {
display: none; /* Скрываем спаны с точками, пока они не нужны */
}
@container (width <= 21em) { /* При ширине подвала менее 21em, используем первую волну сокращений */
.address .sacrifice--first {
display: none;
}
.address .sacrifice--first + span {
display: inline;
}
}
@container (width <= 19em) { /* При ширине подвала менее 19em, используем вторую волну сокращений */
.address .sacrifice--second {
display: none;
}
.address .sacrifice--second + span {
display: inline;
}
}
Конечно, можно было бы использовать и обычные медиавыражения с шириной экрана. Но это сделало бы вёрстку адреса более хрупкой и менее переносимой. Если в подвале у адреса появится сосед, адрес станет занимать меньше места. Текст придётся сокращать раньше, значит, придётся пересчитывать точки в медиавыражениях.
Container Queries. МДН
Адаптация может понадобиться не только на уровне всего сайта, но и на уровне отдельных элементов. Например, адрес компании в подвале может постепенно сокращать свой текст, когда перестаёт помещаться:
Большая Новодмитровская улица, 36, строение 2
Большая Новодмитровская улица, 36, стр. 2
Б. Новодмитровская ул., 36, стр. 2
В таких случаях точки излома лучше выбирать исходя из содержимого и использовать Container Queries — медиавыражения, отталкивающиеся от размеров контейнера, а не от размеров окна:
<footer>
<div class="address">
Б<span class="sacrifice--second">ольшая</span><span>.</span> Новодмитровская ул<span class="sacrifice--second">ица</span><span>.</span>,
36, стр<span class="sacrifice--first">оение</span><span>.</span> 2
</div>
</footer>Для логичных переносов склеили неразрывными пробелами части адреса, сильно связанные друг с другом по смыслу: «Большая Новодмитровская улица», «36, строение 2»
.address {
container-type: inline-size; /* Объявляем .address контейнером, с шириной которого можно делать медиавыражения */
}
.address .sacrifice--first + span,
.address .sacrifice--first + span {
display: none; /* Скрываем спаны с точками, пока они не нужны */
}
@container (width <= 21em) { /* При ширине подвала менее 21em, используем первую волну сокращений */
.address .sacrifice--first {
display: none;
}
.address .sacrifice--first + span {
display: inline;
}
}
@container (width <= 19em) { /* При ширине подвала менее 19em, используем вторую волну сокращений */
.address .sacrifice--second {
display: none;
}
.address .sacrifice--second + span {
display: inline;
}
}
Конечно, можно было бы использовать и обычные медиавыражения с шириной экрана. Но это сделало бы вёрстку адреса более хрупкой и менее переносимой. Если в подвале у адреса появится сосед, адрес станет занимать меньше места. Текст придётся сокращать раньше, значит, придётся пересчитывать точки в медиавыражениях.
Container Queries. МДН
Приведём примеры вёрстки типичных шапок, меню и подвалов сайтов. Сосредоточимся только на раскладке элементов, оставив типографику на усмотрение читателю.
Одни и те же элементы можно сверстать, используя разные способы: гриды, флексбоксы или строчные элементы. Поэтому вёрстка в этой и последующих главах — это не эталоны, высеченные в камне, а лишь примеры решения типовых задач в вёрстке.
Приведём примеры вёрстки типичных шапок, меню и подвалов сайтов. Сосредоточимся только на раскладке элементов, оставив типографику на усмотрение читателю.
Одни и те же элементы можно сверстать, используя разные способы: гриды, флексбоксы или строчные элементы. Поэтому вёрстка в этой и последующих главах — это не эталоны, высеченные в камне, а лишь примеры решения типовых задач в вёрстке.