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

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

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

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

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

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

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

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

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

Оглавление

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

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

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

Оглавление

Знакомство с ХТМЛ

ХТМЛ‑файл в текстовом редакторе

Что такое веб‑страница

Любая веб‑стра­ница — это про­сто тек­сто­вый файл с осо­бой разметкой.

Чтобы создать стра­ницу, доста­точно создать у себя на ком­пью­тере файл с любым име­нем и рас­ши­ре­нием .html, затем открыть его в тек­сто­вом редак­торе и напи­сать внутри любой текст.

ХТМЛ‑файл в браузере

Если затем пере­та­щить этот файл в бра­у­зер, мы уви­дим стра­ницу с тек­стом, сей­час она выгля­дит про­сто и неприглядно.

Чтобы стра­ницу было удобно читать и изу­чать, её содер­жи­мое осо­бым обра­зом струк­ту­ри­руют и оформ­ляют. Сей­час раз­бе­рёмся, как это делают.

Редактировать ХТМЛ‑файлы можно в стандартной программе «Блокнот», но удобнее использовать более продвинутые текстовые редакторы. Например, несложный в освоении бесплатный редактор «Саблайм»

Знакомство с ХТМЛ

ХТМЛ‑файл в текстовом редакторе

Что такое веб‑страница

Любая веб‑страница — это просто текстовый файл с особой разметкой.

Чтобы создать страницу, достаточно создать у себя на компьютере файл с любым именем и расширением .html, затем открыть его в текстовом редакторе и написать внутри любой текст.

ХТМЛ‑файл в браузере

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

Чтобы страницу было удобно читать и изучать, её содержимое особым образом структурируют и оформляют. Сейчас разберёмся, как это делают.

Редактировать ХТМЛ‑файлы можно в стандартной программе «Блокнот», но удобнее использовать более продвинутые текстовые редакторы. Например, несложный в освоении бесплатный редактор «Саблайм»

Лайфхак: песочницы для кода

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

Песоч­ницы подой­дут для тре­ни­ровки, быст­рой про­верки гипо­тез или чтобы поде­литься кодом с дру­гими людьми. Запу­стить в песоч­нице пол­но­цен­ный сайт не получится.

Самые популярные и простые в освоении песочницы: Кодпен и Код Сэндбокс

Лайфхак: песочницы для кода

Если не хочется писать код в файлах, можно делать это на одном из множества сайтов‑песочниц. На таких сайтах есть редактор и окошко с результатом вёрстки, который обновляется в реальном времени при изменении кода.

Песочницы подойдут для тренировки, быстрой проверки гипотез или чтобы поделиться кодом с другими людьми. Запустить в песочнице полноценный сайт не получится.

Самые популярные и простые в освоении песочницы: Кодпен и Код Сэндбокс

Теги

Чтобы струк­ту­ри­ро­вать и офор­мить стра­ницу, её раз­ме­чают язы­ком ХТМЛ.

ХТМЛ‑раз­метка состоит из кон­тей­не­ров с содер­жи­мым — тегов. Текст поме­щают внутрь тега, между его откры­ва­ю­щей и закры­ва­ю­щей частями:

<h1>Заголовок</h1>
<p>Текст абзаца.</p>
<p>Текст второго абзаца.</p>

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

Назва­ние тега отра­жает его смысл. Напри­мер, h1 — heading 1 — заго­ло­вок пер­вого уровня.

Теги можно вкла­ды­вать друг в друга. Напри­мер, сде­лать жир­ный текст внутри абзаца или пункты внутри списка:

<p>По-настоящему <b>важные принципы</b>:</p>

<ul>
  <li>Не планировать впритык</li>
  <li>Сделать значит сдать</li>
  <li>Флекс — всегда боль</li>
</ul>

Есть теги, кото­рые не нужно закры­вать и в кото­рые нельзя ничего вло­жить. Напри­мер, тег пере­носа строки br:

<h1>
  Лев Николаевич Толстой. <br>
  Жизнь и взгляды
</h1>

Не закры­ва­ются теги кар­ти­нок и раз­ных интер­ак­тив­ных эле­мен­тов: видео, полей ввода, кно­пок. Все эти эле­менты мы раз­бе­рём дальше в книге.

Ещё в ХТМЛ есть ком­мен­та­рии. Это спе­ци­аль­ный текст, кото­рый не будет видно на стра­нице, только в коде. Раз­ра­бот­чики исполь­зуют ком­мен­та­рии в каче­стве под­ска­зок себе и дру­гим людям, рабо­та­ю­щим с кодом.

Ком­мен­та­рии пишут внутри кон­струк­ции <!-- … -->, это поз­во­ляет удобно пря­тать любые теги — доста­точно допи­сать вос­кли­ца­тель­ный знак и дефисы в начале и конце тега и он пре­вра­тится в ком­мен­та­рий, про­па­дёт со стра­ницы, при этом остав­шись в коде. На языке раз­ра­бот­чи­ков это назы­ва­ется «заком­мен­тить» — спря­тать кусок вёрстки.

<p>Автор: Галина Игнатова</p>

<!-- Менять код только с разрешения главреда! -->
<p>Издание «Валенсия», код агента 348187</p>

<!-- Источники, закомментить, когда ссылок нет  -->
<!-- ul>
  <li></li>
  <li></li>
</ul -->

Теги

Чтобы структурировать и оформить страницу, её размечают языком ХТМЛ.

ХТМЛ‑разметка состоит из контейнеров с содержимым — тегов. Текст помещают внутрь тега, между его открывающей и закрывающей частями:

<h1>Заголовок</h1>
<p>Текст абзаца.</p>
<p>Текст второго абзаца.</p>

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

Название тега отражает его смысл. Например, h1 — heading 1 — заголовок первого уровня.

Теги можно вкладывать друг в друга. Например, сделать жирный текст внутри абзаца или пункты внутри списка:

<p>По-настоящему <b>важные принципы</b>:</p>

<ul>
  <li>Не планировать впритык</li>
  <li>Сделать значит сдать</li>
  <li>Флекс — всегда боль</li>
</ul>

Есть теги, которые не нужно закрывать и в которые нельзя ничего вложить. Например, тег переноса строки br:

<h1>
  Лев Николаевич Толстой. <br>
  Жизнь и взгляды
</h1>

Не закрываются теги картинок и разных интерактивных элементов: видео, полей ввода, кнопок. Все эти элементы мы разберём дальше в книге.

Ещё в ХТМЛ есть комментарии. Это специальный текст, который не будет видно на странице, только в коде. Разработчики используют комментарии в качестве подсказок себе и другим людям, работающим с кодом.

Комментарии пишут внутри конструкции <!-- … -->, это позволяет удобно прятать любые теги — достаточно дописать восклицательный знак и дефисы в начале и конце тега и он превратится в комментарий, пропадёт со страницы, при этом оставшись в коде. На языке разработчиков это называется «закомментить» — спрятать кусок вёрстки.

<p>Автор: Галина Игнатова</p>

<!-- Менять код только с разрешения главреда! -->
<p>Издание «Валенсия», код агента 348187</p>

<!-- Источники, закомментить, когда ссылок нет  -->
<!-- ul>
  <li></li>
  <li></li>
</ul -->
Скрыт 1 разворот
Скрыт 1 раз­во­рот

Даблдекер на знаке. Транспорт Лондона

Даблдекер на знаке. Транспорт Лондона

Даблдекер на знаке. Транспорт Лондона

Даблдекер на знаке. Транспорт Лондона

Даблдекер на знаке. Транспорт Лондона

<img>

<p>
  Даблдекер на знаке.
  <a>
    Транспорт Лондона
  </a>
</p>
<img>

<p>
  Даблдекер на знаке.
  <a href="https://tfl.gov.uk/info-for/suppliers-and-contractors/design-standards">
    Транспорт Лондона
  </a>
</p>
<img src="https://bureau.ru/projects/book-html/files/london-bus.png">

<p>
  Даблдекер на знаке.
  <a href="https://tfl.gov.uk/info-for/suppliers-and-contractors/design-standards">
    Транспорт Лондона
  </a>
</p>
<img src="..."
  width="300px"
  height="80px">

<p>
  Даблдекер на знаке.
  <a href="...">
    Транспорт Лондона
  </a>
</p>
<img src="..."
  width="300px"
  height="80px"
  style="transform: rotate(-5deg) translateY(-3px)">

<p style="font-weight: 100">
  Даблдекер на знаке.
  <a href="...">
    Транспорт Лондона
  </a>
</p>

Свер­стаем кар­тинку и под­пись к ней со ссыл­кой на источ­ник изображения.

Атри­бут href задаёт адрес ссылки.

Чтобы кар­тинка появи­лась, нужно ука­зать атри­бут src.

Чтобы настро­ить раз­меры кар­тинки, исполь­зуют атри­буты width и height.

Самый про­дви­ну­тый атри­бут — style, в нём можно настро­ить что угодно. О нём рас­ска­жем позже.

Даблдекер на знаке. Транспорт Лондона

Даблдекер на знаке. Транспорт Лондона

Даблдекер на знаке. Транспорт Лондона

Даблдекер на знаке. Транспорт Лондона

Даблдекер на знаке. Транспорт Лондона

<img>

<p>
  Даблдекер на знаке.
  <a>
    Транспорт Лондона
  </a>
</p>
<img>

<p>
  Даблдекер на знаке.
  <a href="https://tfl.gov.uk/info-for/suppliers-and-contractors/design-standards">
    Транспорт Лондона
  </a>
</p>
<img src="https://bureau.ru/projects/book-html/files/london-bus.png">

<p>
  Даблдекер на знаке.
  <a href="https://tfl.gov.uk/info-for/suppliers-and-contractors/design-standards">
    Транспорт Лондона
  </a>
</p>
<img src="..."
  width="300px"
  height="80px">

<p>
  Даблдекер на знаке.
  <a href="...">
    Транспорт Лондона
  </a>
</p>
<img src="..."
  width="300px"
  height="80px"
  style="transform: rotate(-5deg) translateY(-3px)">

<p style="font-weight: 100">
  Даблдекер на знаке.
  <a href="...">
    Транспорт Лондона
  </a>
</p>

Сверстаем картинку и подпись к ней со ссылкой на источник изображения.

Атрибут href задаёт адрес ссылки.

Чтобы картинка появилась, нужно указать атрибут src.

Чтобы настроить размеры картинки, используют атрибуты width и height.

Самый продвинутый атрибут — style, в нём можно настроить что угодно. О нём расскажем позже.

Скрыт 1 разворот
Скрыт 1 раз­во­рот

Знакомство с ЦСС

ХТМЛ — это текст, кото­рый опи­сы­вает содер­жи­мое стра­ницы, а ЦСС — это текст, кото­рый опи­сы­вает внеш­ний вид этого содер­жи­мого. ХТМЛ отве­чает на вопрос что пока­зать, а ЦСС — как показать.

ЦСС‑код можно писать прямо внутри ХТМЛ‑файла в осо­бом теге style. Сам код нагляд­ный, его легко читать и пони­мать. Сна­чала пишут, какой эле­мент сти­ли­зо­вать, затем в фигур­ных скоб­ках — свой­ства эле­мента, как он дол­жен выглядеть.

Напри­мер, так можно задать заго­ловку и абза­цам цвет, шрифт, кегль и интер­ли­ньяж. Назва­ния свойств и их зна­че­ния гово­рят сами за себя:

<!doctype html>
<html lang="ru">
  <head>
    <meta charset="UTF-8">
    <title>Прекрасный Хайош-Байа, Венгрия</title>

    <!-- 
      Все стили из тега style применятся к странице 
    -->
    <style>
      h1 {
        font-family: Helvetica;
        font-size: 48px;
        line-height: 52px;
        color: rgb(6 85 128);
      }

      p {
        font-size: 20px;
        line-height: 24px;
        font-family: Times;
      }
      
      /* 
        В ЦСС куча свойств, с большинством мы познакомимся в книге. Кстати, так выглядит ЦСС-комментарий — текст между слешей и звёздочек не видно на странице, только в коде 
      */
    </style>
  </head>

  <body>
    <h1>Прекрасный Хайош-Байа, Венгрия</h1>
    <p>Горизонт ожидания…</p>
    <p>Шиллер утверждал…</p>
  </body> 
</html>

Попробуйте скопировать код и поэкспериментировать со свойствами. Например, изменить кегли, шрифты и цвета

Знакомство с ЦСС

ХТМЛ — это текст, который описывает содержимое страницы, а ЦСС — это текст, который описывает внешний вид этого содержимого. ХТМЛ отвечает на вопрос что показать, а ЦСС — как показать.

