🔍 Начните печатать, чтобы искать по книге или перейти к нужной странице по номеру
Удобно листать не только прокруткой, но и клавишами‑стрелками:
Эта книга — пошаговая инструкция по вёрстке сайтов на языках ХТМЛ и ЦСС. Вы узнаете не только как сверстать сайт, но и как опубликовать его в интернете, настроить красивый шаринг в соцсети и подключить системы аналитики.
Отдельный раздел книги посвящён работе с верстальщиком: как ставить задачи, получать предсказуемый результат и правильно принимать и внедрять вёрстку.
Знакомство с ХТМЛ и ЦСС
Модули
Расстановка
Страницы
Спецэффекты
Контроль качества
Публикация
Как работать с верстальщиком
Эта книга — пошаговая инструкция по вёрстке сайтов на языках ХТМЛ и ЦСС. Вы узнаете не только как сверстать сайт, но и как опубликовать его в интернете, настроить красивый шаринг в соцсети и подключить системы аналитики.
Отдельный раздел книги посвящён работе с верстальщиком: как ставить задачи, получать предсказуемый результат и правильно принимать и внедрять вёрстку.
Знакомство с ХТМЛ и ЦСС
Модули
Расстановка
Страницы
Спецэффекты
Контроль качества
Публикация
Как работать с верстальщиком
Ключевая фишка Бутстрапа и других наборов стилей — готовые классы для работы с модульной сеткой.
В Бутстрапе строки и ячейки сетки задают классами row и col. Есть несколько вариантов работы с ними.
Первый вариант — явно указать ширину ячеек в колонках в рамках 12‑колоночной сетки. Для корректной работы в таком случае, общая ширина ячеек в строке должна быть равна числу колонок — 12.
<div class="row">
<div class="col-8"></div>
<div class="col-4"></div>
</div>
<div class="row">
<div class="col-2"></div>
<div class="col-10"></div>
</div>
<div class="row">
<div class="col-6"></div>
<div class="col-4"></div>
<div class="col-2"></div>
</div>
Второй вариант — не указывать ширину ячеек. Тогда они поделят доступную ширину равномерно. Количество таких ячеек в строке ограничено лишь здравым смыслом.
<div class="row">
<div class="col"></div>
<div class="col"></div>
</div>
<div class="row">
<div class="col"></div>
<div class="col"></div>
<div class="col"></div>
</div>
<div class="row">
<div class="col"></div>
<div class="col"></div>
<div class="col"></div>
<div class="col"></div>
<div class="col"></div>
</div>
Ячейки с указанной шириной и без можно комбинировать, но только если вы хорошо понимаете, зачем это делаете и как поведёт себя итоговая вёрстка. Разобраться с поведением классов Бутстрапа в этом и других нестандартных случаях поможет тщательное изучение документации.
Модульная сетка. Документация Бутстрапа
Ключевая фишка Бутстрапа и других наборов стилей — готовые классы для работы с модульной сеткой.
В Бутстрапе строки и ячейки сетки задают классами row и col. Есть несколько вариантов работы с ними.
Первый вариант — явно указать ширину ячеек в колонках в рамках 12‑колоночной сетки. Для корректной работы в таком случае, общая ширина ячеек в строке должна быть равна числу колонок — 12.
<div class="row">
<div class="col-8"></div>
<div class="col-4"></div>
</div>
<div class="row">
<div class="col-2"></div>
<div class="col-10"></div>
</div>
<div class="row">
<div class="col-6"></div>
<div class="col-4"></div>
<div class="col-2"></div>
</div>
Второй вариант — не указывать ширину ячеек. Тогда они поделят доступную ширину равномерно. Количество таких ячеек в строке ограничено лишь здравым смыслом.
<div class="row">
<div class="col"></div>
<div class="col"></div>
</div>
<div class="row">
<div class="col"></div>
<div class="col"></div>
<div class="col"></div>
</div>
<div class="row">
<div class="col"></div>
<div class="col"></div>
<div class="col"></div>
<div class="col"></div>
<div class="col"></div>
</div>
Ячейки с указанной шириной и без можно комбинировать, но только если вы хорошо понимаете, зачем это делаете и как поведёт себя итоговая вёрстка. Разобраться с поведением классов Бутстрапа в этом и других нестандартных случаях поможет тщательное изучение документации.
Модульная сетка. Документация Бутстрапа
Отдельные классы в Бутстрапе управляют падингами и маржинами — внутренними и внешними отступами элемента. Есть пять стандартных размеров отступов.
Класс p-1 установит минимальный, а p-5 — максимальный возможный падинг со всех четырёх сторон.
Классы с уточнением t, b, l, r (top, bottom, left, right) установят падинг только с одной стороны, а с уточнением x или y — слева‑справа или сверху‑снизу.
<!-- Со всех сторон -->
<div class="p-1"></div>
<!-- Только сверху -->
<div class="pt-3"></div>
<!-- Сверху и снизу -->
<div class="pt-1 pb-2"></div>
<!-- Сверху и снизу -->
<div class="py-2"></div>
<!-- Сверху, снизу, слева и справа -->
<div class="pt-1 pb-2 px-2"></div>
Маржины задаются тем же образом, но p меняется на m, а кроме значений 1…5 доступно auto — отжать элемент до предела.
<div class="m-1"></div>
<div class="ml-2"></div>
<div class="ml-auto mt-4"></div>
Класcы падингов и маржинов можно комбинировать:
<div class="p-1 m-1"></div>
<div class="p-1 pl-3 ml-2"></div>
<div class="p-2 ml-auto mt-4"></div>
Отступы:
В главе «Знакомство с ЦСС»
Отдельные классы в Бутстрапе управляют падингами и маржинами — внутренними и внешними отступами элемента. Есть пять стандартных размеров отступов.
Класс p-1 установит минимальный, а p-5 — максимальный возможный падинг со всех четырёх сторон.
Классы с уточнением t, b, l, r (top, bottom, left, right) установят падинг только с одной стороны, а с уточнением x или y — слева‑справа или сверху‑снизу.
<!-- Со всех сторон -->
<div class="p-1"></div>
<!-- Только сверху -->
<div class="pt-3"></div>
<!-- Сверху и снизу -->
<div class="pt-1 pb-2"></div>
<!-- Сверху и снизу -->
<div class="py-2"></div>
<!-- Сверху, снизу, слева и справа -->
<div class="pt-1 pb-2 px-2"></div>
Маржины задаются тем же образом, но p меняется на m, а кроме значений 1…5 доступно auto — отжать элемент до предела.
<div class="m-1"></div>
<div class="ml-2"></div>
<div class="ml-auto mt-4"></div>
Класcы падингов и маржинов можно комбинировать:
<div class="p-1 m-1"></div>
<div class="p-1 pl-3 ml-2"></div>
<div class="p-2 ml-auto mt-4"></div>
Отступы:
В главе «Знакомство с ЦСС»
Обычные классы Бутстрапа для работы с сеткой и отступами применятся на всех размерах экрана. Код из примера покажет ячейки одинаковой ширины и на телефоне, и на компьютере:
<div class="row">
<div class="col-6"></div>
<div class="col-6"></div>
</div>
Но если дописать к классу особый модификатор, то класс начнёт работать только начиная с определённой ширины экрана.
Например, модификатор lg (large) применит класс только на ширине экрана от 992 пк. Добавив такой класс, можно поставить ячейки друг над другом на узком экране и в ряд на широком:
<div class="row">
<div class="col-12 col-lg-6"></div>
<div class="col-12 col-lg-6"></div>
</div>
В Бутстрапе есть пять модификаторов экрана: sm, md, lg, xl, xxl. Они применят класс от ширины 576, 768, 992, 1200 и 1400 пк соответственно.
По умолчанию всегда применятся классы без модификатора, а классы с модификатором перебивают их на своей ширине экрана. Например, такой код изменит внутренний отступ от минимального на телефоне до максимального на экране шириной 1200—1399 пк и снова на минимальный, начиная с ширины 1400 пк:
<div class="p-1 p-md-3 p-xl-5 p-xxl-1"></div>
Не все классы Бутстрапа поддерживают модификаторы. Проверить поддержку можно экспериментальным путём или заглянув в документацию интересующего класса.
Обычные классы Бутстрапа для работы с сеткой и отступами применятся на всех размерах экрана. Код из примера покажет ячейки одинаковой ширины и на телефоне, и на компьютере:
<div class="row">
<div class="col-6"></div>
<div class="col-6"></div>
</div>
Но если дописать к классу особый модификатор, то класс начнёт работать только начиная с определённой ширины экрана.
Например, модификатор lg (large) применит класс только на ширине экрана от 992 пк. Добавив такой класс, можно поставить ячейки друг над другом на узком экране и в ряд на широком:
<div class="row">
<div class="col-12 col-lg-6"></div>
<div class="col-12 col-lg-6"></div>
</div>
В Бутстрапе есть пять модификаторов экрана: sm, md, lg, xl, xxl. Они применят класс от ширины 576, 768, 992, 1200 и 1400 пк соответственно.
По умолчанию всегда применятся классы без модификатора, а классы с модификатором перебивают их на своей ширине экрана. Например, такой код изменит внутренний отступ от минимального на телефоне до максимального на экране шириной 1200—1399 пк и снова на минимальный, начиная с ширины 1400 пк:
<div class="p-1 p-md-3 p-xl-5 p-xxl-1"></div>
Не все классы Бутстрапа поддерживают модификаторы. Проверить поддержку можно экспериментальным путём или заглянув в документацию интересующего класса.
Готовый набор стилей — не всегда хороший выбор. Не 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>
В вёрстке нет строгих ограничений, можно сверстать что угодно почти как угодно. Но есть принципы, которые упростят верстальщику жизнь, сэкономят время и помогут избежать ошибок.
Верстайте от общего к частному, чтобы видеть надсистему и связи модулей, выбирать оптимальные решения и меньше повторяться в коде. ХТМЛ и ЦСС заточены под этот принцип: теги вкладываются, стили наследуются.
Следуйте методу прогрессивного джипега: страница всегда готова к публикации. Увеличивается степень проработанности, а общий вид всегда ясен.
Наследование стилей
Артемий Лебедев. Метод прогрессивного джипега
Чем больше кода, тем легче ошибиться. Избегайте избыточной вложенности, выносите повторяющиеся стили в классы, используйте наследование. Стремитесь делать код проще, насколько возможно, пока это не вредит функциональности и не противоречит здравому смыслу.
Лайфхак: отложите вёрстку на пару дней, затем посмотрите на неё свежим взглядом. Вы сразу найдёте, что улучшить в этой вёрстке или в будущих работах.
Наследование стилей
Выборочная стилизация. Классы
Для большинства дизайнерских задач есть подходящие инструменты: теги, атрибуты, стили, селекторы. Изучайте элементы и стили, выбирайте подходящие для своих задач. Это сделает код понятнее и надёжнее: стандартные элементы проверены, предсказуемо выглядят и ведут себя на всех устройствах и браузерах. Интерактивные элементы сразу обладают нужными функциями: кнопки нажимаются, ссылки переходят по страницам.
Элементы. МДН
Нестандартные инпуты
Одинаково оформленный и предсказуемый код быстрее читать, понятно, как добавить элементы и изменить существующие. Это особенно полезно при командной работе.
Следуйте единым правилам во всём коде. Называете классы через подчёркивание? Называйте так всегда и везде. Храните стили для мобильных в отдельном файле? Не пишите их в других местах.
Если в середине пути поняли, что система не самая удачная — не спешите всё переделывать, обычно это того не стоит. Сделайте заметку на будущее и в следующий раз выберите более удачную систему.
Лайфхак: как называть классы
Фёдор Борщёв. Не сомневаться в принятых решениях