🔍 Начните печатать, чтобы искать по книге или перейти к нужной странице по номеру

Удобно листать не только прокруткой, но и клавишами‑стрелками:

 
между важными местами
Shift
между
разворотами
Васи­лий Полов­нёв, Игорь Пет­ров

ХТМЛ.
Вёрстка сайтов

Изда­тель­ство Бюро Гор­бу­нова
2021
Василий Половнёв, Игорь Петров

ХТМЛ.
Вёрстка сайтов

Издательство Бюро Горбунова
2021
удк 004.42
ббк З973.42
П52
Васи­лий Полов­нёв, Игорь Пет­ров
П52
ХТМЛ. Вёрстка сай­тов для дизай­не­ров, редак­то­ров и руко­во­ди­те­лей.—
М.: Изд‑во Бюро Гор­бу­нова, 2021

Эта книга — поша­го­вая инструк­ция по вёрстке сай­тов на язы­ках ХТМЛ и ЦСС. Вы узна­ете не только как свер­стать сайт, но и как опуб­ли­ко­вать его в интер­нете, настро­ить кра­си­вый шаринг в соц­сети и под­клю­чить системы аналитики.

Отдель­ный раз­дел книги посвя­щён работе с вер­сталь­щи­ком: как ста­вить задачи, полу­чать пред­ска­зу­е­мый резуль­тат и пра­вильно при­ни­мать и внед­рять вёрстку.

Оглавление

удк 004.42
ббк З973.42
П52
П52
Василий Половнёв, Игорь Петров
ХТМЛ. Вёрстка сайтов для дизайнеров, редакторов и руководителей.—
М.: Изд‑во Бюро Горбунова, 2021

Эта книга — пошаговая инструкция по вёрстке сайтов на языках ХТМЛ и ЦСС. Вы узнаете не только как сверстать сайт, но и как опубликовать его в интернете, настроить красивый шаринг в соцсети и подключить системы аналитики.

Отдельный раздел книги посвящён работе с верстальщиком: как ставить задачи, получать предсказуемый результат и правильно принимать и внедрять вёрстку.

Оглавление

Скрыто 149 разворотов

1440×1019, приемлемо для обычных мониторов, размыто на «ретине»

2800×1982, более чёткая версия для «ретины»

Атри­бут srcset исполь­зуют не только чтобы пока­зать умень­шен­ную вер­сию кар­тинки на теле­фоне, но и в обрат­ную сто­рону — чтобы пока­зать более каче­ствен­ную кар­тинку на боль­ших экра­нах с высо­кой плот­но­стью пик­се­лей, при этом не качая лиш­него на обыч­ных экранах.

Прин­цип тот же — в атри­буте ука­зы­ваем аль­тер­на­тив­ную кар­тинку и под­ска­зы­ваем бра­у­зеру её ширину:

<img 
  src="img-1440×1019.jpg"
  srcset="img-2800×1982.jpg 2800w">

Через запя­тую в атри­буте можно пере­чис­лить сразу много вари­ан­тов для раз­ных экранов:

<img 
  src="img-1440×1019.jpg"
  srcset="
    img-360x255.jpg 360w,
    img-720x509.jpg 720w,
    img-2800×1982.jpg 2800w">

Дру­гой вопрос — стоит ли замо­ра­чи­ваться и про­пи­сы­вать много вари­ан­тов кар­ти­нок, потому что их при­дётся под­го­тав­ли­вать. В про­дви­ну­той раз­ра­ботке вари­анты кар­ти­нок созда­ются авто­ма­ти­че­ски, код для них гене­ри­ру­ется. В руч­ной вёрстке под­дер­жи­вать больше пары вер­сий кар­ти­нок тяжело и обычно нецелесообразно.

Марк Шагал. Над городом. 1918

1440×1019, приемлемо для обычных мониторов, размыто на «ретине»

2800×1982, более чёткая версия для «ретины»

Атрибут srcset используют не только чтобы показать уменьшенную версию картинки на телефоне, но и в обратную сторону — чтобы показать более качественную картинку на больших экранах с высокой плотностью пикселей, при этом не качая лишнего на обычных экранах.

Принцип тот же — в атрибуте указываем альтернативную картинку и подсказываем браузеру её ширину:

<img 
  src="1440.jpg"
  srcset="2800.jpg 2800w">

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

<img 
  src="1440.jpg"
  srcset="
    360.jpg 360w,
    720.jpg 720w,
    2800.jpg 2800w">

Другой вопрос — стоит ли заморачиваться и прописывать много вариантов картинок, потому что их придётся подготавливать. В продвинутой разработке варианты картинок создаются автоматически, код для них генерируется. В ручной вёрстке поддерживать больше пары версий картинок тяжело и обычно нецелесообразно.

Марк Шагал. Над городом. 1918

Пока img с атри­бу­том srcset все­гда зани­мает 100% ширины экрана, всё рабо­тает отлично, бра­у­зер знает ширину экрана и под­бе­рёт под неё опти­маль­ную кар­тинку из име­ю­щихся в src и srcset.

<img 
  src="img-1000.jpg"
  srcset="img-1400.jpg 1400w">

Но допу­стим, кар­тинка на широ­ком экране зани­мает поло­вину ширины:

img {
  width: 100%;
}

@media (width > 960px) {
  img {
    width: 50%;
  }
}
<img 
  src="img-1000.jpg"
  srcset="img-1400.jpg 1400w">

Бра­у­зер на момент выбора кар­тинки не знает ширину img в вёрстке — выбор про­ис­хо­дит до постро­е­ния стра­ницы. Поэтому и в этом слу­чае он выбе­рет кар­тинку под всю ширину экрана.

Под­ска­жем бра­у­зеру воз­мож­ные раз­меры эле­мента в атри­буте sizes. В конце — раз­мер по умол­ча­нию, исполь­зу­ется, если ни одно усло­вие выше не удовлетворено.

img {
  width: 100%;
}

@media (width > 960px) {
  img {
    width: 50%;
  }
}
<!-- Проще всего взять медиавыражение из ЦСС, которое определяет ширину картинки, и перенести значения в sizes, заменяя проценты на vw -->

<img 
  src="img-1000.jpg"
  srcset="img-1400.jpg 1400w"
  sizes="
    (width > 960px) 50vw,
    100vw">

Теперь бра­у­зер знает, что кар­тинка на ком­пью­тере зани­мает поло­вину ширины и выбе­рет опти­маль­ную кар­тинку. Если раз­ме­ров много, сле­дите за их поряд­ком, бра­у­зер выбе­рет пер­вое сра­бо­тав­шее усло­вие и не пой­дёт дальше.

img‑1000.jpg

Ширина экрана 375, оптимальная картинка из имеющихся — img‑1000

img‑1400.jpg

1400, оптимальная картинка — img‑1440

img‑1000.jpg

Ширина экрана 375, оптимальная картинка из имеющихся — img‑1000

img‑1400.jpg

1400, но картинка занимает только половину, img‑1400 избыточно, достаточно img‑1000

img‑1000.jpg

Ширина экрана 375, оптимальная картинка из имеющихся — img‑1000

img‑1000.jpg

1400, браузер знает, что картинка занимает половину и правильно выбирает оптимальную картинку — img‑1000

1400.jpg
1000.jpg

На ширине 1440 оптимальная картинка из имеющихся — 1400.jpg, на ширине 375 — 1000.jpg

1400.jpg
1000.jpg

Но если картинка занимает только половину, то 1400.jpg избыточно, достаточно 1000.jpg

1000.jpg
1000.jpg

Когда браузер знает, что картинка занимает половину, то правильно выбирает оптимальную картинку — 1000.jpg

Пока img с атрибутом srcset всегда занимает 100% ширины экрана, всё работает отлично, браузер знает ширину экрана и подберёт под неё оптимальную картинку из имеющихся в src и srcset.

<img 
  src="img-1000.jpg"
  srcset="img-1400.jpg 1400w">

Но допустим, картинка на широком экране занимает половину ширины:

img {
  width: 100%;
}

@media (width > 960px) {
  img {
    width: 50%;
  }
}
<img 
  src="img-1000.jpg"
  srcset="img-1400.jpg 1400w">

Браузер на момент выбора картинки не знает ширину img в вёрстке — выбор происходит до построения страницы. Поэтому и в этом случае он выберет картинку под всю ширину экрана.