ЦСС‑код можно писать прямо внутри ХТМЛ‑файла в особом теге style. Сам код наглядный, его легко читать и понимать. Сначала пишут, какой элемент стилизовать, затем в фигурных скобках — свойства элемента, как он должен выглядеть.

Например, так можно задать заголовку и абзацам цвет, шрифт, кегль и интерлиньяж. Названия свойств и их значения говорят сами за себя:

<!doctype html>
<html lang="ru">
  <head>
    <meta charset="UTF-8">
    <title>Прекрасный Хайош-Байа, Венгрия</title>

    <!-- 
      Все стили из тега style применятся к странице 
    -->
    <style>
      h1 {
        font-family: Helvetica;
        font-size: 48px;
        line-height: 52px;
        color: rgb(6 85 128);
      }

      p {
        font-size: 20px;
        line-height: 24px;
        font-family: Times;
      }
      
      /* 
        В ЦСС куча свойств, с большинством мы познакомимся в книге. Кстати, так выглядит ЦСС-комментарий — текст между слешей и звёздочек не видно на странице, только в коде 
      */
    </style>
  </head>

  <body>
    <h1>Прекрасный Хайош-Байа, Венгрия</h1>
    <p>Горизонт ожидания…</p>
    <p>Шиллер утверждал…</p>
  </body> 
</html>

Попробуйте скопировать код и поэкспериментировать со свойствами. Например, изменить кегли, шрифты и цвета

Скрыт 1 разворот
Скрыт 1 раз­во­рот

Лайфхак: как называть классы

Чтобы код было проще читать и пони­мать, имена клас­сов делают наглядными.

В име­нах избе­гают слу­чай­ных набо­ров букв, аббре­ви­а­тур, сокра­ще­ний и всего, что может как‑либо запутать.

Классы не при­нято назы­вать по‑рус­ски лати­ни­цей. Такие имена тяжело читать, а неко­то­рые рус­ские буквы можно напи­сать лати­ни­цей по‑раз­ному, что уве­ли­чи­вает веро­ят­ность ошибок.

/* Плохо */
.t { }
.txthl { }
.informaciya { }
.informacia { }
.informacija { }

/* Лучше */
.title { }
.highlight { }
.info { }

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

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

/* Каша, тяжело читать */
.pagetitle { }
.pageauthor { }

/* Структура, легко читать */
.page-title { }
.page-author { }

.pageTitle { }
.pageAuthor { }

Стиль‑через‑дефис называют кебабом, потому что похоже на мясо на шампуре. А стильЧерезЗаглавные — кэмелом, потому что похоже на горбы верблюда.

Совет. Чтобы в текстовом редакторе перемещаться по отдельным словам в именах с дефисами, используйте Option или Alt со стрелками влево и вправо. Чтобы выделять слова, дополнительно зажимайте Shift

Лайфхак: как называть классы

Чтобы код было проще читать и понимать, имена классов делают наглядными.

В именах избегают случайных наборов букв, аббревиатур, сокращений и всего, что может как‑либо запутать.

Классы не принято называть по‑русски латиницей. Такие имена тяжело читать, а некоторые русские буквы можно написать латиницей по‑разному, что увеличивает вероятность ошибок.

/* Плохо */
.t { }
.txthl { }
.informaciya { }
.informacia { }
.informacija { }

/* Лучше */
.title { }
.highlight { }
.info { }

Если имя состоит из нескольких слов, лучше визуально их разделить. Два самых популярных стиля: разделять слова дефисами или заглавными буквами.

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

/* Каша, тяжело читать */
.pagetitle { }
.pageauthor { }

/* Структура, легко читать */
.page-title { }
.page-author { }

.pageTitle { }
.pageAuthor { }

Стиль‑через‑дефис называют кебабом, потому что похоже на мясо на шампуре. А стильЧерезЗаглавные — кэмелом, потому что похоже на горбы верблюда.

Совет. Чтобы в текстовом редакторе перемещаться по отдельным словам в именах с дефисами, используйте Option или Alt со стрелками влево и вправо. Чтобы выделять слова, дополнительно зажимайте Shift

Где хранить стили

Пока на стра­нице мало эле­мен­тов, удобно хра­нить стили в теге style. С ростом коли­че­ства эле­мен­тов и кода, рабо­тать с тегом style ста­нет тяже­лее: посто­янно про­кру­чи­вать от сти­лей к раз­метке и обратно, выис­ки­вать нуж­ные кусочки кода, нагру­жать мозг.

Когда сти­лей много, удоб­нее выне­сти их в отдель­ный файл и рабо­тать с ним в отдель­ном окне редактора.

Файл со сти­лями имеет рас­ши­ре­ние .css. Обычно его назы­вают style.css и кла­дут рядом с ХТМЛ‑стра­ни­цей, это самый про­стой спо­соб для неболь­ших сай­тов. Файл под­клю­чают к стра­нице тегом link, все стили из под­клю­чён­ного файла при­ме­нятся к странице.

Файл сти­лей можно под­клю­чить сразу к несколь­ким ХТМЛ‑стра­ни­цам и управ­лять их сти­лями из одного места: поме­няли отступы у абза­цев в style.css, отступы поме­ня­лись на всех страницах.

В более слож­ных про­ек­тах бывает несколько фай­лов со сти­лями, рас­по­ло­жен­ных где угодно, даже на дру­гом сайте.

index.html

<!-- … -->
  <head>
    <title>Моя веб-страница</title>

    <style>
      body {
        font-size: 16px;
        line-height: 18px;
      }

      h1 {
        font-size: 48px;
        line-height: 52px;
        font-family: Helvetica;
      }
    </style>
  </head>
<!-- … -->

index.html

<!-- … -->
  <head>
    <title>Моя веб-страница</title>

    <!-- Вместо style подключаем лежащий рядом файл -->
    <link rel="stylesheet" href="style.css">
  </head>
<!-- … -->

style.css

/* Стили, которые раньше были в теге style */
body {
  font-size: 16px;
  line-height: 18px;
}

h1 {
  font-size: 48px;
  line-height: 52px;
  font-family: Helvetica;
}

index.html

<!-- … -->
  <head>
    <title>Моя веб-страница</title>

    <style>
      body {
        font-size: 16px;
        line-height: 18px;
      }

      h1 {
        font-size: 48px;
        line-height: 52px;
        font-family: Helvetica;
      }
    </style>
  </head>
<!-- … -->

index.html

<!-- … -->
  <head>
    <title>Моя веб-страница</title>

    <!-- Вместо style подключаем лежащий рядом файл -->
    <link rel="stylesheet" href="style.css">
  </head>
<!-- … -->

style.css

/* Стили, которые раньше были в теге style */
body {
  font-size: 16px;
  line-height: 18px;
}

h1 {
  font-size: 48px;
  line-height: 52px;
  font-family: Helvetica;
}

Где хранить стили

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

Когда стилей много, удобнее вынести их в отдельный файл и работать с ним в отдельном окне редактора.

Файл со стилями имеет расширение .css. Обычно его называют style.css и кладут рядом с ХТМЛ‑страницей, это самый простой способ для небольших сайтов. Файл подключают к странице тегом link, все стили из подключённого файла применятся к странице.

Файл стилей можно подключить сразу к нескольким ХТМЛ‑страницам и управлять их стилями из одного места: поменяли отступы у абзацев в style.css, отступы поменялись на всех страницах.

В более сложных проектах бывает несколько файлов со стилями, расположенных где угодно, даже на другом сайте.

Скрыто 3 разворота
Скрыто 3 раз­во­рота

Блочные и строчные элементы

В ХТМЛ есть два основ­ных типа элементов.

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

Строчные элементы зани­мают ровно столько места, сколько нужно их содер­жи­мому, выстра­и­ва­ются друг за дру­гом и пере­но­сятся как строки. Напри­мер, так ведут себя слова, ссылки и кар­тинки в тек­сте. Строч­ные эле­менты обычно поме­ща­ются внутри блочных.

Можно изме­нить тип эле­мента: заста­вить слово вести себя как блок, а заго­ло­вок — как слово в строке. За это отве­чает свой­ство display: зна­че­ние block делает эле­мент блоч­ным, а inline — строч­ным. Бывают и дру­гие зна­че­ния display, мы позна­ко­мимся с ними дальше в книге.

Блочные и строчные элементы

В ХТМЛ есть два основных типа элементов.

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

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

Можно изменить тип элемента: заставить слово вести себя как блок, а заголовок — как слово в строке. За это отвечает свойство display: значение block делает элемент блочным, а inline — строчным. Бывают и другие значения display, мы познакомимся с ними дальше в книге.

Отступы

У эле­мен­тов бывают внут­рен­ние и внеш­ние отступы.

Внутренние отступы от гра­ниц эле­мента до содер­жи­мого назы­вают «падин­гами». Их задают свой­ством padding для раз­ных сторон:

p {
  padding-left: 10px;
  padding-right: 10px;
  padding-top: 20px;
  padding-bottom: 30px;
}

Фон эле­мента рас­про­стра­ня­ется на падинги, это удобно при вёрстке кар­то­чек и плашек:

p {
  padding-left: 10px;
  padding-right: 10px;
  padding-top: 20px;
  padding-bottom: 30px;
  font-size: 120%;
  background: #f3f3f3;
}

Внешние отступы от гра­ниц эле­мента до сосед­них эле­мен­тов назы­вают «мар­жи­нами». Их задают свой­ством margin для раз­ных сторон:

p {
  padding-left: 10px;
  padding-right: 10px;
  padding-top: 20px;
  padding-bottom: 30px;
  font-size: 120%;
  background: #f3f3f3;
  margin-bottom: 32px;
}

Вер­ти­каль­ные мар­жины могут быть только у блоч­ных элементов.

Мар­жины и падинги можно и нужно комбинировать.

Поме­стим абзацы из при­мера и заго­ло­вок внутрь кар­точки с под­лож­кой. Чтобы не зада­вать каж­дому эле­менту отступы до края кар­точки, ука­жем внут­рен­ние отступы самой кар­точке. А эле­мен­там ука­жем только вер­ти­каль­ные отступы друг от друга:

<div class="card">
  <h3>How doth the little crocodile</h3>
  <p>...</p>
  <p>...</p>
</div>
.card {
  padding-left: 10px;
  padding-right: 10px;
  padding-top: 20px;
  padding-bottom: 30px;
  background-color: #f3f3f3;
}

h3 {
  margin-bottom: 24px;
}

p {
  margin-top: 0;
  margin-bottom: 18px;
}

/* Обнуляем нижний отступ для последнего абзаца */
p:last-child {
  margin-bottom: 0;
}

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

Отступы

У элементов бывают внутренние и внешние отступы.

Внутренние отступы от границ элемента до содержимого называют «падингами». Их задают свойством padding для разных сторон:

p {
  padding-left: 10px;
  padding-right: 10px;
  padding-top: 20px;
  padding-bottom: 30px;
}

Фон элемента распространяется на падинги, это удобно при вёрстке карточек и плашек:

p {
  padding-left: 10px;
  padding-right: 10px;
  padding-top: 20px;
  padding-bottom: 30px;
  font-size: 120%;
  background: #f3f3f3;
}

Внешние отступы от границ элемента до соседних элементов называют «маржинами». Их задают свойством margin для разных сторон:

p {
  padding-left: 10px;
  padding-right: 10px;
  padding-top: 20px;
  padding-bottom: 30px;
  font-size: 120%;
  background: #f3f3f3;
  margin-bottom: 32px;
}

Вертикальные маржины могут быть только у блочных элементов.

Маржины и падинги можно и нужно комбинировать.

Поместим абзацы из примера и заголовок внутрь карточки с подложкой. Чтобы не задавать каждому элементу отступы до края карточки, укажем внутренние отступы самой карточке. А элементам укажем только вертикальные отступы друг от друга:

<div class="card">
  <h3>How doth the little crocodile</h3>
  <p>...</p>
  <p>...</p>
</div>
.card {
  padding-left: 10px;
  padding-right: 10px;
  padding-top: 20px;
  padding-bottom: 30px;
  background-color: #f3f3f3;
}

h3 {
  margin-bottom: 24px;
}

p {
  margin-top: 0;
  margin-bottom: 18px;
}

/* Обнуляем нижний отступ для последнего абзаца */
p:last-child {
  margin-bottom: 0;
}

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

Лайфхак: краткая запись

У неко­то­рых ЦСС‑свойств есть крат­кая запись. Это спо­соб опти­ми­зи­ро­вать и сокра­тить код, заме­нить несколько свойств одним.

Напри­мер, крат­кая запись падинга одним свой­ством опи­сы­вает отступы сразу для всех сто­рон. Такая же крат­кая запись рабо­тает для маржина.

