🔍 Начните печатать, чтобы искать по книге или перейти к нужной странице по номеру
Удобно листать не только прокруткой, но и клавишами‑стрелками:
Эта книга — пошаговая инструкция по вёрстке сайтов на языках ХТМЛ и ЦСС. Вы узнаете не только как сверстать сайт, но и как опубликовать его в интернете, настроить красивый шаринг в соцсети и подключить системы аналитики.
Отдельный раздел книги посвящён работе с верстальщиком: как ставить задачи, получать предсказуемый результат и правильно принимать и внедрять вёрстку.
Знакомство с ХТМЛ и ЦСС
Модули
Расстановка
Страницы
Спецэффекты
Контроль качества
Публикация
Как работать с верстальщиком
Эта книга — пошаговая инструкция по вёрстке сайтов на языках ХТМЛ и ЦСС. Вы узнаете не только как сверстать сайт, но и как опубликовать его в интернете, настроить красивый шаринг в соцсети и подключить системы аналитики.
Отдельный раздел книги посвящён работе с верстальщиком: как ставить задачи, получать предсказуемый результат и правильно принимать и внедрять вёрстку.
Знакомство с ХТМЛ и ЦСС
Модули
Расстановка
Страницы
Спецэффекты
Контроль качества
Публикация
Как работать с верстальщиком
Готовый набор стилей — не всегда хороший выбор. Не cтоит бездумно тащить его в любую вёрстку.
Изучайте документацию набора, чтобы понимать его возможности и ограничения, когда он принесёт пользу, а когда станет обузой. Выбирайте инструмент под задачу, а не подгоняйте задачу под инструмент.
Нестандартный дизайн часто эффективнее верстать вручную, не загоняя себя в рамки готовых решений. Ручная вёрстка сложнее, но гораздо гибче. Об этом — следующие главы.
Изучать и применять осмысленно следует любые готовые решения
Готовый набор стилей — не всегда хороший выбор. Не cтоит бездумно тащить его в любую вёрстку.
Изучайте документацию набора, чтобы понимать его возможности и ограничения, когда он принесёт пользу, а когда станет обузой. Выбирайте инструмент под задачу, а не подгоняйте задачу под инструмент.
Нестандартный дизайн часто эффективнее верстать вручную, не загоняя себя в рамки готовых решений. Ручная вёрстка сложнее, но гораздо гибче. Об этом — следующие главы.
Изучать и применять осмысленно следует любые готовые решения
В вёрстке нет строгих ограничений, можно сверстать что угодно почти как угодно. Но есть принципы, которые упростят верстальщику жизнь, сэкономят время и помогут избежать ошибок.
Верстайте от общего к частному, чтобы видеть надсистему и связи модулей, выбирать оптимальные решения и меньше повторяться в коде. ХТМЛ и ЦСС заточены под этот принцип: теги вкладываются, стили наследуются.
Следуйте методу прогрессивного джипега: страница всегда готова к публикации. Увеличивается степень проработанности, а общий вид всегда ясен.
Наследование стилей
Артемий Лебедев. Метод прогрессивного джипега
Чем больше кода, тем легче ошибиться. Избегайте избыточной вложенности, выносите повторяющиеся стили в классы, используйте наследование. Стремитесь делать код проще, насколько возможно, пока это не вредит функциональности и не противоречит здравому смыслу.
Лайфхак: отложите вёрстку на пару дней, затем посмотрите на неё свежим взглядом. Вы сразу найдёте, что улучшить в этой вёрстке или в будущих работах.
Наследование стилей
Выборочная стилизация. Классы
Для большинства дизайнерских задач есть подходящие инструменты: теги, атрибуты, стили, селекторы. Изучайте элементы и стили, выбирайте подходящие для своих задач. Это сделает код понятнее и надёжнее: стандартные элементы проверены, предсказуемо выглядят и ведут себя на всех устройствах и браузерах. Интерактивные элементы сразу обладают нужными функциями: кнопки нажимаются, ссылки переходят по страницам.
Элементы. МДН
Нестандартные инпуты
Одинаково оформленный и предсказуемый код быстрее читать, понятно, как добавить элементы и изменить существующие. Это особенно полезно при командной работе.
Следуйте единым правилам во всём коде. Называете классы через подчёркивание? Называйте так всегда и везде. Храните стили для мобильных в отдельном файле? Не пишите их в других местах.
Если в середине пути поняли, что система не самая удачная — не спешите всё переделывать, обычно это того не стоит. Сделайте заметку на будущее и в следующий раз выберите более удачную систему.
Лайфхак: как называть классы
Фёдор Борщёв. Не сомневаться в принятых решениях
Плохой старт
<header> <nav class="nav"> <a href="…">Главная</a> <a href="…">Каталог</a> <button type="button" class="btnCart"> Корзина <span class="counter">9+</span> </button> </nav> </header>
Хороший старт
<header> <!-- … --> </header> <body> <!-- … --> <body> <footer> <!-- … --> <footer>
Избыточно
<nav class="nav"> <li class="nav__item"> <a class="nav__itemLink" href="…">Главная</a> </li> <li class="nav__item"> <a class="nav__itemLink" href="…">Каталог</a> </li> <li class="nav__item"> <a class="nav__itemLink" href="…">Контакты</a> </li> </ul> </nav>
Нормально
<nav сlass="nav"> <a href="…">Главная</a> <a href="…">Каталог</a> <a href="…">Контакты</a> </nav>
Неправильно
<p class="headingLarge">Ближайшие мероприятия</p> <div class="button">Купить</div> <p><u>Все статьи автора</u></a>
Правильно
<h1>Ближайшие мероприятия</h1> <button type="button" class="button">Купить</button> <a href="…">Все статьи автора</a>
Непредсказуемо
<a class="item promoItem"> <p class="item-title">…</p> <p class="itemprice">…</p> </a> <div class="feature is-highlighted"> <h3 class="featureTitle">…</h3> <div class="featureText">…</div> </div>
Предсказуемо
<a class="item is__promo"> <p class="item__title">…</p> <p class="item__price">…</p> </a> <div class="feature is__highlighted"> <h3 class="feature__title">…</h3> <div class="feature__text">…</div> </div>
Плохой старт
<header> <nav class="nav"> <a href="…">Главная</a> <a href="…">Каталог</a> <button type="button" class="btnCart"> Корзина <span class="counter">9+</span> </button> </nav> </header>
Хороший старт
<header> <!-- … --> </header> <body> <!-- … --> <body> <footer> <!-- … --> <footer>
Избыточно
<nav class="nav"> <li class="nav__item"> <a class="nav__itemLink" href="…">Главная</a> </li> <li class="nav__item"> <a class="nav__itemLink" href="…">Каталог</a> </li> <li class="nav__item"> <a class="nav__itemLink" href="…">Контакты</a> </li> </ul> </nav>
Нормально
<nav сlass="nav"> <a href="…">Главная</a> <a href="…">Каталог</a> <a href="…">Контакты</a> </nav>
Неправильно
<p class="headingLarge">Ближайшие мероприятия</p> <div class="button">Купить</div> <p><u>Все статьи автора</u></a>
Правильно
<h1>Ближайшие мероприятия</h1> <button type="button" class="button">Купить</button> <a href="…">Все статьи автора</a>
Непредсказуемо
<a class="item promoItem"> <p class="item-title">…</p> <p class="itemprice">…</p> </a> <div class="feature is-highlighted"> <h3 class="featureTitle">…</h3> <div class="featureText">…</div> </div>
Предсказуемо
<a class="item is__promo"> <p class="item__title">…</p> <p class="item__price">…</p> </a> <div class="feature is__highlighted"> <h3 class="feature__title">…</h3> <div class="feature__text">…</div> </div>
В вёрстке нет строгих ограничений, можно сверстать что угодно почти как угодно. Но есть принципы, которые упростят верстальщику жизнь, сэкономят время и помогут избежать ошибок.
Верстайте от общего к частному, чтобы видеть надсистему и связи модулей, выбирать оптимальные решения и меньше повторяться в коде. ХТМЛ и ЦСС заточены под этот принцип: теги вкладываются, стили наследуются.
Следуйте методу прогрессивного джипега: страница всегда готова к публикации. Увеличивается степень проработанности, а общий вид всегда ясен.
Наследование стилей
Артемий Лебедев. Метод прогрессивного джипега
Чем больше кода, тем легче ошибиться. Избегайте избыточной вложенности, выносите повторяющиеся стили в классы, используйте наследование. Стремитесь делать код проще, насколько возможно, пока это не вредит функциональности и не противоречит здравому смыслу.
Лайфхак: отложите вёрстку на пару дней, затем посмотрите на неё свежим взглядом. Вы сразу найдёте, что улучшить в этой вёрстке или в будущих работах.
Наследование стилей
Выборочная стилизация. Классы
Для большинства дизайнерских задач есть подходящие инструменты: теги, атрибуты, стили, селекторы. Изучайте элементы и стили, выбирайте подходящие для своих задач. Это сделает код понятнее и надёжнее: стандартные элементы проверены, предсказуемо выглядят и ведут себя на всех устройствах и браузерах. Интерактивные элементы сразу обладают нужными функциями: кнопки нажимаются, ссылки переходят по страницам.
Элементы. МДН
Нестандартные инпуты
Одинаково оформленный и предсказуемый код быстрее читать, понятно, как добавить элементы и изменить существующие. Это особенно полезно при командной работе.
Следуйте единым правилам во всём коде. Называете классы через подчёркивание? Называйте так всегда и везде. Храните стили для мобильных в отдельном файле? Не пишите их в других местах.
Если в середине пути поняли, что система не самая удачная — не спешите всё переделывать, обычно это того не стоит. Сделайте заметку на будущее и в следующий раз выберите более удачную систему.
Лайфхак: как называть классы
Фёдор Борщёв. Не сомневаться в принятых решениях
Хром
Файерфокс
В Хроме и Файерфоксе разный интерлиньяж и буллиты
Портретная
Ландшафтная
При повороте основной текст стал крупнее заголовка
Хром
Сафари
В Хроме и Сафари разный кегль и шрифт в текстовой области
По умолчанию
Как хотим
Внутренние отступы и граница прибивались к 100% ширины инпутов
По умолчанию
Как хотим
Изображение котика не поместилось в окно и дало горизонтальную прокрутку
Начинать с чистого листа. В каждом браузере есть предустановленные стили почти для всех элементов. Они нужны, чтобы страница без стилей была читаемой, доступной и адаптивной. Дефолтные ЦСС‑правила не стандартизованы, поэтому они могут слегка отличаться от браузера к браузеру.
Кроме того, дефолтные стили иногда вредят вёрстке. Например, мобильные браузеры при повороте телефона в ландшафтную ориентацию увеличивает кегль текста. При этом кегль основного текста может стать крупнее кегля заголовков даже, если вы настроили оба кегля.
Дефолтные стили местами довольно странные. Например, кнопки и поля ввода не наследуют типографические правила страницы. Текстовая область использует системный моноширинный шрифт, а текстовый инпут — системный шрифт без засечек. И в обоих случаях у них микроскопический кегль: 13,333 пикселя в Хроме, 11 пикселей в Сафари.
Наконец, дефолтные стили тянут за собой «инопланетное» поведение из спецификации. Например, текстовые инпуты с width: 100% переполняют форму, потому что по умолчанию внутренние отступы и границы не учитываются в ширине.
Изображения по умолчанию не тянутся. Картинка шириной в 800 пикселей переполнит контейнер шириной в 500 пикселей, а не попытается вписаться в него.
Чтобы гарантированно избавиться от побочных эффектов дефолтных стилей браузера, нужно сначала обнулить и нормализовать их. А потом с чистого листа добавлять свои стили. Так мы получим предсказуемое поведение вёрстки в любом браузере.
Хром
Файерфокс
В Хроме и Файерфоксе разный интерлиньяж и буллиты
Портретная
Ландшафтная
При повороте основной текст стал крупнее заголовка
Хром
Сафари
В Хроме и Сафари разный кегль и шрифт в текстовой области
По умолчанию
Как хотим
Внутренние отступы и граница прибивались к 100% ширины инпутов
По умолчанию
Как хотим
Изображение котика не поместилось в окно и дало горизонтальную прокрутку
Начинать с чистого листа. В каждом браузере есть предустановленные стили почти для всех элементов. Они нужны, чтобы страница без стилей была читаемой, доступной и адаптивной. Дефолтные ЦСС‑правила не стандартизованы, поэтому они могут слегка отличаться от браузера к браузеру.
Кроме того, дефолтные стили иногда вредят вёрстке. Например, мобильные браузеры при повороте телефона в ландшафтную ориентацию увеличивает кегль текста. При этом кегль основного текста может стать крупнее кегля заголовков даже, если вы настроили оба кегля.
Дефолтные стили местами довольно странные. Например, кнопки и поля ввода не наследуют типографические правила страницы. Текстовая область использует системный моноширинный шрифт, а текстовый инпут — системный шрифт без засечек. И в обоих случаях у них микроскопический кегль: 13,333 пикселя в Хроме, 11 пикселей в Сафари.
Наконец, дефолтные стили тянут за собой «инопланетное» поведение из спецификации. Например, текстовые инпуты с width: 100% переполняют форму, потому что по умолчанию внутренние отступы и границы не учитываются в ширине.
Изображения по умолчанию не тянутся. Картинка шириной в 800 пикселей переполнит контейнер шириной в 500 пикселей, а не попытается вписаться в него.
Чтобы гарантированно избавиться от побочных эффектов дефолтных стилей браузера, нужно сначала обнулить и нормализовать их. А потом с чистого листа добавлять свои стили. Так мы получим предсказуемое поведение вёрстки в любом браузере.
Советуем перед началом вёрстки сбросить стандартные стили, обнулить отступы, нормализовать поведение по умолчанию, избавиться от неочевидных свойств. Такие стили называют ресетом (англ. 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;
}
Обёрткой может быть общий контейнер, в который завёрнуто всё содержимое страницы, или класс, который добавляют «этажам» страницы.
Контейнер‑обёртка подойдёт для случаев, когда структура содержимого страниц одинаковая и однотипная, например, для статей в блоге.
Класс‑обёртка подойдёт для случаев, когда часть содержимого страницы может не подчиняться ограничениям. Скажем, шапка и подвал тянутся на всю ширину окна, а содержимое страницы — ограничено по ширине.