Подскажем браузеру возможные размеры элемента в атрибуте sizes. В конце — размер по умолчанию, используется, если ни одно условие выше не удовлетворено.

img {
  width: 100%;
}

@media (width > 960px) {
  img {
    width: 50%;
  }
}
<!-- Проще всего взять медиавыражение из ЦСС, которое определяет ширину картинки, и перенести значения в sizes, заменяя проценты на vw -->

<img 
  src="img-1000.jpg"
  srcset="img-1400.jpg 1400w"
  sizes="
    (width > 960px) 50vw,
    100vw">

Теперь браузер знает, что картинка на компьютере занимает половину ширины и выберет оптимальную картинку. Если размеров много, следите за их порядком, браузер выберет первое сработавшее условие и не пойдёт дальше.

Адаптивные картинки, picture

Если атри­бут srcset под­ска­зы­вает бра­у­зеру, какую кар­тинку выбрать, то тег picture явно ука­зы­вает, какую кар­тинку выбрать. Обычно srcset исполь­зуют для опти­ми­за­ции, а picture — для работы с внеш­ним видом страницы.

Пока­жем раз­ные по фор­мату банеры на раз­ных раз­ме­рах окна:

<picture>
  <source 
    srcset="banner-wide.jpg"
    media="(width >= 1440px)"
  >
  <source 
    srcset="banner.jpg"
    media="(width > 768px)"
  >
  <!-- Если ни одно условие выше не выполняется -->
  <img src="banner-square.jpg">
</picture>

При ширине окна от 1440 пк

768⁠—1399 пк

При другой ширине

Адаптивные картинки, picture

Если атрибут srcset подсказывает браузеру, какую картинку выбрать, то тег picture явно указывает, какую картинку выбрать. Обычно srcset используют для оптимизации, а picture — для работы с внешним видом страницы.

Покажем разные по формату банеры на разных размерах окна:

<picture>
  <source 
    srcset="banner-wide.jpg"
    media="(width >= 1440px)"
  >
  <source 
    srcset="banner.jpg"
    media="(width > 768px)"
  >
  <!-- Если ни одно условие выше не выполняется -->
  <img src="banner-square.jpg">
</picture>

При ширине окна от 1440 пк

768⁠—1399 пк

768⁠—1399 пк

В про­дви­ну­той раз­ра­ботке созда­ние адап­тив­ных кар­ти­нок авто­ма­ти­зи­руют: про­грамма гене­ри­рует весь код и нуж­ные вер­сии самих картинок.

Руч­ное опи­са­ние и под­держка srcset или picture тре­бует много вре­мени и вни­ма­ния, боль­шой шанс что‑то упу­стить или оши­биться. Поэтому сове­туем при руч­ной вёрстке не стре­миться сде­лать все кар­тинки мак­си­мально адап­тив­ными, а огра­ни­читься точеч­ными опти­ми­за­ци­ями самой тяжё­лой графики.

Удоб­ный и эффек­тив­ный инстру­мент опти­ми­за­ции кар­ти­нок при руч­ной вёрстке — про­грамма ImageOptim. Она заметно умень­шает раз­мер кар­ти­нок без потери каче­ства и этим уско­ряет загрузку стра­ницы на всех устройствах.

Перетащите папку с вёрсткой внутрь программы, она сама найдёт и оптимизирует все картинки внутри папки

В продвинутой разработке создание адаптивных картинок автоматизируют: программа генерирует весь код и нужные версии самих картинок.

Ручное описание и поддержка srcset или picture требует много времени и внимания, большой шанс что‑то упустить или ошибиться. Поэтому советуем при ручной вёрстке не стремиться сделать все картинки максимально адаптивными, а ограничиться точечными оптимизациями самой тяжёлой графики.

Удобный и эффективный инструмент оптимизации картинок при ручной вёрстке — программа ImageOptim. Она заметно уменьшает размер картинок без потери качества и этим ускоряет загрузку страницы на всех устройствах.

Перетащите папку с вёрсткой внутрь программы, она сама найдёт и оптимизирует все картинки внутри папки

Тест

Какое ЦСС‑правило включит гриды для элемента?

position: grid;
display: grid;
display: grid-columns;
display: rows-cols;
grid-template-rows: auto;
grid-columns: 1fr 1fr;