.example {
  padding-top: 10px;
  padding-right: 5px;
  padding-bottom: 20px;
  padding-left: 5px;

  padding: 10px 5px 20px 5px; /* Верх, право, низ, лево */

  padding: 10px 5px 20px; /* Верх, право-лево, низ */

  padding: 10px 5px; /* Низ-верх, право-лево */

  padding: 5px; /* Все отступы */
}

Можно опи­сать базо­вые стили крат­кой запи­сью, а в осо­бых слу­чаях ука­зать отличия.

p {
  margin: 0 18px 24px 0;
}

.lead {
  margin-bottom: 24px; /* Меняем только нижний маржин */
}

.noIndent {
  margin: 0; /* Меняем краткую запись целиком, все маржины обнулятся */
}

/* И наоборот: краткая запись переопределит все маржины */
h1 {
  margin-top: 8px;
  margin-bottom: 18px;
}

.pageTitle {
  margin: 27px 0 36px;
}

Лайфхак: краткая запись

У некоторых ЦСС‑свойств есть краткая запись. Это способ оптимизировать и сократить код, заменить несколько свойств одним.

Например, краткая запись падинга одним свойством описывает отступы сразу для всех сторон. Такая же краткая запись работает для маржина.

.example {
  padding-top: 10px;
  padding-right: 5px;
  padding-bottom: 20px;
  padding-left: 5px;

  padding: 10px 5px 20px 5px; /* Верх, право, низ, лево */

  padding: 10px 5px 20px; /* Верх, право-лево, низ */

  padding: 10px 5px; /* Низ-верх, право-лево */

  padding: 5px; /* Все отступы */
}

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

p {
  margin: 0 18px 24px 0;
}

.lead {
  margin-bottom: 24px; /* Меняем только нижний маржин */
}

.noIndent {
  margin: 0; /* Меняем краткую запись целиком, все маржины обнулятся */
}

/* И наоборот: краткая запись переопределит все маржины */
h1 {
  margin-top: 8px;
  margin-bottom: 18px;
}

.pageTitle {
  margin: 27px 0 36px;
}

Веб‑инспектор

В Хроме

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

Проще всего это сде­лать в бра­у­зере с помо­щью веб‑инспек­тора — встро­ен­ного набора инстру­мен­тов для разработчиков.

В Сафари

Открыть его можно с помо­щью соче­та­ния ⌘+Option+I на Маке и Ctrl+Shift+I или F12 в дру­гих ОС.

Первая вкладка любого веб‑инспектора — Элементы, основной инструмент для просмотра и редактирования кода страницы. Обычно эта вкладка разделена пополам: слева разметка, справа стили выбранного элемента

Веб‑инспектор

В Хроме

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

Проще всего это сделать в браузере с помощью веб‑инспектора — встроенного набора инструментов для разработчиков.

В Сафари

Открыть его можно с помощью сочетания ⌘+Option+I на Маке и Ctrl+Shift+I или F12 в других ОС.

Первая вкладка любого веб‑инспектора — Элементы, основной инструмент для просмотра и редактирования кода страницы. Обычно эта вкладка разделена пополам: слева разметка, справа стили выбранного элемента

Отредактируем портфолио, поменяв текст заголовка с помощью веб‑инспектора

В других браузерах пункт меню может называться «Проверить элемент»

Здесь и дальше мы будем использовать веб‑инспектор Гугль Хрома

В других браузерах есть отличия в деталях, но общий подход тот же

Изменения сохранились в браузере. Если обновить страницу, они исчезнут

Редактирование разметки. Чтобы выбрать эле­мент для редак­ти­ро­ва­ния, клик­нем на нём пра­вой кноп­кой и выбе­рем в кон­текст­ном меню «Инспектировать».

Откро­ется панель веб‑инспек­тора: слева эле­менты, справа их свойства.

Чтобы перейти в режим редак­ти­ро­ва­ния, два­жды клик­нем по тексту.

Затем изме­ним текст и нажмём «энтер», чтобы при­ме­нить изменения.

Отредактируем портфолио, поменяв текст заголовка с помощью веб‑инспектора

В других браузерах пункт меню может называться «Проверить элемент»

Здесь и дальше мы будем использовать веб‑инспектор Гугль Хрома

В других браузерах есть отличия в деталях, но общий подход тот же

Изменения сохранились в браузере. Если обновить страницу, они исчезнут

Редактирование разметки. Чтобы выбрать элемент для редактирования, кликнем на нём правой кнопкой и выберем в контекстном меню «Инспектировать».

Откроется панель веб‑инспектора: слева элементы, справа их свойства.

Чтобы перейти в режим редактирования, дважды кликнем по тексту.

Затем изменим текст и нажмём «энтер», чтобы применить изменения.

Посмот­рим, как выгля­дит кнопка в раз­ных состо­я­ниях. Два­жды клик­нем по списку клас­сов кнопки.

Поме­няем класс btn‑bg на btn‑sm и нажмём «энтер», чтобы при­ме­нить изменения.

Чтобы посмот­реть, как выгля­дит нажа­тая кнопка, клик­нем пра­вой кноп­кой и выбе­рем Force State — :active.

Новое состо­я­ние при­ме­нится к кнопке, соот­вет­ству­ю­щие стили появятся в панели справа.

Поэкспериментируем с кнопкой и её состояниями на промостранице Бутстрапа

В Бустрапе используют комбинации классов для модификации элементов

В нашем случае, btn — базовый класс, а btn‑sm и btn‑lg — модификаторы размера

Здесь же можно включить ховер, фокус или «посещённость» у ссылки

Оранжевый кружок отмечает элементы с изменёнными вручную состояниями

Поэкспериментируем с кнопкой и её состояниями на промостранице Бутстрапа

В Бустрапе используют комбинации классов для модификации элементов

В нашем случае, btn — базовый класс, а btn‑sm и btn‑lg — модификаторы размера

Здесь же можно включить ховер, фокус или «посещённость» у ссылки

Оранжевый кружок отмечает элементы с изменёнными вручную состояниями

Посмотрим, как выглядит кнопка в разных состояниях. Дважды кликнем по списку классов кнопки.

Поменяем класс btn‑bg на btn‑sm и нажмём «энтер», чтобы применить изменения.

Чтобы посмотреть, как выглядит нажатая кнопка, кликнем правой кнопкой и выберем Force State — :active.

Новое состояние применится к кнопке, соответствующие стили появятся в панели справа.

Поэкспериментируем с формой отправки вопроса в советы бюро

Бывает, кнопки и поля блокируются отдельно или в родительском <fieldset>

Атрибут disabled блокирует кнопки, инпуты, выпадайки и текстареи

Если атрибут disabled стоит у <fieldset>, то блокируются все вложенные элементы

Поэтому хорошие программисты дополнительно проверяют данные на сервере

Раз­бло­ки­руем отклю­чён­ную форму. Клик­нем по забло­ки­ро­ван­ной кнопке пра­вой кноп­кой и выбе­рем в кон­текст­ном меню «Инспектировать».

Откро­ется панель веб‑инспек­тора. Най­дём в ней забло­ки­ро­ван­ный эле­мент с атри­бу­том disabled.

Чтобы перейти в режим редак­ти­ро­ва­ния атри­бута, два­жды клик­нем по нему.

Затем уда­лим атри­бут и его зна­че­ние и нажмём «энтер», чтобы при­ме­нить изменения.

Поэкспериментируем с формой отправки вопроса в советы бюро

Бывает, кнопки и поля блокируются отдельно или в родительском <fieldset>

Атрибут disabled блокирует кнопки, инпуты, выпадайки и текстареи

Если атрибут disabled стоит у <fieldset>, то блокируются все вложенные элементы

Поэтому хорошие программисты дополнительно проверяют данные на сервере

Разблокируем отключённую форму. Кликнем по заблокированной кнопке правой кнопкой и выберем в контекстном меню «Инспектировать».

Откроется панель веб‑инспектора. Найдём в ней заблокированный элемент с атрибутом disabled.

Чтобы перейти в режим редактирования атрибута, дважды кликнем по нему.

Затем удалим атрибут и его значение и нажмём «энтер», чтобы применить изменения.

Скроем эле­мент. Для этого клик­нем по нему пра­вой кноп­кой и выбе­рем Hide Element.

Эле­мент исчез, но всё ещё зани­мает место на странице.

Чтобы пол­но­стью уда­лить эле­мент, клик­нем по нему пра­вой кноп­кой и выбе­рем Delete Element.

Эле­мент исчез со стра­ницы и из веб‑инспектора.

Чтобы отме­нить послед­нее дей­ствие и вер­нуть эле­мент, нужно нажать ⌘+Z или Ctrl+Z.

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

Оранжевые поля показывают внешние отступы элемента, маржины

Чтобы скрыть элемент, веб‑инспектор добавляет ему visibility: hidden

Элемент удалился только в браузере. Если обновить страницу, он вернётся

Удаление элемента веб‑инспектором похоже на действие display: none

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

Оранжевые поля показывают внешние отступы элемента, маржины

Чтобы скрыть элемент, веб‑инспектор добавляет ему visibility: hidden

Элемент удалился только в браузере. Если обновить страницу, он вернётся

Удаление элемента веб‑инспектором похоже на действие display: none

Скроем элемент. Для этого кликнем по нему правой кнопкой и выберем Hide Element.

Элемент исчез, но всё ещё занимает место на странице.

Чтобы полностью удалить элемент, кликнем по нему правой кнопкой и выберем Delete Element.

Элемент исчез со страницы и из веб‑инспектора.

Чтобы отменить последнее действие и вернуть элемент, нужно нажать ⌘+Z или Ctrl+Z.

user agent stylesheet — это стили элементов по умолчанию, зашитые в браузер

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

Как видите, браузер просто дописывает новые стили в атрибут style

Зачёркнутые правила либо отключены, либо переопределены где‑то ещё

В веб‑инспекторе Хрома цифровые значения также можно изменять прокруткой

Поме­няем стили заго­ловка. Справа пока­заны стили выбран­ного эле­мента. Чтобы доба­вить сти­лей, клик­нем в element.style.

Панель со сти­лями перей­дёт в режим редак­ти­ро­ва­ния. Допи­шем стили, ука­зав кегль, шрифт и отступы заголовка.

Чтобы отклю­чить свой­ство, клик­нем по чек­боксу возле него.

Чтобы поме­нять зна­че­ние «на глаз», клик­нем в него и пона­жи­маем кла­виши‑стрелки ↑↓. Рабо­тает как в Фото­шопе: с зажа­тым ⌘ уве­ли­чи­вает или умень­шает зна­че­ние на сотни, с Shift — на десятки, с Option — на одну десятую.

user agent stylesheet — это стили элементов по умолчанию, зашитые в браузер

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

Как видите, браузер просто дописывает новые стили в атрибут style

Зачёркнутые правила либо отключены, либо переопределены где‑то ещё

В веб‑инспекторе Хрома цифровые значения также можно изменять прокруткой

Поменяем стили заголовка. Справа показаны стили выбранного элемента. Чтобы добавить стилей, кликнем в element.style.

Панель со стилями перейдёт в режим редактирования. Допишем стили, указав кегль, шрифт и отступы заголовка.

Чтобы отключить свойство, кликнем по чекбоксу возле него.

Чтобы поменять значение «на глаз», кликнем в него и понажимаем клавиши‑стрелки ↑↓. Работает как в Фотошопе: с зажатым ⌘ увеличивает или уменьшает значение на сотни, с Shift — на десятки, с Option — на одну десятую.

Отладка мобильной версии. Чтобы посмот­реть, как стра­ница выгля­дит на раз­ных экра­нах и мобиль­ных устрой­ствах, исполь­зуют отлад­чики мобиль­ной версии.

В Хроме отлад­чик спря­тан за кноп­кой Toggle Device Toolbar в веб‑инспек­торе. В Сафари — это отдель­ный режим, Responsive Design Mode.

Отлад­чик мобиль­ной вер­сии в Сафари откры­ва­ется с помо­щью ⌘+Control+R. В Хроме — с помо­щью ⌘+Option+I и после­ду­ю­щего ⌘+Shift+M.

Что дальше

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

Отладка мобильной версии. Чтобы посмотреть, как страница выглядит на разных экранах и мобильных устройствах, используют отладчики мобильной версии.

В Хроме отладчик спрятан за кнопкой Toggle Device Toolbar в веб‑инспекторе. В Сафари — это отдельный режим, Responsive Design Mode.

Отладчик мобильной версии в Сафари открывается с помощью ⌘+Control+R. В Хроме — с помощью ⌘+Option+I и последующего ⌘+Shift+M.

Что дальше

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

1
Модули

1
Модули

Текстовые модули