Выберите верные утверждения о гридах.

Для грид‑контейнера задают ячейки, элементы внутри контейнера распределяются по этим ячейкам
Размеры колонок и строк задают только в относительных единицах измерения
Ячейки могут быть не фиксированными: тянуться или занимать всё доступное место
Гриды не имеют собственного свойства для управления отступами элементов

Внутри грид‑контейнера определяются направляющие, формируя колонки и строки, — ячейки, грид‑элементы распределяются по этим ячейкам. Размеры колонок и строк могут быть не строгими

Какой вид раскладки применится в приведённом коде и почему?

.box {
  display: flex;
  display: grid;
}

При конфликте в ЦСС применяются стили, объявленные ниже, кроме случаев, когда у стилей выше большая специфичность

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

Гриды, потому что свойство с ними объявлено ниже

Флексбокс, потому что свойство объявлено выше

Флексбокс, потому что это наиболее поддерживаемый и распространённый вид раскладки

Не применятся ни гриды, ни флексбоксы, потому что произойдёт конфликт свойства

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

За что отвечает свойство grid-auto-flow?

Свойство автоматически устанавливает остальные свойства грид‑контейнера в усреднённый вид, чтобы это не нужно было делать вручную
Свойство отвечает за порядок, в котором грид‑элементы заполняют грид‑контейнер: сначала по рядам или по колонкам
Свойство задаёт размеры ячеек, чья ширина задана как auto

По умолчанию элементы заполняют грид‑контейнер ряд за рядом, а если указать grid‑auto‑flow: column — начнут заполнять колонку за колонкой, сверху вниз

grid-template-columns: 1fr 1fr;
grid-template-columns: 2fr 2fr;
grid-template-columns: 1fr auto;
grid-template-columns: auto;
grid-template-columns: equal;
grid-template: equal;

Какой код заставит две грид‑колонки равномерно растянуться и занять всё доступное пространство?

Чтобы равномерно растянуть несколько колонок, укажите им одинаковые размеры в fr

Что рекомендуют авторы книги при выборе между флексбоксами и гридами?

Использовать флексбоксы только для элементов, вмещающихся в один экран
Не использовать флексбоксы для раскладки
Использовать гриды только для создания модульной сетки
Не использовать гриды в небольших элементах
Использовать гриды только когда нужны и колонки и строки, не использовать если нужны только колонки или только строки
Не использовать флексбоксы для контейнеров с более чем десятью элементами
Авторы не дают строгих правил, а советуют выбирать между флексбоксами и гридами, ориентируясь на свой опыт, задачу и контекст кода

Авторы советуют выбирать инструмент, более подходящий для каждой конкретной задачи

К чему может привести указание размеров элемента в пикселях?

Элемент не влезет в экран, если будет больше него по размеру

Содержимое элемента может переполнить его и обрезаться

Произойдёт синтаксическая ошибка и остановка применения дальнейших стилей

Элемент станет труднее переиспользовать

Размеры в пикселях лишают элемент адаптивности, мешают его переиспользовать. Иногда это не критично, но обычно размеры в пикселях создают проблемы и усложняют работу с вёрсткой

Как работает свойство overflow?

Свойство срабатывает, если содержимое элемента больше его ширины и высоты, и указывает, в какой другой элемент перенести не влезающее содержимое
Свойство определяет, как поступать с переполняющим элемент содержимым: обрезать, прятать или добавлять прокрутку
Свойство не допускает переполнения элемента, адаптируя его высоту и ширину под размеры содержимого
Свойство применяет оптимизации к содержимому элемента, чтобы пропорционально уменьшить его размеры и избежать переполнения

Что такое медиавыражение?

Медиавыражение — это указание предпочтительного формата отображения страницы, например без мобильной версии

Медиавыражение — это набор стилей, применяющиеся при соблюдении условий, связанных с форматом отображения, настройкой оформления или устройством пользователя

Медиавыражение — это особое представление страницы в виде превью для рассылок, социальных сетей и медиаплатформ

Ответьте на все вопросы теста,
чтобы узнать результат.
Результат
↺ Пересдать

Тест

Какое ЦСС‑правило включит гриды для элемента?