Чтобы свер­стать тек­сто­вый модуль, нужно задать шрифт, настро­ить кегль, интер­ли­ньяж, начер­та­ние и вырав­ни­ва­ние. За шрифт отве­чает ЦСС‑свой­ство font-family, за кегль и интер­ли­ньяж — font-size и line-height. Раз­бе­рём их подробнее.

The only easy day
was yesterday

Текстовые модули

Чтобы сверстать текстовый модуль, нужно задать шрифт, настроить кегль, интерлиньяж, начертание и выравнивание. За шрифт отвечает ЦСС‑свойство font-family, за кегль и интерлиньяж — font-size и line-height. Разберём их подробнее.

The only easy day
was yesterday

Скрыто 5 разворотов
Скрыто 5 раз­во­ро­тов

В «рези­но­вой» вёрстке дизай­нер задаёт не только форму кон­тей­нера для тек­ста, но и пра­вила, по кото­рым она меня­ется в зави­си­мо­сти от раз­ме­ров окна и экрана.

Кегль экран­ного тек­ста обычно лежит в диа­па­зоне 12…16 пунк­тов, а интер­ли­ньяж — 1,2…1,4 от зна­че­ния кегля

Кегль и интерлиньяж

В ЦСС кегль зада­ётся свой­ством font-size, а интер­ли­ньяж — свой­ством line-height. Их зна­че­ния могут быть фик­си­ро­ван­ными — px, pt, in, cm, или отно­си­тель­ными — %, emrem:

body {
  font-size: 20px;
  /* Высота строки посчитается от кегля:
     20px * 1.25 = 25px */
  line-height: 1.25;
}

.sidenote {
  /* Кегль посчитается от кегля родителя:
     20px * 0.75 = 15px */
  font-size: .75em;
  /* Высота строки посчитается от кегля элемента:
     15px * 1.2 = 18px */
  line-height: 120%;
}

Обратите внимание: значения в рамочке в этой книге можно менять, попробуйте их подвигать

В «резиновой» вёрстке дизайнер задаёт не только форму контейнера для текста, но и правила, по которым она меняется в зависимости от размеров окна и экрана.

Кегль экранного текста обычно лежит в диапазоне 12…16 пунктов, а интерлиньяж — 1,2…1,4 от значения кегля

Кегль и интерлиньяж

В ЦСС кегль задаётся свойством font-size, а интерлиньяж — свойством line-height. Их значения могут быть фиксированными — px, pt, in, cm, или относительными — %, emrem:

body {
  font-size: 20px;
  /* Высота строки посчитается от кегля:
     20px * 1.25 = 25px */
  line-height: 1.25;
}

.sidenote {
  /* Кегль посчитается от кегля родителя:
     20px * 0.75 = 15px */
  font-size: .75em;
  /* Высота строки посчитается от кегля элемента:
     15px * 1.2 = 18px */
  line-height: 120%;
}

Обратите внимание: значения в рамочке в этой книге можно менять, попробуйте их подвигать

Скрыт 1 разворот
Скрыт 1 раз­во­рот

Лайфхак: em или rem?

И em, и rem — отно­си­тель­ные вели­чины. Раз­ница между ними в том, что em счи­та­ется отно­си­тельно кегля роди­тель­ского эле­мента, а rem — отно­си­тельно кор­не­вого. Сравните:

 20px
1.2em
20px×1.224px
0.625em 24px×0.62515px
0.8em
15px×0.812px
 20px
1.2rem
20px×1.224px
0.625rem
20px×0.62512.5px
0.8rem
20px×0.816px

Для неза­ви­си­мых ком­по­нен­тов лучше подой­дёт rem: не при­дётся бес­по­ко­иться, что роди­тель­ский эле­мент повли­яет на кегль в ком­по­ненте. Если вы, нао­бо­рот, хотите, чтобы вло­жен­ность вли­яла на кегль, берите em.

При исполь­зо­ва­нии rem кегль на кор­не­вом эле­менте (:root) лучше не зада­вать в пик­се­лях. Бра­у­зеры поз­во­ляют настро­ить базо­вый кегль тек­ста. Если задать кегль в пик­се­лях, эта настройка не сра­бо­тает, cла­бо­ви­дя­щим, воз­можно, при­дётся зумить страницу.

Вме­сто этого запом­ните, что кегль по умол­ча­нию во всех бра­у­зе­рах — 16 пик­се­лей, и зада­вайте базо­вый отно­си­тельно него. То есть, вме­сто font-size: 18px — font-size: 1.125em

Лайфхак: em или rem?

И em, и rem — относительные величины. Разница между ними в том, что em считается относительно кегля родительского элемента, а rem — относительно корневого. Сравните:

 20px
1.2em
20px×1.224px
0.625em 24px×0.62515px
0.8em
15px×0.812px
 20px
1.2rem
20px×1.224px
0.625rem
20px×0.62512.5px
0.8rem
20px×0.816px

Для независимых компонентов лучше подойдёт rem: не придётся беспокоиться, что родительский элемент повлияет на кегль в компоненте. Если вы, наоборот, хотите, чтобы вложенность влияла на кегль, берите em.

При использовании rem кегль на корневом элементе (:root) лучше не задавать в пикселях. Браузеры позволяют настроить базовый кегль текста. Если задать кегль в пикселях, эта настройка не сработает, cлабовидящим, возможно, придётся зумить страницу.

Вместо этого запомните, что кегль по умолчанию во всех браузерах — 16 пикселей, и задавайте базовый относительно него. То есть, вместо font-size: 18px — font-size: 1.125em

Скрыто 9 разворотов
Скрыто 9 раз­во­ро­тов

font-weight отве­чает за «жир­ность», вес начер­та­ния. Зада­ется в чис­лах от 100 до 900.

Кроме чис­ло­вых зна­че­ний под­дер­жи­ва­ются клю­че­вые слова: normal, bold, lighter и bolder.

normal — это обыч­ное начер­та­ние, сино­ним font-weight: 400

font‑weight: 400
font‑weight: normal

bold — жир­ное начер­та­ние, сино­ним font-weight: 700

font‑weight: 700
font‑weight: bold

Лучше исполь­зо­вать клю­че­вые слова, а не их чис­ло­вые зна­че­ния: их проще вос­при­ни­мать, не нужно запо­ми­нать маги­че­ские числа.

Жир­ность начер­та­ния отно­си­тельно роди­теля зада­ётся с помо­щью клю­че­вых слов lighter (полегче) и bolder (пожирнее):

font‑weight: lighter
font‑weight: bolder

lighterfont‑weightbolder
light100, lightregular
light200, lightregular
light300, lightregular
light400, regularbold
light500, regularbold
regular600, boldbold
regular700, boldbold
bold800, boldbold
bold900, boldbold

Как меняется начертание от lighter, bolder и font‑weight родителя

font-weight отвечает за «жирность», вес начертания. Задается в числах от 100 до 900.

Кроме числовых значений поддерживаются ключевые слова: normal, bold, lighter и bolder.

normal — это обычное начертание, синоним font-weight: 400

font‑weight: 400
font‑weight: normal

bold — жирное начертание, синоним font-weight: 700

font‑weight: 700
font‑weight: bold

Лучше использовать ключевые слова, а не их числовые значения: их проще воспринимать, не нужно запоминать магические числа.

Жирность начертания относительно родителя задаётся с помощью ключевых слов lighter (полегче) и bolder (пожирнее):

font‑weight: lighter
font‑weight: bolder

light
font‑weight100, light
bolderregular
light
font‑weight200, light
bolderregular
light
font‑weight300, light
bolderregular
light
font‑weight400, regular
bolderbold
light
font‑weight500, regular
bolderbold
regular
font‑weight600, bold
bolderbold
regular
font‑weight700, bold
bolderbold
bold
font‑weight800, bold
bolderbold
bold
font‑weight900, bold
bolderbold

Как меняется начертание от lighter, bolder и font‑weight родителя

Бюро­санс
Бюросайн

Бюросанс поддерживает тонкое, нормальное и жирное начертания. Бюросайн — вариативный шрифт, поддерживающий все начертания, включая промежуточные

Чтобы исполь­зо­вать какое‑то начер­та­ние, шрифт дол­жен его под­дер­жи­вать. В про­тив­ном слу­чае бра­у­зер под­бе­рёт бли­жай­шее под­хо­дя­щее начер­та­ние из тех, что доступны ему в шрифте.

Отдель­ная исто­рия — вари­а­тив­ные шрифты, в кото­рых есть любые начер­та­ния. Они рабо­тают по прин­ципу интер­по­ля­ции: с помо­щью мате­ма­тики вычис­ляют неиз­вест­ные про­ме­жу­точ­ные начер­та­ния, исполь­зуя извест­ные крайние.

Как и в обыч­ных шриф­тах для зада­ния «жир­но­сти» в вари­а­тив­ных шриф­тах нужно исполь­зо­вать font‑weight:
font-weight: 400

Бюросанс
Бюросайн

Чтобы использовать какое‑то начертание, шрифт должен его поддерживать. В противном случае браузер подберёт ближайшее подходящее начертание из тех, что доступны ему в шрифте.

Отдельная история — вариативные шрифты, в которых есть любые начертания. Они работают по принципу интерполяции: с помощью математики вычисляют неизвестные промежуточные начертания, используя известные крайние.

Как и в обычных шрифтах для задания «жирности» в вариативных шрифтах нужно использовать font‑weight:
font-weight: 400

Бюросанс поддерживает тонкое, нормальное и жирное начертания. Бюросайн — вариативный шрифт, поддерживающий все начертания, включая промежуточные

Скрыт 1 разворот
Скрыт 1 раз­во­рот

Упражнение: кегль, шрифты, выключка и регистр

Изме­ните ЦСС так, чтобы пер­вая тек­сто­вая стра­ница повто­рила вторую.


  
font-family: Bureauserif, serif;
font-family: Roboto Condensed, sans-serif;
font-size: 1.125em;
font-size: 3em;
font-style: italic;
font-variant: all-small-caps;
font-weight: bold;
line-height: 1.25;
line-height: .9;
margin-top: 2em;
margin: 0;
margin: 0;
text-align: right;
text-indent: 0;
text-indent: 1em;
text-transform: uppercase;
.exerciseFontBasics h1 {
}
.exerciseFontBasics p {
}
.exerciseFontBasics h1 + p {
}
.exerciseFontBasics .smallcapitals {
}

Вёрстка

Скоро
скидки

Текст — базовый элемент вёрстки.

Текст — несжимаемая жидкость, принимающая форму сосуда. Верстальщик определяет форму, пропорции и объём контейнера, впускает в него воздух, разделяет на сообщающиеся сосуды. Один и тот же текст заполняет стакан или расползается лужей по плоскости страницы.

Иногда дизайнер влияет на объём текста, задавая редакторам ограничения длины подзаголовков, цитат, въездов и других особых элементов. Но чаще текст — это данность, а верстальщик работает с его формой.

Дизайн

Скоро
скидки

Текст — базовый элемент вёрстки.

Текст — несжимаемая жидкость, принимающая форму сосуда. Верстальщик определяет форму, пропорции и объём контейнера, впускает в него воздух, разделяет на сообщающиеся сосуды. Один и тот же текст заполняет стакан или расползается лужей по плоскости страницы.

Иногда дизайнер влияет на объём текста, задавая редакторам ограничения длины подзаголовков, цитат, въездов и других особых элементов. Но чаще текст — это данность, а верстальщик работает с его формой.

Вёрстка

Скоро
скидки

Текст — базовый элемент вёрстки.

Текст — несжимаемая жидкость, принимающая форму сосуда. Верстальщик определяет форму, пропорции и объём контейнера, впускает в него воздух, разделяет на сообщающиеся сосуды. Один и тот же текст заполняет стакан или расползается лужей по плоскости страницы.

Иногда дизайнер влияет на объём текста, задавая редакторам ограничения длины подзаголовков, цитат, въездов и других особых элементов. Но чаще текст — это данность, а верстальщик работает с его формой.

Дизайн

Скоро
скидки

Текст — базовый элемент вёрстки.

Текст — несжимаемая жидкость, принимающая форму сосуда. Верстальщик определяет форму, пропорции и объём контейнера, впускает в него воздух, разделяет на сообщающиеся сосуды. Один и тот же текст заполняет стакан или расползается лужей по плоскости страницы.

Иногда дизайнер влияет на объём текста, задавая редакторам ограничения длины подзаголовков, цитат, въездов и других особых элементов. Но чаще текст — это данность, а верстальщик работает с его формой.

Упражнение: кегль, шрифты, выключка и регистр

Измените ЦСС так, чтобы первая текстовая страница повторила вторую.


  
font-family: Bureauserif, serif;
font-family: Roboto Condensed, sans-serif;
font-size: 1.125em;
font-size: 3em;
font-style: italic;
font-variant: all-small-caps;
font-weight: bold;
line-height: 1.25;
line-height: .9;
margin-top: 2em;
margin: 0;
margin: 0;
text-align: right;
text-indent: 0;
text-indent: 1em;
text-transform: uppercase;
.exerciseFontBasics h1 {
}
.exerciseFontBasics p {
}
.exerciseFontBasics h1 + p {
}
.exerciseFontBasics .smallcapitals {
}
Скрыто 2 разворота
Скрыто 2 раз­во­рота

Подчёркивание, зачёркивание и надчёркивание

Допол­ни­тельно офор­мить текст под­чёр­ки­ва­нием, зачёр­ки­ва­нием или над­чёр­ки­ва­нием можно с помо­щью text-decoration или border-bottom. Кроме того, в Хроме можно задать вид, стиль и цвет исполь­зу­е­мой линии:

/* Убираем подчёркивание у ссылок в шапке */
header a {
  text-decoration: none;
}

/* Подчёркиваем важные моменты (em от emphasis) в статье.
   Старые версии браузеров покажут чёрное подчёркивание */
em {
  text-decoration: underline;
  
  /* Новые браузеры покажут жёлтое подчёркивание
     толщиной в 5 пикселей */
  text-decoration-line: underline;
  text-decoration-color: yellow;
  text-decoration-thickness: 5px;
}

/* Зачёркиваем удалённые кусочки (del от deleted) статьи */
del {
  text-decoration: line-through;
}

Обра­тите вни­ма­ние на при­мер с text-decoration: underline. Бра­у­зеры и ЦСС посто­янно раз­ви­ва­ются: появ­ля­ются новые свой­ства, услож­ня­ются ста­рые. Новые вер­сии бра­у­зе­ров под­дер­жи­вают рас­ши­рен­ный син­так­сис text-decoration с ука­за­нием тол­щины, цвета и стиля линий, а ста­рые бра­у­зеры — нет. Поэтому чтобы под­чёр­ки­ва­ние рабо­тало во всех бра­у­зе­рах, мы сна­чала ука­зы­ваем ста­рый син­так­сис, как несго­ра­е­мый вари­ант, а ниже — новый: если бра­у­зер не пой­мёт новый син­так­сис, он исполь­зует преды­ду­щий вариант.

In CSS type size of the screen text usually lies in the range of 12 to 16 points and line spacing is 120–140 % of the type height size.

Иногда подчёркивание ссылок задают с помощью border или box‑shadow. Чтобы убрать такое подчёркивание, используют border: none или box‑shadow: none

Подчёркивание, зачёркивание и надчёркивание

Дополнительно оформить текст подчёркиванием, зачёркиванием или надчёркиванием можно с помощью text-decoration или border-bottom. Кроме того, в Хроме можно задать вид, стиль и цвет используемой линии:

/* Убираем подчёркивание у ссылок в шапке */
header a {
  text-decoration: none;
}

/* Подчёркиваем важные моменты (em от emphasis) в статье.
   Старые версии браузеров покажут чёрное подчёркивание */
em {
  text-decoration: underline;
  
  /* Новые браузеры покажут жёлтое подчёркивание
     толщиной в 5 пикселей */
  text-decoration-line: underline;
  text-decoration-color: yellow;
  text-decoration-thickness: 5px;
}

/* Зачёркиваем удалённые кусочки (del от deleted) статьи */
del {
  text-decoration: line-through;
}

Обратите внимание на пример с text-decoration: underline. Браузеры и ЦСС постоянно развиваются: появляются новые свойства, усложняются старые. Новые версии браузеров поддерживают расширенный синтаксис text-decoration с указанием толщины, цвета и стиля линий, а старые браузеры — нет. Поэтому чтобы подчёркивание работало во всех браузерах, мы сначала указываем старый синтаксис, как несгораемый вариант, а ниже — новый: если браузер не поймёт новый синтаксис, он использует предыдущий вариант.

In CSS type size of the screen text usually lies in the range of 12 to 16 points and line spacing is 120–140 % of the type height size.

Иногда подчёркивание ссылок задают с помощью border или box‑shadow. Чтобы убрать такое подчёркивание, используют border: none или box‑shadow: none

Скрыто 2 разворота
Скрыто 2 раз­во­рота

Ино­гда текст нужно допол­ни­тельно укра­сить: накло­нить, повер­нуть или рас­кра­сить. Для при­мера сти­ли­зуем заго­ловки. Нач­нём с разметки:

<h2>216 лекций, 97 часов</h2>
<p>…</p>

Настроим шрифт и начертание:

h2 {
  font-family: Roboto Condensed, sans-serif;
  font-weight: bold; /* Жирное начертание */
  text-transform: uppercase; /* Буквы приводим к заглавным */
  letter-spacing: -.025em; /* Уменьшаем межбуквенное расстояние */
}

Доба­вим тень, обводку и поме­няем цвет текста:

h2 {
  font-family: Roboto Condensed, sans-serif;
  font-weight: bold;
  text-transform: uppercase;
  text-shadow: 5px 5px black; /* Добавляем чёрную тень, смещённую на 5 пк вправо-вниз */

  /* Добавляем двухпиксельную чёрную обводку буквам.
     
    Префикс -webkit- значит, что свойство пока не вошло
    в стандарты и работает в Хроме, Сафари, Эдже и Опере */
  -webkit-text-stroke: 2px black;
  color: white;
}

Иска­зим заголовки:

h2 {
  font-family: Roboto Condensed, sans-serif;
  font-weight: bold;
  text-transform: uppercase;
  text-shadow: 5px 5px black;
  -webkit-text-stroke: 2px black;
  color: white;
  transform: skew(0, -8deg);
}

Убе­рём тень, доба­вим под­за­го­ловку градиент:

h2 {
  font-family: Roboto Condensed, sans-serif;
  font-weight: bold;
  text-transform: uppercase;
  -webkit-text-stroke: 2px black;
  color: white;
  transform: skew(0, -8deg);
  /* linear-gradient — функция, генерирующая линейный градиент
    с заданным направлением, цветами и ключевыми точками */
  background-image: linear-gradient(160deg, #0093E9 0%, #80D0C7 100%);
}

Обре­жем гра­ди­ент по тексту:

h2 {
  font-family: Roboto Condensed, sans-serif;
  font-weight: bold;
  text-transform: uppercase;
  -webkit-text-stroke: 2px black;
  color: white;
  transform: skew(0, -8deg);
  background-image: linear-gradient(160deg, #0093E9 0%, #80D0C7 100%);
  -webkit-background-clip: text; /* Обрезаем фон по тексту */
  color: transparent; /* И меняем цвет текста на прозрачный */
}

45 лек­ций, 9 часов

45 лекций, 9 часов

Иногда текст нужно дополнительно украсить: наклонить, повернуть или раскрасить. Для примера стилизуем заголовки. Начнём с разметки:

<h2>216 лекций, 97 часов</h2>
<p>…</p>

Настроим шрифт и начертание:

h2 {
  font-family: Roboto Condensed, sans-serif;
  font-weight: bold; /* Жирное начертание */
  text-transform: uppercase; /* Буквы приводим к заглавным */
  letter-spacing: -.025em; /* Уменьшаем межбуквенное расстояние */
}

Добавим тень, обводку и поменяем цвет текста:

h2 {
  font-family: Roboto Condensed, sans-serif;
  font-weight: bold;
  text-transform: uppercase;
  text-shadow: 5px 5px black; /* Добавляем чёрную тень, смещённую на 5 пк вправо-вниз */

  /* Добавляем двухпиксельную чёрную обводку буквам.
     
    Префикс -webkit- значит, что свойство пока не вошло
    в стандарты и работает в Хроме, Сафари, Эдже и Опере */
  -webkit-text-stroke: 2px black;
  color: white;
}

Исказим заголовки:

h2 {
  font-family: Roboto Condensed, sans-serif;
  font-weight: bold;
  text-transform: uppercase;
  text-shadow: 5px 5px black;
  -webkit-text-stroke: 2px black;
  color: white;
  transform: skew(0, -8deg);
}

Уберём тень, добавим подзаголовку градиент:

h2 {
  font-family: Roboto Condensed, sans-serif;
  font-weight: bold;
  text-transform: uppercase;
  -webkit-text-stroke: 2px black;
  color: white;
  transform: skew(0, -8deg);
  /* linear-gradient — функция, генерирующая линейный градиент
    с заданным направлением, цветами и ключевыми точками */
  background-image: linear-gradient(160deg, #0093E9 0%, #80D0C7 100%);
}

Обрежем градиент по тексту:

h2 {
  font-family: Roboto Condensed, sans-serif;
  font-weight: bold;
  text-transform: uppercase;
  -webkit-text-stroke: 2px black;
  color: white;
  transform: skew(0, -8deg);
  background-image: linear-gradient(160deg, #0093E9 0%, #80D0C7 100%);
  -webkit-background-clip: text; /* Обрезаем фон по тексту */
  color: transparent; /* И меняем цвет текста на прозрачный */
}

Скрыто 5 разворотов
Скрыто 5 раз­во­ро­тов

Иллюстрации

Иллю­стра­ции вер­стают тегом img, где атри­бут src — это путь до файла‑картинки.

Можно под­клю­чить кар­тинку с дру­гого сайта:

<span><img src="https://upload.wikimedia.org/wikipedia/commons/David_-_Napoleon_crossing_the_Alps_-_Malmaison1.jpg"></span>

А можно сослаться на файл, лежа­щий рядом с вашей ХТМЛ‑стран­цей, напри­мер, в сосед­ней папке images. В этом слу­чае не пишут пол­ный адрес сайта, только путь до кар­тинки отно­си­тельно ХТМЛ‑файла:

<span><img src="img/napoleon.jpg"></span>

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

<span><img src="/img/1812/napoleon.jpg"></span>

По умолчанию ширина картинки на странице будет равна ширине файла картинки. Файлы в большом разрешении сломают вёрстку, поэтому лучше сразу сделать картинку «резиновой», задав ей display: block; и width в процентах от родителя.

Иллюстрации

Иллюстрации верстают тегом img, где атрибут src — это путь до файла‑картинки.

Можно подключить картинку с другого сайта:

<span><img src="https://upload.wikimedia.org/wikipedia/commons/David_-_Napoleon_crossing_the_Alps_-_Malmaison1.jpg"></span>

А можно сослаться на файл, лежащий рядом с вашей ХТМЛ‑странцей, например, в соседней папке images. В этом случае не пишут полный адрес сайта, только путь до картинки относительно ХТМЛ‑файла:

<span><img src="img/napoleon.jpg"></span>

Если добавить в начало пути слэш, можно указать путь до картинки от корневой папки сайта. Но это работает только когда сайт размещён на сервере. О размещении на сервере мы поговорим дальше в книге.

<span><img src="/img/1812/napoleon.jpg"></span>

По умолчанию ширина картинки на странице будет равна ширине файла картинки. Файлы в большом разрешении сломают вёрстку, поэтому лучше сразу сделать картинку «резиновой», задав ей display: block; и width в процентах от родителя.

Скрыт 1 разворот
Скрыт 1 раз­во­рот

Атрибут alt

У тега img есть атри­бут alt — это аль­тер­на­тив­ный текст, кото­рый опи­сы­вает, что изоб­ра­жено на картинке.

Альт нужен на слу­чай, когда кар­тинка по ссылке недо­ступна, а ещё для помощи людям с про­бле­мами зре­ния, кото­рые исполь­зуют про­граммы для чте­ния с экрана.

<img 
  src="https://cats.com/persian/9001.jpg" 
  alt="Рыжая персидская кошка точит когти об когтеточку">

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

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

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

Атрибут alt

У тега img есть атрибут alt — это альтернативный текст, который описывает, что изображено на картинке.

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

<img 
  src="https://cats.com/persian/9001.jpg" 
  alt="Рыжая персидская кошка точит когти об когтеточку">

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

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

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

Скрыто: «Таблицы» и «Формы»
Скрыто: «Таб­лицы» и «Формы»

Элементы ввода, или инпуты

В ХТМЛ‑фор­мах эле­менты ввода дают чело­веку вве­сти или уточ­нить дан­ные: поля, чек­боксы, радиокнопки, выпа­да­ю­щие списки и дру­гие эле­менты. Раз­ра­бот­чики назы­вают эле­менты ввода инпу­тами, потому что почти все­гда это тег input.

Инпуты отли­ча­ются типами — атри­бу­том type. Тип вли­яет на внеш­ний вид инпута и фор­ма­ти­ро­ва­ние вво­ди­мых данных.

Инпут с type="password" скроет вво­ди­мый текст, type="number" не даст вве­сти буквы, а type="date" пока­жет фор­мат ввода даты, а в неко­то­рых бра­у­зе­рах доба­вит кнопку вызова кален­да­рика. Фай­ло­вый инпут под­дер­жи­вает пере­тя­ги­ва­ние файла на себя, а инпут цвета откры­вает палитру выбора цвета.

Особ­ня­ком среди инпу­тов стоят чек­боксы, радиокнопки и выпа­да­ю­щие списки. Их вёрстка отли­ча­ется от вёрстки осталь­ных инпу­тов, поэтому далее мы раз­бе­рём их отдельно.

В некоторых браузерах стандартные стили инпутов выглядят странно и аляповато. Позже мы поговорим о том, что с этим можно сделать и нужно ли это делать

<input type="text">

type="text"

type="number"

type="password"

type="date"

type="datetime‑local"

type="time"

type="file"

type="color"

type="range"

Элементы ввода, или инпуты

В ХТМЛ‑формах элементы ввода дают человеку ввести или уточнить данные: поля, чекбоксы, радиокнопки, выпадающие списки и другие элементы. Разработчики называют элементы ввода инпутами, потому что почти всегда это тег input.

Инпуты отличаются типами — атрибутом type. Тип влияет на внешний вид инпута и форматирование вводимых данных.

Инпут с type="password" скроет вводимый текст, type="number" не даст ввести буквы, а type="date" покажет формат ввода даты, а в некоторых браузерах добавит кнопку вызова календарика. Файловый инпут поддерживает перетягивание файла на себя, а инпут цвета открывает палитру выбора цвета.

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

В некоторых браузерах стандартные стили инпутов выглядят странно и аляповато. Позже мы поговорим о том, что с этим можно сделать и нужно ли это делать

<input type="text">

type="text"

type="number"

type="password"

type="date"

type="datetime‑local"

type="time"

type="file"

type="color"

type="range"

Скрыто: «Псевдоклассы» и «Псевдоэлементы :after и :before»
Скрыто: «Псев­до­классы» и «Псев­до­эле­менты :after и :before»

Тест по разделу «Модули»

Для чего мы советуем перечислять несколько шрифтов в font-family?

Про запас — на компьютере пользователя может не быть указанного первым шрифта и браузер будет по очереди пробовать следующие
Для разнообразия — браузер применит случайный шрифт для каждого пользователя
Чтобы разработчики знали, какой следующий шрифт поставить, когда наскучит текущий
Это тонкая браузерная оптимизация, выходящая за рамки данной книги

Если на компьютере не установлен шрифт, если он не загрузился или в нём нет нужной буквы, браузер попробует следующий шрифт из списка

Как работают ключевые слова serif или sans-serif в font-family?

Если браузер не сможет использовать указанные до ключевых слов шрифты, то использует системный шрифт соответствующего типа: с засечками или без
Это модификаторы шрифта: если указан serif, браузер включит только строчные; если указан sans-serif, выключит их
Это заклинание для сглаживания шрифтов в Гугль Хроме до десятой версии
Если их не указать, браузер будет работать в режиме совместимости со старыми версиями Интернет Эксплорера и Нетскейп Навигатора

Ключевое слово в конце списка описывает тип шрифта: serif — с засечками, sans‑serif — без засечек. Если браузер доберётся до него, то возьмёт системный шрифт соответствующего семейства

По какому признаку шрифты в этой книге называют веб‑безопасными?

Шрифты, установленные в большинстве операционных систем
Шрифты без уязвимостей и вирусов
Рекомендованные дизайнерами варианты шрифтовых пар, которые хорошо сочетаются
Шрифты, которые хорошо распознают люди с проблемами зрения

Веб‑безопасными называют шрифты, входящие в стандартный набор операционной системы

Выберите верные утверждения о назначении ЦСС‑свойств.

font-size — кегль
font-size — ширина текстовой колонки
line-height — высота символов
line-height — интерлиньяж
font-weight — кегль
font-weight — максимально допустимый размер файла шрифта
font-weight — «жирность» шрифта
font-style — подчёркивание, зачёркивание, надчёркивание
font-style — начертание шрифта, курсив и наклон
text-decoration — особенности шрифта, лигатуры и сглаживание
text-decoration — подчёркивание, зачёркивание, надчёркивание

font‑size и line‑height управляют кеглем и интерлиньяжем, font‑style управляет начертанием, font‑weight задаёт «жирность» шрифта, а text‑decoration добавляет подчёркивание, зачёркивание или надчёркивание

Какому элементу мы советуем задавать основной шрифт страницы и почему?

Всем элементам страницы для надёжности, принцип «ковровая бомбардировка»
Только текстовым элементам, чтобы не стилизовать лишнего, принцип наследования в ЦСС
Тегу body, чтобы стили не пришлось повторять для всего подряд, принцип наследования в ЦСС
Обёрткам article и main, чтобы стили наследовались для всех статей и текстов, принцип «семантическое ядро»

Наследование стилей позволяет писать меньше кода, избегать повторов стилей, последовательно стилизовать страницу от общего к частному

Чем управляет свойство font-variant?

Капителью
Кеглем
Лигатурами
Интерлиньяжем

Свойство font‑variant включает лигатуры и капитель

Для чего мы рекомендуем использовать атрибут alt?

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

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

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

Тест по разделу «Модули»

Для чего мы советуем перечислять несколько шрифтов в font-family?

Про запас — на компьютере пользователя может не быть указанного первым шрифта и браузер будет по очереди пробовать следующие
Для разнообразия — браузер применит случайный шрифт для каждого пользователя
Чтобы разработчики знали, какой следующий шрифт поставить, когда наскучит текущий
Это тонкая браузерная оптимизация, выходящая за рамки данной книги

Если на компьютере не установлен шрифт, если он не загрузился или в нём нет нужной буквы, браузер попробует следующий шрифт из списка

Как работают ключевые слова serif или sans-serif в font-family?

Если браузер не сможет использовать указанные до ключевых слов шрифты, то использует системный шрифт соответствующего типа: с засечками или без
Это модификаторы шрифта: если указан serif, браузер включит только строчные; если указан sans-serif, выключит их
Это заклинание для сглаживания шрифтов в Гугль Хроме до десятой версии
Если их не указать, браузер будет работать в режиме совместимости со старыми версиями Интернет Эксплорера и Нетскейп Навигатора

Ключевое слово в конце списка описывает тип шрифта: serif — с засечками, sans‑serif — без засечек. Если браузер доберётся до него, то возьмёт системный шрифт соответствующего семейства

По какому признаку шрифты в этой книге называют веб‑безопасными?

Шрифты, установленные в большинстве операционных систем
Шрифты без уязвимостей и вирусов
Рекомендованные дизайнерами варианты шрифтовых пар, которые хорошо сочетаются
Шрифты, которые хорошо распознают люди с проблемами зрения

Веб‑безопасными называют шрифты, входящие в стандартный набор операционной системы

Выберите верные утверждения о назначении ЦСС‑свойств.

font-size — кегль
font-size — ширина текстовой колонки
line-height — высота символов
line-height — интерлиньяж
font-weight — кегль
font-weight — максимально допустимый размер файла шрифта
font-weight — «жирность» шрифта
font-style — подчёркивание, зачёркивание, надчёркивание
font-style — начертание шрифта, курсив и наклон
text-decoration — особенности шрифта, лигатуры и сглаживание
text-decoration — подчёркивание, зачёркивание, надчёркивание

font‑size и line‑height управляют кеглем и интерлиньяжем, font‑style управляет начертанием, font‑weight задаёт «жирность» шрифта, а text‑decoration добавляет подчёркивание, зачёркивание или надчёркивание

Какому элементу мы советуем задавать основной шрифт страницы и почему?

Всем элементам страницы для надёжности, принцип «ковровая бомбардировка»
Только текстовым элементам, чтобы не стилизовать лишнего, принцип наследования в ЦСС
Тегу body, чтобы стили не пришлось повторять для всего подряд, принцип наследования в ЦСС
Обёрткам article и main, чтобы стили наследовались для всех статей и текстов, принцип «семантическое ядро»

Наследование стилей позволяет писать меньше кода, избегать повторов стилей, последовательно стилизовать страницу от общего к частному

Чем управляет свойство font-variant?

Капителью
Кеглем
Лигатурами
Интерлиньяжем

Свойство font‑variant включает лигатуры и капитель

Для чего мы рекомендуем использовать атрибут alt?

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

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

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

2
Расстановка

2
Расстановка

Позициони­ро­вание

Есть несколько спо­со­бов раз­ло­жить эле­менты по стра­нице: пози­ци­о­ни­ро­ва­ние, фло­аты, таб­лицы, флек­с­боксы и гриды. Мы посте­пенно раз­бе­рём их все, а нач­нём с самого про­стого — пози­ци­о­ни­ро­ва­ния свой­ством position.

По умол­ча­нию блоки выстра­и­ва­ются друг под дру­гом. С помо­щью position можно изме­нить это пове­де­ние и раз­ме­стить эле­мент в любом месте стра­ницы, задав ему коор­ди­наты свой­ствами top, right, left и bottom. Есть пять зна­че­ний свойства:

Static

Это зна­че­ние по умол­ча­нию, отсут­ствие какого‑либо пози­ци­о­ни­ро­ва­ния. Эле­менты про­сто выстра­и­ва­ются друг под другом.

Relative

Эле­мент с отно­си­тель­ным пози­ци­о­ни­ро­ва­нием сдви­га­ется со сво­его места, не влияя на поло­же­ние сосед­них элементов.

position: relative;
left: 50px;
top: 80px;

Absolute

Эле­мент с абсо­лют­ным пози­ци­о­ни­ро­ва­нием рас­по­ла­га­ется по задан­ным коор­ди­на­там, а из того места, где он был, удаляется.

position: absolute;
left: 50px;
top: 80px;

По умол­ча­нию эти коор­ди­наты отсчи­ты­ва­ются от окна. Но если у эле­мента есть роди­тель с position: relative или absolute, то коор­ди­наты будут отсчи­ты­ваться уже от него.

Fixed и sticky

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

position: sticky;
top: 18px;

Чаще всего исполь­зу­ется для «зали­па­ю­щих» эле­мен­тов. Напри­мер, с помо­щью position: sticky зали­пают иконки закладки и поиска в нашей книге. Ана­ло­гично рабо­тает и этот раз­во­рот: стра­ница с при­ме­ром зали­пает с position: sticky, а дру­гая прокручивается.

Позициони­ро­вание

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

По умолчанию блоки выстраиваются друг под другом. С помощью position можно изменить это поведение и разместить элемент в любом месте страницы, задав ему координаты свойствами top, right, left и bottom. Есть пять значений свойства:

Static

Это значение по умолчанию, отсутствие какого‑либо позиционирования. Элементы просто выстраиваются друг под другом.

Relative

Элемент с относительным позиционированием сдвигается со своего места, не влияя на положение соседних элементов.

position: relative;
left: 50px;
top: 80px;

Absolute

Элемент с абсолютным позиционированием располагается по заданным координатам, а из того места, где он был, удаляется.

position: absolute;
left: 50px;
top: 80px;

По умолчанию эти координаты отсчитываются от окна. Но если у элемента есть родитель с position: relative или absolute, то координаты будут отсчитываться уже от него.

Fixed и sticky

Элемент с фиксированным позиционированием ведёт себя так же, как с абсолютным, но при этом не прокручивается вместе со страницей, зависая над ней. Закреплённое позиционирование — гибрид между обычным и фиксированным: элемент остаётся на месте, а когда область просмотра достигнет заданных координат — залипает.

position: sticky;
top: 18px;

Чаще всего используется для «залипающих» элементов. Например, с помощью position: sticky залипают иконки закладки и поиска в нашей книге. Аналогично работает и этот разворот: страница с примером залипает с position: sticky, а другая прокручивается.

position: relative

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

.dots { position: relative }
.dot { position: absolute } 

.top.left { top: 7px; left: 7px }
.top.right { top: 7px; right: 7px }
.bottom.left { bottom: 7px; left: 7px }
.bottom.right { bottom: 7px; right: 7px }

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

.dots { position: relative }

.dot {
  position: absolute;
  top: 0;
  right: 0;
}

position: relative

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

.dots { position: relative }
.dot { position: absolute } 

.top.left { top: 7px; left: 7px }
.top.right { top: 7px; right: 7px }
.bottom.left { bottom: 7px; left: 7px }
.bottom.right { bottom: 7px; right: 7px }

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

.dots { position: relative }

.dot {
  position: absolute;
  top: 0;
  right: 0;
}
Скрыто 11 разворотов
Скрыто 11 раз­во­ро­тов

Упражнение: применение флексбокса

Пере­та­щите ЦСС‑свой­ства в селек­торы, чтобы пункты меню встали в ряд, а послед­ний пункт меню при­жался к пра­вому краю.


  
display: flex;
margin-left: auto;
nav {
}
nav li:last-child {
}

Вёрстка

Дизайн

Вёрстка

Дизайн

Упражнение: применение флексбокса

Перетащите ЦСС‑свойства в селекторы, чтобы пункты меню встали в ряд, а последний пункт меню прижался к правому краю.


  
display: flex;
margin-left: auto;
nav {
}
nav li:last-child {
}
Скрыт 1 разворот
Скрыт 1 раз­во­рот
Логотип
Новости
Проекты
О нас

Используя таблицу интегралов элементарных функций, получим: турбулентность волнообразна. Волна доступна. Теорема традиционно искажает неопровержимый вектор.

Логотип
Новости
Проекты
О нас

Используя таблицу интегралов элементарных функций, получим: турбулентность волнообразна. Волна доступна. Теорема традиционно искажает неопровержимый вектор.

Логотип
Новости
Проекты
О нас

Используя таблицу интегралов элементарных функций, получим: турбулентность волнообразна. Волна доступна. Теорема традиционно искажает неопровержимый вектор.

Логотип
Новости
Проекты
О нас

Используя таблицу интегралов элементарных функций, получим: турбулентность волнообразна. Волна доступна. Теорема традиционно искажает неопровержимый вектор.

Логотип
Новости
Проекты
О нас

Используя таблицу интегралов элементарных функций, получим: турбулентность волнообразна. Волна доступна. Теорема традиционно искажает неопровержимый вектор.

Логотип
Новости
Проекты
О нас

Используя таблицу интегралов элементарных функций, получим: турбулентность волнообразна. Волна доступна. Теорема традиционно искажает неопровержимый вектор.

Логотип
Новости
Проекты
О нас

Используя таблицу интегралов элементарных функций, получим: турбулентность волнообразна. Волна доступна. Теорема традиционно искажает неопровержимый вектор.

Любую слож­ную модуль­ную вёрстку можно раз­бить на вло­жен­ные друг в друга флекс‑кон­тей­неры с соб­ствен­ным рит­мом эле­мен­тов. Ска­жем, клас­си­че­ская трёх­ко­лон­ная вёрстка, состо­я­щая из шапки, ста­тьи и двух сайдба­ров, рас­кла­ды­ва­ется в 4 флекс‑контейнера.

Нач­нём с раз­метки трех­ко­ло­ноч­ной страницы:

<header>
  <div>Логотип</div>
  …
</header>

<main>
  <article>
    <p>…</p>
  </article>
  
  <nav>
    <li>Навигация</li>
    …
  </nav>
  
  <aside>
    <div>Реклама</div>
    …
  </aside>
</main>

Пре­вра­тим шапку, содер­жи­мое и сайдбары во флекс‑кон­тей­неры и рас­кра­сим флекс‑эле­менты для наглядности:

header,
main,
aside,
nav {
  display: flex;
}

header > *,
article > *,
aside > *,
nav > * {
  min-height: 36px;
  padding: 9px;
  margin: 9px;
  background: #e5f5ff;
}

Обра­тите вни­ма­ние: по умол­ча­нию флекс‑эле­менты раз­ло­жи­лись в строку, flex-direction: row

Дадим стра­нице всю доступ­ную высоту, раз­ло­жим по вер­ти­кали и рас­тя­нем её содержимое:

body {
  min-height: 100%;
  display: flex;
  flex-direction: column;
}

main {
  flex-grow: 1; /* Это заклинание заставляет <main> занять всё свободное пространство. Мы рассмотрим его чуть позже */
}

В левом сайдбаре раз­ло­жим эле­менты сверху вниз:

nav {
  flex-direction: column;
  justify-content: flex-start;
}

В пра­вом сайдбаре рав­но­мерно рас­пре­де­лим элементы:

aside {
  flex-direction: column;
  justify-content: space-between;
}

И поме­няем поря­док эле­мен­тов, чтобы колонка с нави­га­цией была слева:

nav {
  flex-direction: column;
  justify-content: flex-start;
  order: -1; /* И это свойство мы рассмотрим чуть позже */
}

По умол­ча­нию флекс‑эле­менты зани­мают столько места, сколько нужно их содер­жи­мому. Поэтому колонки с нави­га­цией и рекла­мой сжались.

Чтобы ширина коло­нок с нави­га­цией и рекла­мой не зави­села тек­ста, под­чи­ним вёрстку пяти­ко­ло­ноч­ной сетке. Зада­дим про­пор­ции, по кото­рым колонки и ста­тья делят сво­бод­ное место в 1:3:1:

nav {
  flex-direction: column;
  justify-content: flex-start;
  order: -1;
  flex-grow: 1;
  flex-basis: 0;
}

aside {
  flex-direction: column;
  justify-content: space-between;
  flex-grow: 1;
  flex-basis: 0;
}

article {
  flex-grow: 3;
  flex-basis: 0;
}
Логотип
Новости
Проекты
О нас

Используя таблицу интегралов элементарных функций, получим: турбулентность волнообразна. Волна доступна. Теорема традиционно искажает неопровержимый вектор.

Логотип
Новости
Проекты
О нас

Используя таблицу интегралов элементарных функций, получим: турбулентность волнообразна. Волна доступна. Теорема традиционно искажает неопровержимый вектор.

Логотип
Новости
Проекты
О нас

Используя таблицу интегралов элементарных функций, получим: турбулентность волнообразна. Волна доступна. Теорема традиционно искажает неопровержимый вектор.

Логотип
Новости
Проекты
О нас

Используя таблицу интегралов элементарных функций, получим: турбулентность волнообразна. Волна доступна. Теорема традиционно искажает неопровержимый вектор.

Логотип
Новости
Проекты
О нас

Используя таблицу интегралов элементарных функций, получим: турбулентность волнообразна. Волна доступна. Теорема традиционно искажает неопровержимый вектор.

Логотип
Новости
Проекты
О нас

Используя таблицу интегралов элементарных функций, получим: турбулентность волнообразна. Волна доступна. Теорема традиционно искажает неопровержимый вектор.

Логотип
Новости
Проекты
О нас

Используя таблицу интегралов элементарных функций, получим: турбулентность волнообразна. Волна доступна. Теорема традиционно искажает неопровержимый вектор.

Любую сложную модульную вёрстку можно разбить на вложенные друг в друга флекс‑контейнеры с собственным ритмом элементов. Скажем, классическая трёхколонная вёрстка, состоящая из шапки, статьи и двух сайдбаров, раскладывается в 4 флекс‑контейнера.

Начнём с разметки трехколоночной страницы:

<header>
  <div>Логотип</div>
  …
</header>

<main>
  <article>
    <p>…</p>
  </article>
  
  <nav>
    <li>Навигация</li>
    …
  </nav>
  
  <aside>
    <div>Реклама</div>
    …
  </aside>
</main>

Превратим шапку, содержимое и сайдбары во флекс‑контейнеры и раскрасим флекс‑элементы для наглядности:

header,
main,
aside,
nav {
  display: flex;
}

header > *,
article > *,
aside > *,
nav > * {
  min-height: 36px;
  padding: 9px;
  margin: 9px;
  background: #e5f5ff;
}

Обратите внимание: по умолчанию флекс‑элементы разложились в строку, flex-direction: row

Дадим странице всю доступную высоту, разложим по вертикали и растянем её содержимое:

body {
  min-height: 100%;
  display: flex;
  flex-direction: column;
}

main {
  flex-grow: 1; /* Это заклинание заставляет <main> занять всё свободное пространство. Мы рассмотрим его чуть позже */
}

В левом сайдбаре разложим элементы сверху вниз:

nav {
  flex-direction: column;
  justify-content: flex-start;
}

В правом сайдбаре равномерно распределим элементы:

aside {
  flex-direction: column;
  justify-content: space-between;
}

И поменяем порядок элементов, чтобы колонка с навигацией была слева:

nav {
  flex-direction: column;
  justify-content: flex-start;
  order: -1; /* И это свойство мы рассмотрим чуть позже */
}

По умолчанию флекс‑элементы занимают столько места, сколько нужно их содержимому. Поэтому колонки с навигацией и рекламой сжались.

Чтобы ширина колонок с навигацией и рекламой не зависела текста, подчиним вёрстку пятиколоночной сетке. Зададим пропорции, по которым колонки и статья делят свободное место в 1:3:1:

nav {
  flex-direction: column;
  justify-content: flex-start;
  order: -1;
  flex-grow: 1;
  flex-basis: 0;
}

aside {
  flex-direction: column;
  justify-content: space-between;
  flex-grow: 1;
  flex-basis: 0;
}

article {
  flex-grow: 3;
  flex-basis: 0;
}

Упражнение: выравнивание флексбоксом

Изме­ните ЦСС так, чтобы пер­вый ука­за­тель повто­рил второй.


  
align-items: flex-end;
display: flex;
display: flex;
flex-flow: column;
justify-content: space-between;
margin-left: auto;
.plate {
}
.plate__header,
.plate__footer {
}
.plate__footer {
}
.plate__floor,
.plate__right {
}

Вёрстка

  • Платформы 1⁠—4

  • Макдональдс

  • Бюро находок

  • Платформы 5⁠—8

  • Камеры хранения

  • Туалет

  • Кассы

Дизайн

  • Платформы 1⁠—4

  • Макдональдс

  • Бюро находок

  • Платформы 5⁠—8

  • Камеры хранения

  • Туалет

  • Кассы

Вёрстка

  • Платформы 1⁠—4

  • Макдональдс

  • Бюро находок

  • Платформы 5⁠—8

  • Камеры хранения

  • Туалет

  • Кассы

Дизайн

  • Платформы 1⁠—4

  • Макдональдс

  • Бюро находок

  • Платформы 5⁠—8

  • Камеры хранения

  • Туалет

  • Кассы

Упражнение: выравнивание флексбоксом

Измените ЦСС так, чтобы первый указатель повторил второй.


  
align-items: flex-end;
display: flex;
display: flex;
flex-flow: column;
justify-content: space-between;
margin-left: auto;
.plate {
}
.plate__header,
.plate__footer {
}
.plate__footer {
}
.plate__floor,
.plate__right {
}
Скрыто 4 разворота
Скрыто 4 раз­во­рота

Чтобы лучше понять флексбоксы, проведём аналогию с авто‑лейаутом из Фигмы

Стрелки в левой колонке отвечают за направление главной оси:

  • flex‑wrap: wrap

  • flex‑direction: row

  • flex‑direction: column

Расстояние между элементами задаётся с помощью gap

Отступы снаружи элементов задаются с помощью свойств контейнера:

  • padding‑left и padding‑right

  • padding‑top и padding‑bottom

Выравнивание задаётся комбинацией свойств:

  • justify‑content: flex‑start; align‑items: flex‑start
  • justify‑content: center; align‑items: flex‑start
  • justify‑content: flex‑end; align‑items: flex‑start
  • justify‑content: flex‑start; align‑items: center
  • justify‑content: center; align‑items: center
  • justify‑content: flex‑end; align‑items: center
  • justify‑content: flex‑start; align‑items: flex‑end
  • justify‑content: center; align‑items: flex‑end
  • justify‑content: flex‑end; align‑items: flex‑end

flex‑wrap: wrap

flex‑direction: row

flex‑direction: column

gap

padding‑left и padding‑right

padding‑top и padding‑bottom

justify‑content: flex‑start; align‑items: flex‑start

justify‑content: center; align‑items: flex‑start

justify‑content: flex‑end; align‑items: flex‑start

justify‑content: flex‑start; align‑items: center

justify‑content: center; align‑items: center

justify‑content: flex‑end; align‑items: center

justify‑content: flex‑start; align‑items: flex‑end

justify‑content: center; align‑items: flex‑end

justify‑content: flex‑end; align‑items: flex‑end

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

Стрелки в левой колонке отвечают за направление главной оси:

  • flex‑wrap: wrap
  • flex‑direction: row
  • flex‑direction: column

Расстояние между элементами задаётся с помощью gap

Отступы снаружи элементов задаются с помощью свойств контейнера:

  • padding‑left и padding‑right
  • padding‑top и padding‑bottom

Выравнивание задаётся комбинацией свойств:

  • justify‑content: flex‑start; align‑items: flex‑start
  • justify‑content: center; align‑items: flex‑start
  • justify‑content: flex‑end; align‑items: flex‑start
  • justify‑content: flex‑start; align‑items: center
  • justify‑content: center; align‑items: center
  • justify‑content: flex‑end; align‑items: center
  • justify‑content: flex‑start; align‑items: flex‑end
  • justify‑content: center; align‑items: flex‑end
  • justify‑content: flex‑end; align‑items: flex‑end
Скрыто 20 разворотов
Скрыто 20 раз­во­ро­тов

С помо­щью grid-auto-columns и grid-auto-flow можно собрать адап­тив­ные колонки, рав­но­мерно деля­щие доступ­ное пространство:

.cols {
  display: grid; /* Включаем гриды */
  grid-auto-columns: minmax(100px, 1fr); /* Пусть неявные колонки равномерно делят свободное пространство, сохраняя минимальную ширину в 100 пк */
  grid-auto-flow: column; /* Пусть невлезающие элементы выстраиваются в колонки */
  gap: 18px; /* Задаём межколонник в 18 пк */
  height: 100%; /* Растягиваем колонки по высоте */
}
<div class="cols">
  <div>Первая колонка</div>
  …
  <div>Четвёртая колонка</div>
</div>

<div class="cols">
  <div>Первая колонка</div>
  <div>Вторая колонка</div>
</div>

<div class="cols">
  <div>Первая колонка</div>
  …
  <div>Пятая колонка</div>
</div>
Пер­вая колонка
Вто­рая колонка
Тре­тья колонка
Чет­вёр­тая колонка
Пер­вая колонка
Вто­рая колонка
Пер­вая колонка
Вто­рая колонка
Тре­тья колонка
Чет­вёр­тая колонка
Пятая колонка
Первая колонка
Вторая колонка
Третья колонка
Чет­вёр­тая колонка
Первая колонка
Вторая колонка
Первая колонка
Вторая колонка
Третья колонка
Чет­вёр­тая колонка
Пятая колонка

С помощью grid-auto-columns и grid-auto-flow можно собрать адаптивные колонки, равномерно делящие доступное пространство:

.cols {
  display: grid; /* Включаем гриды */
  grid-auto-columns: minmax(100px, 1fr); /* Пусть неявные колонки равномерно делят свободное пространство, сохраняя минимальную ширину в 100 пк */
  grid-auto-flow: column; /* Пусть невлезающие элементы выстраиваются в колонки */
  gap: 18px; /* Задаём межколонник в 18 пк */
  height: 100%; /* Растягиваем колонки по высоте */
}
<div class="cols">
  <div>Первая колонка</div>
  …
  <div>Четвёртая колонка</div>
</div>

<div class="cols">
  <div>Первая колонка</div>
  <div>Вторая колонка</div>
</div>

<div class="cols">
  <div>Первая колонка</div>
  …
  <div>Пятая колонка</div>
</div>
Скрыто 2 разворота
Скрыто 2 раз­во­рота

Meet Dynamic Island

48MP Main camera

The mastermind behind it all

A battery that’s all in, all day.

Film like a Pro.

Shaky shots, stable video

Always‑On display

Tougher than any smartphone glass

Water resistance

Emergency SOS via satellite

A camera in a class by itselfie.

Если в каче­стве зна­че­ний grid‑column или grid‑row задать auto, бра­у­зер сам решит, что делать с эле­мен­том и его пози­цией: эле­менты раз­ме­стятся в том же порядке, что и в коде, зани­мая по одной ячейке. Но если исполь­зо­вать auto / span N, то эле­мент зай­мёт N коло­нок или строк, начи­ная с теку­щего места. Так можно полу­чить «пли­точ­ную вёрстку», в кото­рой поря­док и раз­меры эле­мен­тов опре­де­ля­ются их раз­мет­кой. Напри­мер, как на про­мо­стра­ни­цах Эпла.

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

.grid {
  display: grid; /* Включаем раскладку гридами  */
  grid-template-columns: 1.85fr 1fr 1.85fr; /* Задаём резиновые направляющие для колонок: первая и третья в 1,85 раза больше центральной */
  grid-auto-rows: 320px; /* Задаём автоматические направляющие для строк: каждые 320 пикселей */
  gap: 20px; /* Задаём межстрочник и межколонник в 20 пк */
  background: #161617;
}

.tile {
  padding: 15px;
  border-radius: 15px;
  background: #000;
  color: #ffb6ff;
}

/* «Плитка» на одну ячейку */
.tile-1-cols-1-rows {
  grid-column: auto / span 1;
  grid-row: auto / span 1;
}

/* Плитка на одну колонку и две строки */
.tile-1-cols-2-rows {
  grid-column: auto / span 1;
  grid-row: auto / span 2;
}

/* Плитка на две колонки и одну строку */
.tile-2-cols-1-rows {
  grid-column: auto / span 2;
  grid-row: auto / span 1;
}

/* Плитка на 2 колонки и 2 строки */
.tile-2-cols-2-rows {
  grid-column: auto / span 2;
  grid-row: auto / span 2;
}
<div class="grid">
  <div class="tile tile-2-cols-2-rows">
    <h2>Meet Dynamic Island</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <h2>48MP Main camera</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <h2>The mastermind behind it all</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <p>A battery that’s all in, all day.</p>
  </div>
  <div class="tile tile-2-cols-1-rows">
    <p>Film like a Pro.</p>
  </div>
  <div class="tile tile-1-cols-2-rows">
    <p>Shaky shots, stable video</p>
  </div>
  <div class="tile tile-2-cols-2-rows">
    <h2>Always-On display</h2>
  </div>
  <div class="tile tile-2-cols-2-rows">
    <h2>Tougher than any smartphone glass</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <h2>Water resistance</h2>
  </div>
  <div class="tile tile-1-cols-2-rows">
    <h2>Emergency SOS via satellite</h2>
  </div>
  <div class="tile tile-2-cols-1-rows">
    <p>A camera in a class by itselfie.</p>
  </div>
</div>

Meet Dynamic Island

48MP Main camera

The mastermind behind it all

A battery that’s all in, all day.

Film like a Pro.

Shaky shots, stable video

Always‑On display

Tougher than any smartphone glass

Water resistance

Emergency SOS via satellite

A camera in a class by itselfie.

Если в качестве значений grid‑column или grid‑row задать auto, браузер сам решит, что делать с элементом и его позицией: элементы разместятся в том же порядке, что и в коде, занимая по одной ячейке. Но если использовать auto / span N, то элемент займёт N колонок или строк, начиная с текущего места. Так можно получить «плиточную вёрстку», в которой порядок и размеры элементов определяются их разметкой. Например, как на промостраницах Эпла.

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

.grid {
  display: grid; /* Включаем раскладку гридами  */
  grid-template-columns: 1.85fr 1fr 1.85fr; /* Задаём резиновые направляющие для колонок: первая и третья в 1,85 раза больше центральной */
  grid-auto-rows: 320px; /* Задаём автоматические направляющие для строк: каждые 320 пикселей */
  gap: 20px; /* Задаём межстрочник и межколонник в 20 пк */
  background: #161617;
}

.tile {
  padding: 15px;
  border-radius: 15px;
  background: #000;
  color: #ffb6ff;
}

/* «Плитка» на одну ячейку */
.tile-1-cols-1-rows {
  grid-column: auto / span 1;
  grid-row: auto / span 1;
}

/* Плитка на одну колонку и две строки */
.tile-1-cols-2-rows {
  grid-column: auto / span 1;
  grid-row: auto / span 2;
}

/* Плитка на две колонки и одну строку */
.tile-2-cols-1-rows {
  grid-column: auto / span 2;
  grid-row: auto / span 1;
}

/* Плитка на 2 колонки и 2 строки */
.tile-2-cols-2-rows {
  grid-column: auto / span 2;
  grid-row: auto / span 2;
}
<div class="grid">
  <div class="tile tile-2-cols-2-rows">
    <h2>Meet Dynamic Island</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <h2>48MP Main camera</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <h2>The mastermind behind it all</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <p>A battery that’s all in, all day.</p>
  </div>
  <div class="tile tile-2-cols-1-rows">
    <p>Film like a Pro.</p>
  </div>
  <div class="tile tile-1-cols-2-rows">
    <p>Shaky shots, stable video</p>
  </div>
  <div class="tile tile-2-cols-2-rows">
    <h2>Always-On display</h2>
  </div>
  <div class="tile tile-2-cols-2-rows">
    <h2>Tougher than any smartphone glass</h2>
  </div>
  <div class="tile tile-1-cols-1-rows">
    <h2>Water resistance</h2>
  </div>
  <div class="tile tile-1-cols-2-rows">
    <h2>Emergency SOS via satellite</h2>
  </div>
  <div class="tile tile-2-cols-1-rows">
    <p>A camera in a class by itselfie.</p>
  </div>
</div>
Скрыто 6 разворотов
Скрыто 6 раз­во­ро­тов

Адаптивная вёрстка

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

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

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

Адаптивная вёрстка

В отличие от печатной продукции, нельзя предсказать, в каком формате посетитель увидит вёрстку — на компактном телефоне или на сверхшироком мониторе. Если в каком‑то случае люди не смогут полноценно пользоваться сайтом, они уйдут на другой сайт. Поэтому хороший дизайн и вёрстка стараются адаптироваться под разные условия.

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

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

Скрыт 1 разворот
Скрыт 1 раз­во­рот

Текст внутри эле­мен­тов сам адап­ти­ру­ется под их ширину.

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

Для тек­сто­вых эле­мен­тов полезно огра­ни­чи­вать ширину через min-width и max-width, чтобы ширина тек­ста оста­ва­лась ком­форт­ной для чтения.

Рабо­таем с
1997 года.
Экс­перты на 
рынке авто­услуг.
Зво­ните: 8 800 301‑
64‑40

Рабо­таем
с 1997 года.
Экс­перты на рынке
авто­услуг.
Зво­ните:
8 800 301‑64‑40

Работаем с
1997 года.
Эксперты на 
рынке автоуслуг.
Звоните: 8 800 301‑
64‑40

Работаем
с 1997 года.
Эксперты на рынке
автоуслуг.
Звоните:
8 800 301‑64‑40

Текст внутри элементов сам адаптируется под их ширину.

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

Для текстовых элементов полезно ограничивать ширину через min-width и max-width, чтобы ширина текста оставалась комфортной для чтения.

Скрыт 1 разворот
Скрыт 1 раз­во­рот

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

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

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

Переполнение — overflow

Если содер­жи­мое больше ширины или высоты эле­мента, оно выле­зет за его гра­ницы. Это назы­ва­ется переполнением.

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

Свой­ство overflow управ­ляет тем, как эле­мент посту­пит с пере­пол­ня­ю­щим содержимым.

overflow: visible — по умол­ча­нию — содер­жи­мое выле­зет за гра­ницы, может налезть на сосед­ние эле­менты или доба­вить стра­нице ненуж­ную прокрутку.

overflow: hidden — содер­жи­мое обре­жется по гра­ни­цам элемента.

overflow: scroll — доба­вит про­крутку не влез­шего содер­жи­мого. Ино­гда исполь­зу­ется наме­ренно, чтобы «впих­нуть нев­пиху­е­мое» в дизайне.

Поскольку по умолчанию содержимое адаптируется под ширину элемента, а высота элемента адаптируется под содержимое, то переполнение может появиться только если где‑то нарушена стандартная адаптивность, заданы строгие размеры.

Поскольку по умолчанию содержимое адаптируется под ширину элемента, а высота элемента адаптируется под содержимое, то переполнение может появиться только если где‑то нарушена стандартная адаптивность, заданы строгие размеры.

Поскольку по умолчанию содержимое адаптируется под ширину элемента, а высота элемента адаптируется под содержимое, то переполнение может появиться только если где‑то нарушена стандартная адаптивность, заданы строгие размеры.

Переполнение — overflow

Если содержимое больше ширины или высоты элемента, оно вылезет за его границы. Это называется переполнением.

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

Свойство overflow управляет тем, как элемент поступит с переполняющим содержимым.

overflow: visible — по умолчанию — содержимое вылезет за границы, может налезть на соседние элементы или добавить странице ненужную прокрутку.

overflow: hidden — содержимое обрежется по границам элемента.

overflow: scroll — добавит прокрутку не влезшего содержимого. Иногда используется намеренно, чтобы «впихнуть невпихуемое» в дизайне.

Скрыто: страницы, спецэффекты
Скрыто: стра­ницы, спе­ц­эф­фекты
Скрыто: контроль качества, тестирование вёрстки
Скрыто: кон­троль каче­ства, тести­ро­ва­ние вёрстки
Скрыто: хостинг и домен, шаринг в соцсети, аналитика и статистика посещений
Скрыто: хостинг и домен, шаринг в соц­сети, ана­ли­тика и ста­ти­стика посе­ще­ний
Скрыто: работа с верстальщиком
Скрыто: работа с вер­сталь­щи­ком