position: grid;
display: grid;
display: grid-columns;
display: rows-cols;
grid-template-rows: auto;
grid-columns: 1fr 1fr;

Выберите верные утверждения о гридах.

Для грид‑контейнера задают ячейки, элементы внутри контейнера распределяются по этим ячейкам
Размеры колонок и строк задают только в относительных единицах измерения
Ячейки могут быть не фиксированными: тянуться или занимать всё доступное место
Гриды не имеют собственного свойства для управления отступами элементов

Внутри грид‑контейнера определяются направляющие, формируя колонки и строки, — ячейки, грид‑элементы распределяются по этим ячейкам. Размеры колонок и строк могут быть не строгими

Какой вид раскладки применится в приведённом коде и почему?

.box {
  display: flex;
  display: grid;
}

При конфликте в ЦСС применяются стили, объявленные ниже, кроме случаев, когда у стилей выше большая специфичность

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

Гриды, потому что свойство с ними объявлено ниже

Флексбокс, потому что свойство объявлено выше

Флексбокс, потому что это наиболее поддерживаемый и распространённый вид раскладки

Не применятся ни гриды, ни флексбоксы, потому что произойдёт конфликт свойства

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

За что отвечает свойство grid-auto-flow?

Свойство автоматически устанавливает остальные свойства грид‑контейнера в усреднённый вид, чтобы это не нужно было делать вручную
Свойство отвечает за порядок, в котором грид‑элементы заполняют грид‑контейнер: сначала по рядам или по колонкам
Свойство задаёт размеры ячеек, чья ширина задана как auto

По умолчанию элементы заполняют грид‑контейнер ряд за рядом, а если указать grid‑auto‑flow: column — начнут заполнять колонку за колонкой, сверху вниз

grid-template-columns: 1fr 1fr;
grid-template-columns: 2fr 2fr;
grid-template-columns: 1fr auto;
grid-template-columns: auto;
grid-template-columns: equal;
grid-template: equal;

Какой код заставит две грид‑колонки равномерно растянуться и занять всё доступное пространство?

Чтобы равномерно растянуть несколько колонок, укажите им одинаковые размеры в fr

Что рекомендуют авторы книги при выборе между флексбоксами и гридами?

Использовать флексбоксы только для элементов, вмещающихся в один экран
Не использовать флексбоксы для раскладки
Использовать гриды только для создания модульной сетки
Не использовать гриды в небольших элементах
Использовать гриды только когда нужны и колонки и строки, не использовать если нужны только колонки или только строки
Не использовать флексбоксы для контейнеров с более чем десятью элементами
Авторы не дают строгих правил, а советуют выбирать между флексбоксами и гридами, ориентируясь на свой опыт, задачу и контекст кода

Авторы советуют выбирать инструмент, более подходящий для каждой конкретной задачи

К чему может привести указание размеров элемента в пикселях?

Элемент не влезет в экран, если будет больше него по размеру

Содержимое элемента может переполнить его и обрезаться

Произойдёт синтаксическая ошибка и остановка применения дальнейших стилей

Элемент станет труднее переиспользовать

Размеры в пикселях лишают элемент адаптивности, мешают его переиспользовать. Иногда это не критично, но обычно размеры в пикселях создают проблемы и усложняют работу с вёрсткой

Как работает свойство overflow?

Свойство срабатывает, если содержимое элемента больше его ширины и высоты, и указывает, в какой другой элемент перенести не влезающее содержимое
Свойство определяет, как поступать с переполняющим элемент содержимым: обрезать, прятать или добавлять прокрутку
Свойство не допускает переполнения элемента, адаптируя его высоту и ширину под размеры содержимого
Свойство применяет оптимизации к содержимому элемента, чтобы пропорционально уменьшить его размеры и избежать переполнения

Что такое медиавыражение?

Медиавыражение — это указание предпочтительного формата отображения страницы, например без мобильной версии

Медиавыражение — это набор стилей, применяющиеся при соблюдении условий, связанных с форматом отображения, настройкой оформления или устройством пользователя

Медиавыражение — это особое представление страницы в виде превью для рассылок, социальных сетей и медиаплатформ

Ответьте на все вопросы теста, чтобы узнать результат.
Результат
↺ Пересдать
Скрыто 66 разворотов