CSS · Урок 4

Введение в CSS

CSS отвечает за внешний вид. Учимся подключать стили и писать первые правила.

Что такое CSS

CSS (Cascading Style Sheets) — каскадные таблицы стилей. Ключевое слово здесь «каскад»: правила применяются по порядку и дополняют друг друга. Одно правило выглядит так:

селектор {
  свойство: значение;
  свойство: значение;
}
p {
  color: #38bdf8;
  font-size: 16px;
}

Каждое существующее правило — либо как есть, либо «каскадом» передаётся потомкам.

Три способа подключения

СпособПримерКогда применять
Отдельный файл<link rel="stylesheet" href="style.css">Всегда, в продакшене
Тег <style>в <head>Прототипы, одноразовые страницы
Атрибут style<p style="color:red">Почти никогда
💡
Такой порядок приоритета: атрибут style перебивает тег <style>, а тот — внешний файл. Лучший подход — внешний файл и минимум «инлайна».

Базовые свойства

Самые частые инструменты оформления текста:

header {
  background-color: #1e293b;
  color: #e2e8f0;
}

h1 {
  font-family: "Segoe UI", sans-serif;
  font-size: 32px;
  font-weight: 700;
  text-align: center;
}

.link {
  color: #38bdf8;
  text-decoration: none;
}

.link:hover {
  text-decoration: underline;
}

Раскроем каждое:

Цвета в CSS

p { color: red; }              /* по имени */
p { color: #ff0000; }          /* hex */
p { color: rgb(255, 0, 0); }   /* rgb */
p { color: rgba(255, 0, 0, 0.5); } /* + прозрачность */

Единицы измерения

ЕдиницаОт чего зависитПример
pxпиксели экранаграницы, бордеры
%размер родителяширина блоков
remразмер корневого font-sizeшрифты, отступы
emразмер родительского шрифтавнутренние отступы
vh / vwвысота/ширина окнагерой-секции
ℹ️
В реальных проектах сейчас почти всегда выставляют базовый font-size: 16px на <html> и дальше работают в rem — так размеры масштабируются при изменении шрифта пользователем.

Живой пример

Стилизуем карточку за один шаг. Слева «голый» HTML, справа — то же, но с CSS:

Просто карточка без стилей
Та же карточка
с CSS 🎨

Наследование и каскад

Некоторые свойства передаются от родителя детям автоматически. Классика — цвет и шрифт:

body {
  color: #e2e8f0;          /* унаследуется всеми текстами */
  font-family: Arial, sans-serif;
}

А вот margin, padding, border и background не наследуются — просто потому, что иначе отступы «поехали» бы по всей странице.

СвойствоНаследуется?
color, font-*, text-align, line-heightда
margin, padding, width, heightнет
border, background, displayнет

Reset и Normalize

У браузеров разные стили «по умолчанию»: у одних у <ul> большие отступы, у других маленькие. Чтобы стартовать с чистого листа, подключают сброс:

/* Классический reset — решительно всё обнуляем */
*, *::before, *::after {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  font-family: sans-serif;
}
ℹ️
Полный сброс стирает и полезные вещи (например, акценты кнопок). Готовая библиотека Normalize.css, наоборот, выравнивает стили браузеров и ничего лишнего не ломает. Её часто используют в стартап-шаблонах.

CSS-переменные (custom properties)

В CSS можно объявлять собственные переменные — они задаются в двойном дефисе и работают везде ниже по дереву:

:root {
  --accent: #38bdf8;
  --gap: 16px;
  --radius: 12px;
}

.card {
  color: var(--accent);
  border-radius: var(--radius);
  padding: var(--gap);
}
💡
Главная сила переменных — палитру меняют в одном месте :root, и вся страница перекрашивается. На этом строятся переключатели «тёмная тема».

Адаптивные размеры: clamp()

Функция clamp() задаёт размер с минимумом, желаемым значением и максимумом. Идеальна для шрифтов, растущих с шириной окна:

h1 {
  font-size: clamp(1.5rem, 3vw + 1rem, 3rem);
}

Это означает: не меньше 1.5rem, стремиться к 3vw + 1rem, но не больше 3rem. Никаких media queries для одного заголовка.

⚠️
vw старается подстроиться под ширину окна. Но ставить огромные clamp() значения легко перестараться на огромных мониторах — всегда ограничивайте максимум.

Приоритет правил и !important

Когда два правила спорят, побеждает: инлайн-стиль > селектор по id > класс > тег. Если результат всё равно не тот, в ход идёт !important:

p { color: #38bdf8 !important; }  /* перебьёт класс и id */
⚠️
Помните: если что-то отбить !important можно, то отбить уже нечем, кроме !important же. В проектах его стараются сводить к нулю — это признак запутанных стилей.

Кастомные шрифты: @font-face и Google Fonts

Свои шрифты подключают директивой @font-face, а готовые — одной строкой из Google Fonts:

@font-face {
  font-family: "MyFont";
  src: url("../fonts/myfont.woff2") format("woff2");
  font-weight: 400;
}

/* или в head: */
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap" rel="stylesheet">
💡
Формат woff2 самый лёгкий, а display=swap (в Google Fonts) заставляет текст показаться сразу, а шрифт «догрузиться» фоном. Так страница не выглядит пустой, пока грузятся буквы.

Типографика: line-height, letter-spacing, text-decoration

Комфортное чтение — это не шутки. Три настройки решают 90% проблем с текстом:

body {
  line-height: 1.6;            /* межстрочный интервал */
  letter-spacing: 0.3px;      /* разрядка букв */
}

a { text-decoration: none; }   /* убрать подчёркивание */
.overline { text-decoration: overline; } /* линия сверху */
ℹ️
Оптимум для чтения: line-height между 1.4 и 1.8, а строки текста не длиннее примерно 70–80 символов.

@media: screen, print и брейкпоинты

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

@media screen and (min-width: 768px) {
  .menu { display: flex; }
}

@media print {
  nav, .ad { display: none; }   /* не печатаем меню и рекламу */
}
💡
Пишите стили «мобайл-фёрст»: сначала узкие экраны, потом добавляйте min-width-правила для широких. Так базовый код проще и легче.

Группировка селекторов

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

h1, h2, h3 {
  color: #e2e8f0;
  font-weight: 700;
}

Псевдоклассы состояния

Стили «по событию»: :hover, :focus, :active:

a:hover  { color: #7dd3fc; }
a:focus  { outline: 2px solid #38bdf8; }
a:active { opacity: 0.7; }
ℹ️
:focus — «попал в поле клавиатурой», :focus-visible — видимое фокусирование. Не убирайте обводку фокуса совсем — доступность страдает.

Структурные псевдоклассы

Порядковые номера среди братьев: первый, последний, каждый чётный:

li:first-child  { color: #34d399; }
li:last-child   { font-weight: bold; }
li:nth-child(3)     { text-decoration: underline; }
li:nth-child(even)  { background: #1e293b; }
💡
Формула nth-child(2n+1) = нечётные, (odd) и (even) — сокращения. Полосатая таблица — пара строк.

Атрибутные селекторы

Стиль по наличию атрибута или его значению:

input[type="text"] { border-color: #38bdf8; }
a[href^="https://"] { color: #7dd3fc; }  /* ^= начало */
a[href$=".pdf"] { color: #f87171; }       /* $= конец */

Каскад: кто победит

При одинаковой специфичности побеждает правило, объявленное позже (ниже в файле):

p { color: red; }
p { color: blue; }   /* победит: объявлено позже */
⚠️
Не «чините» перекрытия тяжёлыми селекторами и !important. Лучше — больше классов, меньше важности.

background: сокращённая запись

Одно свойство вместо четырёх:

.hero {
  background: #0f172a url("../img/bg.jpg") center / cover no-repeat;
  /* цвет | картинка | позиция / размер | повтор */
}

border: стили и стороны

Границы разделяются по сторонам, стилям и цветам:

.card {
  border: 1px solid #334155;       /* все стороны */
  border-left: 4px solid #38bdf8;  /* акцент слева */
  border-radius: 8px;
}
💡
Стили: solid, dashed, dotted, double. Пунктирные границы — удобная разметка «набросков».

Прозрачность: opacity и rgba

Полупрозрачность бывает для всего блока или только для цвета:

.ghost  { opacity: 0.5; }            /* блеклый весь блок, включая детей */
.bg-fade{ background: rgba(15, 23, 42, 0.8); } /* прозрачный фон, текст чёткий */
ℹ️
Нужен «стеклянный» текст поверх изображения? Дайте ему background: rgba(...) — текст останется контрастным.

Шрифтовые стеки

Перечисляйте шрифты через запятую: если первого нет, возьмётся следующий:

body {
  font-family: "Segoe UI", Roboto, Arial, sans-serif;
}

code {
  font-family: "Cascadia Code", Consolas, monospace;
}

line-height без единиц

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

body { line-height: 1.6; }   // 1.6 × размер шрифта
💡
1.6 без px масштабируется вместе с font-size любого потомка. С px фиксированная высота ломается при смене размера шрифта.

Выравнивание текста: text-align

Слева, по центру, справа или по ширине — куда прижимать строки:

h1    { text-align: center; }
.left { text-align: left; }
.right{ text-align: right; }
.just { text-align: justify; }

font: универсальная запись

Одно свойство, все настройки шрифта сразу:

.btn {
  font: 16px/1.4 Arial, sans-serif;   /* размер/строка шрифт */
  font-style: italic;
  font-weight: 600;
}

CSS-комментарии

Примечания к правилам — пишите их, когда логика не очевидна:

/* Тёмная зона не должна дотрагиваться до шапки */
.hero {
  padding-top: 0;
}

/* ===== Раздел: карточки ===== */
.card { ... }

Палитра в DevTools

Подбирайте цвета с пипетки и копируйте в код:

💡
Если цвет в проекте повторяется — уносите в CSS-переменную --accent. Тема-лавка и палитра станут управляемыми.

Тренировка

  1. Вынесите стили в отдельный файл css/style.css и подключите его через <link>.
  2. Задайте фон страницы, цвет заголовков и уберите подчёркивание у ссылок.
  3. Сделайте кнопку-ссылка с :hover-эффектом.
  4. Поиграйте с font-size в px, rem и em — почувствуйте разницу.

Селектор — «адрес» элемента

Селектор решает, к каким элементам применить правило. Чем «адреснее» селектор, тем точнее попадание: p — все абзацы, .alert — элементы с этим классом, #menu — один элемент с этим id.

p { color: #333; }
.alert { color: #c00; }
#menu { display: flex; }
💡
Начните с тегов и классов; к id-селекторам переходите осознанно в следующем уроке.

Каскад: порядок решает

Два правила задали одно свойство — победит то, что: 1) написано позже при равной специфичности, 2) специфичнее, 3) важнее (!important). Порядок «файл за файлом» тоже важен: тот CSS, что подключён последним, перекрывает ранние.

.alert { color: red; }
.alert { color: blue; }  /* победит: написано позже */
⚠️
«Не работает» в 80% случаев — это каскад: объявление перебили или проиграло по порядку.

Внешние и встроенные стили: сравнение

Внешний файл style.css через <link> — главный способ: стили общие для всех страниц. Блок <style> — для одной страницы. Инлайн style="" — для одного элемента.

<head>
  <link rel="stylesheet" href="css/style.css">
</head>
💡
Правило: один CSS-файл для сайта, пока проект не вырос — меньше путаницы.

Инлайн-стили: оправданное исключение

style="..." прямо на теге имеет максимальный приоритет среди обычных правил. Он удобен для экспериментов (DevTools), но в проекте «жёстко прошитые» стили труднее менять системно.

<p style="color: green">Зелёный один раз</p>
⚠️
Когда зелёных «один раз» становится пять — приходит время классов.

Наследование: «язык» и «семья»

Свойства «языка» (color, font-*, line-height) наследуются вниз по дереву: стиль на родителе применяется к потомкам, пока те не переопределят. Свойства «рамки» (margin, padding, border, background) не наследуются.

body { color: #222; font-family: system-ui; }
💡
Задайте «базовый язык» на body — все тексты сайта подхватят его автоматически.

Базовый сброс: Reset против Normalize

Браузеры «одинаково-по-разному» рисуют поля и отступы. Решение — короткий сброс (Reset: всё «в ноль», стилизуйте сами) или Normalize (ровные «стандартные» значения). Оба решают за вас одну болячку.

* { margin: 0; padding: 0; box-sizing: border-box; }
⚠️
Reset не означает «всё одинаковое» — он убирает «сюрпризы», а внешний вид вы строите сами.

Цветовые модели: hex, rgb, hsl

#38bdf8 — шестнадцатеричный, rgb(56, 189, 248) — «покраснение/позеленение/посинение», hsl(199°, 93%, 60%) — оттенок/насыщенность/светлота. Первые два привычнее, hsl удобнее крутить «тон».

.sky { color: #38bdf8; }
.sky2 { color: hsl(199 93% 60%); }
💡
DevTools «пипетка» позволяет подобрать цвет и скопировать его в любой из форматов.

Размеры блока: ширина и высота

Блочный элемент по умолчанию растягивается на всю ширину родителя; высота растёт с контентом. width/height задают «скелет», а внутри работает контент.

.card {
  width: 300px;
  height: 200px;
}
⚠️
Фиксированная высота режет текст, когда тот вырастает. Предпочитайте min-height.

Прозрачность двумя путями: opacity и rgba

opacity: 0.5 делает полупрозрачным ВЕСЬ элемент вместе с текстом. В color: rgba(0,0,0,0.5) и background: rgba(...) прозрачна только «краска», текст остаётся чёрным и чётким.

.t1 { opacity: 0.5; }                  /* всё полупрозрачно */
.t2 { background: rgba(0,0,0,0.5); }  /* только фон */
💡
Читаемый текст на «полупрозрачном» фоне чаще делают через rgba-фон, а не opacity.

Единицы: px, %, em, rem, vw, vh

px — абсолютные, % — от родителя, em — от своего font-size (и множится во вложенности), rem — от корневого (надёжнее), vw/vh — от окна браузера.

.card { width: 80%; font-size: 1rem; }
.hero { height: 60vh; }
💡
Стартовое правило: rem для шрифтов и отступов, % и flex/grid для ширины, px для рамок.

Бокс-модель: от краёв к центру

Любой элемент — «коробка»: контент → padding (внутренний отступ) → border (рамка) → margin (внешний отступ). Ширина по умолчанию считает контент, но box-sizing всё меняет — об этом в уроке 5.

.box { padding: 10px; border: 1px solid; margin: 12px; }
💡
В DevTools вкладка «раскрытие» буквально рисует коробку: кликните на элемент и смотрите слои.

Поля и отступы: padding против margin

padding образует «воздух» ВНУТРИ рамки (расстояние контента от края блока), margin — СНАРУЖИ (расстояние между блоками). Смешивать не запрещено, но понимание правила очень помогает.

.card {
  padding: 16px;   /* текст не прилипает к краю */
  margin: 8px;    /* воздух между карточками */
}
💡
У фона «дышит» padding, между соседями — margin. Ориентируйтесь по видимому цвету фона.

Рамка: border и скругление

border — рамка: тон, стиль, цвет. border-radius — скругление углов (одно значение — все углы). Это декоративная «обёртка» любой коробки.

.badge {
  border: 2px solid #38bdf8;
  border-radius: 8px;
}
⚠️
border прибавляется к ширине блока по умолчанию — вспоминайте box-sizing в уроке 5.

Тень: box-shadow и «глубина»

box-shadow: сдвиг-по-X сдвиг-по-Y размытие цвет создаёт «подъём» блока. Несколько теней перечисляются через запятую — так делают «лестницы» и двойную тень.

.card {
  box-shadow: 0 2px 8px rgba(0,0,0,0.15);
}
💡
Маленькая тень + небольшой сдвиг «приподнимают» карточку при наведении (:hover).

Фон: цвет, картинка, градиент

background-color заливает цветом, background-image кладёт картинку (или градиент), background-size: cover подгоняет её «во весь блок».

.hero {
  background: linear-gradient(#0ea5b7, #38bdf8);
  background-image: url("bg.jpg");
  background-size: cover;
}
⚠️
Поставьте цвет «под» картинку: пока та грузится, фон выглядит аккуратно.

Шрифты системные: стеки

«Системный стек» — список шрифтов, которые браузер берёт с устройства пользователя: system-ui, Arial, Helvetica... Задайте список: если первого нет, возьмут второй.

body {
  font-family: system-ui, -apple-system, "Segoe UI", Arial, sans-serif;
}
💡
Требование «одни и те же буквы у всех» достигается загрузкой шрифта — следующий раздел.

Шрифт из файла: подключение

Кастомный шрифт «привозят» из Google Fonts (link в head) или хранят у себя через @font-face. После подключения его имя ставят в font-family, как системное.

@import url('https://fonts.googleapis.com/css2?family=Inter&display=swap');
body { font-family: 'Inter', system-ui; }
⚠️
Много шрифтов тормозят загрузку: два-три «стилистических» на сайт — достаточно.

Центрирование блока: margin: auto

Блочный элемент с явной шириной центрируется горизонтально одним правилом: margin: 0 auto. «0» — вертикальный отступ, «auto» — одинаковые поля слева и справа.

.container {
  width: min(960px, 90%);
  margin: 0 auto;
}
💡
min() — «взять меньшее»: ширина 960px, но на телефоне не шире 90% экрана.

display: block, inline, inline-block

block — на всю ширину, со своей строкой; inline — «в тексте», без ширины/высоты; inline-block — «в строке», но размеры и поля работают. Расстановка «в ряд» — удобная, но грубая; для серьёзных рядов есть flex/grid (урок 6).

.tile { display: inline-block; width: 120px; }
⚠️
Пробел между inline-block-элементами в коде превращается в «дыру» между плитками — помните о нём.

overflow: что делать с лишним

overflow: visible — видно за краями, hidden — обрезать, scroll — скролл всегда, auto — скролл если нужно. Классика: картинка не влезает — задайте overflow, а не высоту блока.

.thumb {
  width: 160px;
  height: 160px;
  overflow: hidden;
  border-radius: 50%;
}
💡
Круглый аватар из квадратной фотки — это overflow: hidden + border-radius: 50%.

Медиа-запросы: брейкпоинты по-простому

Правила внутри @media (max-width: 600px) действуют только на узких экранах. «Брейкпоинт» — ширина, при которой макет перестраивается. Начинайте с одного-двух, не копируйте чужие списки.

.grid { display: grid; grid-template-columns: repeat(3, 1fr); }
@media (max-width: 600px) {
  .grid { grid-template-columns: 1fr; }
}
💡
Проверяйте каждый брейкпоинт «пальцем»: перетяните окно DevTools и найдите, где всё ломается.

Плавные переходы: transition

transition: свойство длительность плавно «доезжает» до нового значения при hover/фокусе. Порог: transition не сработает без исходных и конечных значений в разных состояниях.

.btn { background: #38bdf8; transition: background .3s; }
.btn:hover { background: #0ea5b7; }
💡
Короткие переходы (0.2–0.4 с) приятнее; длинные раздражают при частых состояниях.

Псевдоклассы: not, first-child, last-child

:first-child/:last-child — первый/последний в родителе, :not(.x) — «кроме». Без них «отбить первую строку» приходится классами-вручную.

nav a { margin-right: 12px; }
nav a:last-child { margin-right: 0; }
.row > *:not(:last-child) { margin-bottom: 8px; }
💡
last-child «убирает» хвостовой отступ автоматически — меньше классов = меньше правок.

Псевдоэлементы: before и after

::before и ::after рисуют «виртуальный» кусочек до/после содержимого. Классика: «стрелка» у ссылки, разделитель, декоративный кружок — без новых тегов в HTML.

.link::after {
  content: "→";
  margin-left: 4px;
}
⚠️
Без свойства content псевдоэлемент не появится — даже content: "" обязателен.

Практика: карточка «о себе»

Соберите карточку: фон, padding, border-radius, box-shadow, центрированный контент, тень на hover. Это стартовый «builder» всех будущих проектов — карточка не раз пригодится.

.about {
  max-width: 420px;
  margin: 40px auto;
  padding: 24px;
  border-radius: 12px;
  box-shadow: 0 4px 16px rgba(0,0,0,0.12);
}
.about:hover { transform: translateY(-2px); }
💡
Такой hover-«приподъём» сразу придаёт странице живость — дешёвый приём, эффектный результат.

Чек-лист: почему стили не применились

Порядок проверки: 1) селектор «попал»? Откройте DevTools → «стили»; 2) правило зачёркнуто? — перебито каскадом; 3) опечатка в свойстве (блок редко прощает); 4) файл подключён и путь верен; 5) специфичность: .a.b сильнее .b.

💡
Зачёркнутая строка в DevTools — это подсказка, а не ошибка: прочитайте, что её «перебило».

Итоги урока 4: что уже стилизуете

Вы умеете: подключать CSS, писать селекторы и каскад, управлять цветом, шрифтами, коробками, фоном, тенью, адаптивом на медиа-запросах и плавными переходами. Это половина «внешности» сайта. Дальше — глубина: специфичность, позиционирование и flex/grid.

💡
Возьмите страницу «Обо мне» и «оденьте» её карточкой урока: цвет, тень, hover — и она заиграет.

Шрифтовая пара: базовый плюс акцентный

Гарнитура — характер страницы. Лучшая стратегия новичку: один шрифт «для текста» (читаемый) и один «для заголовков» (характерный). Пара «шрифт+акцент» задаёт настроение дольше, чем «один на всё».

💡
Меньше двух — «скучно», больше трёх — «разнобой»: держитесь диапазона из пары.

font-family: список с резервом

font-family — «очередь» шрифтов через запятую: если первого нет, применяется следующий. В конце обычно «безопасное» семейство (serif / sans-serif). Так страница «не ломается» без конкретной гарнитуры.

body {
  font-family: "Segoe UI", Arial, sans-serif;
}
💡
«/» в названии шрифта — риск: лучше имя в кавычках, когда оно «с пробелом».

font-size: «база» текста

Размер шрифта задаётся в px, em, rem (и других). Базовая строка — «комфортная» для чтения: 16–18px для мелкого текста, крупнее — у заголовков. «Ползунок» читателя zoom работает с «правильной» базой.

💡
Задавая size в rem — «наследуете» базовый размер и zoom «работает» честно.

Свойство line-height: «дыхание» строк

line-height — интервал между строками. Число без единиц («1.6») — «относительно текущего размера». Слишком мало — строки липнут, слишком много — «рыхлость». Классика: 1.5–1.7 для текста.

p { line-height: 1.6; }
💡
line-height в единицах — ловушка при наследовании: числовой «1.6» переносится «спокойно».

letter-spacing: межбуквенный интервал

letter-spacing разрежает/сжимает буквы. Техника «в раскачку» — для заголовков и «меню». Меньше — «тесно», больше — «воздушно». Мелкий кегль в разрежку читается хуже, чем плотный.

h1 { letter-spacing: 2px; }
💡
Крупный заголовок + «разрядка» = «логотипная» роскошь, но читайте с дистанции.

text-indent: красная строка

text-indent отступает первую строку абзаца «вправо» (или влево, если отрицательный). Старомодная «красная строка», но в вебе встречается; нативная альтернатива — пустой абзац с «воздухом».

p { text-indent: 1.5em; }
💡
Если абзацы разделены отступами, text-indent не нужен: не удваивайте «ритм».

text-transform: регистр средствами CSS

uppercase/lowercase/capitalize меняют регистр «на виду», не трогая разметку. Кнопки и ярлыки в «ВАЛЕТОМ» читаются проще. Не пишите ИСТИНУ в HTML — оставьте CSS превращать.

.label { text-transform: uppercase; }
💡
Акронимы «NAV» наберутся «как в HTML»; CSS-регистр лишь «стилизует» текст.

Перенос длинных слов: overflow-wrap

Длинное слово без пробелов «выпадает» из контейнера. overflow-wrap: anywhere переносит «по-доброму», а break-word — «по-жёсткому». Телефоны и email в таблицах — «самые кандидаты».

.msg { overflow-wrap: anywhere; }
💡
Гиперссылки-длиннухи и «ключи» — вот кто ломает вёрстку: лейте overflow-wrap под них.

Горизонтальные отступы абзацев: margin

Расстояние между абзацами — «горизонтальные» швы текста. Правило: между абзацами больше, чем внутри. margin-top у абзацев и «классические» штили «первого-нет» — побеждает чистота ритма.

💡
«Абзацы + абзацы-воздух»: типографика «отдыхает» там, где элементы не слипаются.

Вертикальный ритм: повторение интервала

Если отступы «бьются» в базовую единицу (например, кратны line-height) — страница «дышит». Техника сложная, начните с простого: все margin — «одно и то же число либо кратно». Уже ритмично.

💡
Проверка «ритма»: «мульти» на кратность — глаз мгновенно ловит неуползающие элементы.

Декор ссылок: убираем подчёркивание

Ссылки «по умолчанию» подчёркнуты. text-decoration: none убирает линию — тогда о «ссылке» говорит цвет или другой знак. Убирать «полностью» — удобство под вопросом: подчёркивание = «кликабельно».

.menu a { text-decoration: none; }
💡
Классика меню — none; в тексте статьи — «оставьте линию»: дружелюбно и привычно.

Стиль подчёркивания: text-decoration-style

Линию можно менять: solid, double, dotted, wavy. text-decoration-style работает с «декоративной» линией (не с border). «Волнисто» — «нет, так нельзя» в интерфейсах, но аккуратно в акцентах.

💡
Wavy-линия под «опечаткой» — лучший способ «показать», а не «рассказать» про ошибку.

Положение линии: text-underline-offset

text-underline-offset отодвигает линию от текста: «дышит» подключиние под>word, всё чётче. Слишком близко — линия «режет» выносные буквы, слишком далеко — «отрыв» от слова.

a {
  text-underline-offset: 3px;
}
💡
«Отступ» 2–4px даёт «живые» ссылки без наложения на «ё», «р», «у».

Отмена регистра: text-transform: none

text-transform: none «снимает» превращение регистра — полезно, когда родитель сделал uppercase, а потомок «должен быть как есть». Классика «вниз по наследованию» — честный none.

💡
Не пишите прописных «в HTML», чтобы «переиграть» CSS: none — законный инструмент слоёв.

Пробелы и переносы: свойство white-space

white-space управляет пробелами и переносами: pre — «как есть», nowrap — «не переносить», normal — «по умолчанию». Код и адреса «хотят» pre; кнопки — иногда nowrap.

code { white-space: pre; }
💡
pre сохраняет переносы «от редактора»: из-за этого и применяется для кода и логов.

Ручной перенос: тег wbr в длинном тексте

wbr — «место, где можно перенести»: браузер перенесёт только при необходимости. Удобно для длинных слов и длинных адресов. «Шов» невидим в обычном потоке — не путать с «новой строкой».

наи<wbr>длиннейшее<wbr>слово
💡
Вставьте wbr «по морфемным» границам — перенос «не даст» ломать слово «как попало».

display: block против inline

Строчные элементы (a, span) «не создают строк»; блочные (p, div) — «полные строки». display меняет «роль». Для «ссылка-кнопка» ставят inline-block: блочное поведение внутри строк бок о бок.

a.btn {
  display: inline-block;
  padding: 8px 16px;
}
💡
inline-block добавляет «размер» строчному поведению: padding и width начинают работать.

Прозрачность текста: декокрасия фона

Прозрачный текст («выжженный» watermark) — трюк: color: transparent с фоном-градиентом «проявляет» слово. Денсация «текст-фон» для лого и «васильковых» плашек — осознанный стиль.

💡
Чуть-чуть прозрачности + overshow — «дышащий» дизайн без «пестроты».

Тире и дефис: как не путать

Дефис (-) — внутри слова, тире (—) — между частями. «Съём-ка» ← дефис; «Съём — это...» ← тире. На веб-страницах правильно ставить длинное тире (—), а не минусы. Мелко, но «грамотно».

💡
Клавиатурный «минус» — совсем другой символ: у него своя ширина и не его смысл.

Акцент на слове: и его CSS

Важной части текста — сильный акцент: (семантика) + CSS для вида. Курсив тоже может выделять: — «логотип» смысла. Выделение «невидимо» — «акцент» средствами одного тега слабоват.

strong { font-weight: 700; }
💡
strong — «важное», em — «акцентное интонационное»: различие оглашает скринридер.

Подключение локального шрифта: @font-face

Локальные шрифты «привозят» с собой: @font-face описывает имя, файлы и начертание. Браузер «находит» по font-family. Свои файлы — своя «поставка» без внешних сервисов.

@font-face {
  font-family: "MyFont";
  src: url("myfont.woff2") format("woff2");
}
💡
woff2 — лучший «вес» среди веб-форматов: отдавайте его в первую очередь.

Параметры @font-face: font-display

font-display управляет «поведением» шрифта при загрузке: swap — «покажи запасной, потом подменяй», fallback — «подожди чуть-чуть», optional — «если медленно — не грузи». Лицо страницы зависит от strategy.

💡
swap «сохраняет» текст немедленно, но «прыжок» шрифта случается на медленном соединении.

Отложенная подгрузка: font-display: swap

swap — «дружелюбный» дефолт для шрифтов: текст показывается запасным, а «красивый» встаёт позже. Блокирующей «белой страницы» нет. Тонкость — раскладка «прыгает» при подмене.

💡
Случай «шапка-с-лого»: задайте запасному font-family на похожий размер — «прыжок» меньше.

Google Fonts: только нужные начертания

Google Fonts подключают через link или @import — и можно выбрать лишь «нужные» веса. Чем меньше начертаний, тем легче шрифтовой CSS. Правило: 2–3 начертания, не «весь каталог».

<link href="...family=Roboto:wght@400;700"
      rel="stylesheet">
💡
Ограничьте «семью» тремя весами: и рендер быстрее, и интерфейс дисциплинированнее.

Жирность начертания: font-weight по порядку

font-weight: normal=400, bold=700 (и 100–900). «Догадки» букв: браузер «подрисует» толщину, если нужного файла нет. Заказывайте «100…900» честно — и fat-заголовки «не разочаруют».

💡
«Подрисовая» жирность часто смазывает буквы; настоящий файл веса «чистый».

Семейство шрифтов: «безопасная» стопка

«Безопасные» семейства — есть в системах: Arial, Verdana, Georgia, Tahoma. Стопку делают: «любимый», «безопасный», «родовое семейство». Так дизайн «держится» и без кастомных файлов.

body { font-family: Verdana, Tahoma, sans-serif; }
💡
Разница «Verdana vs Arial» в ширине: шрифтовой выбор задаёт «протяжённость» текста.

Единицы pt: для печати, не для экрана

pt («точка») — полиграфическая единица. В CSS-экранах там, где физический «дюйм» не сходится с ретиной — pt «дрожит». Для относительного масштаба лучше rem/px/em. pt живёт в «печати» и документных style-guides.

💡
Помните про pt (пункты) в старых CSS-учебниках: «rem/em+px» — современный выбор.

Вес vs толщина: font-weight без опоры

Иногда «жирности» нет в файле, и браузер «синтезирует» толще. Появляются «грязные» буквы. Чище — подгрузить правильный вес (font-face) или использовать настройку «synthetic bold» сознательно.

💡
Запрет «синтетической» жирности: font-synthesis: none — и «нечестные» жирности «не сказка».

Кириллица в шрифтах: проверка покрытия

Не все шрифты «говорят по-русски». Файл может содержать только латиницу — тогда кириллица «подменится» запасным. Проверка: показать «ЙШГЪ ЮЯ» в настройках шрифта; в вебе — тест «в лоб».

💡
Проверяйте «кириллическое» покрытие на странице шрифта до подключения — потом сложнее.

Шрифт с «дышащими» прерываниями: визитка текста

«Живая» типографика — контраст: крупный заголовок, средний текст, маленькая подпись. Сделайте «на глаз» и затем сравните с «после паузы». Умение «видеть» текст — навык, приходит с правками.

💡
«Похоже на вывеску?» — сигнал, что иерархия текста «громкая», а «интервал» — пауза.

Практика: статья с «правильной» типографикой

Наберите статью: заголовок с тенью-лёгкой, абзацы с «воздухом», цитата в блоке, список «телеграфный». Примените letter-spacing к подзаголовкам, line-height к абзацам. Цель: «структура читается без усилий».

article p {
  margin-bottom: 1.2em;
}
💡
Один «сильный» приём на блок — и страница уже «глянцевая»; не сыпьте всё сразу.

Практика: визитка текстовыми средствами

Визитка «только CSS-текстом»: имя крупным, должность «разреженным» кеглем, контакты списком, в углу — «лого-буква» в цветном квадрате. Ни одного изображения: «текст рисует» весь дизайн.

💡
Потрясает «визитки»: сочетание «крупно/мелко», «плотно/воздушно» — ваша типографиность.

Практика: разворот событий с датами

Лента «событий»: дата слева, название события справа; разделители-линии между. Выравнивание через flexbox, даты — в «тонком» стиле, события — «обычным». Практика «двух колонок текста».

💡
Держите «базовую линию»: даты одной высоты, названия одной высоты — и воздух «усёлся».

Контраст текста: 4.5:1 для комфорта

Текст на фоне должен «говорить»: коэффициент контраста ≥4.5:1 для обычного, ≥3:1 для крупного. Пастель «по-пастели» — красиво, но «читаемо» — обязательно. Подберите инструментом, потом проверьте.

💡
Серый текст на сером фоне — не «дизайн», а неудачная «проба»: поднимайте контраст.

Размер «по проценту»: 1em от базы

em «относится» к родительскому размеру: 1em = размер родителя, 2em — вдвое. Удобно «масштабировать» блок целиком. Но «глубина вложенности» умножает — следите за «пирамидой» em.

.card { font-size: 20px; }
.card h3 { font-size: 1.5em; } // 30px
💡
em «съезжает», если глубоко вложить; rem «абсолютно» устойчив — выбирайте осознанно.

Цифры и размеры: особый кегль таблиц

Цены, суммы, количества «в таблице» требуют «табулированных» цифр — одинаковой ширины в колонке. Выравнивание «по правому краю» — в вёрстке, а monospace/кастомные «цифровые» — для ровности.

td.num {
  font-variant-numeric: tabular-nums;
}
💡
tabular-nums: «цифры одной ширины» — таблица «стоит», а не «дышит» вправо-влево.

Ссылка как кнопка: большая зона клика

«Ссылку-кнопку» делают padding'ом: зона клика растёт, а не «ссылка-строка». На мобильных «куда больше» важно. Минимальная тач-мишень — 44×44px; набирайте «земли» padding'ами.

a.btn {
  display: inline-block;
  padding: 12px 20px;
}
💡
«Мишень» 44px: палец «попадает», ссылка «бедного» размера — источник «неклик» жалоб.

Чек-лист текст-вёрстки

Прогнал статью через чек-лист: базовая гарнитура с резервом; line-height 1.5+; абзацы с «воздухом»; заголовки «дышат»; контраст 4.5:1; длинные слова переносятся; цитаты «в блоке»; акценты «семантично».

💡
«Чек-лист» — маленький референс: десять секунд на глаз — и «красивый» текст у вас.

Ошибки стилей текста: частые пять

1) текст без «воздуха» (line-height=1); 2) ссылки без подчёркивания в потоке абзаца; 3) контраст «съедает» фон; 4) «прыгающий» шрифт без swap-дисциплины; 5) em-«пирамиды» глубже, чем надо. Пять — и все «на глаз».

💡
«Пятёрка» поиска делает аудит быстрее: смотрите по списку, а не «методом угадывания».

Итоги урока 4: текст управляется

Шрифты подключили (локальные/Google), размеры усмирили (px/rem/em), ритм выстроил (line-height, отступы), «акценты» осмыслили (/), контраст проверили. Наконец — текст «слушается» CSS.

💡
Выберите статью, «переоденьте» в пару шрифтов и пройдите чек-лист — практика урока до точки.

Единицы шрифта: px, em, rem, итог

px фиксирован, em — от родителя, rem — от корня, проценты — от блока. Для типографики «мир»: rem держит базу, em живёт «внутри» компонента. Итоговая формула — «связка» масштаба.

💡
База 16px, заголовки в rem, «локальные» отступы в em — предсказуемая система.

Модульный масштаб: лесенка размеров

«Лестница» типографики: ряд кеглей с постоянным шагом (1.2, 1.333). Каждый заголовок «берёт» ступень. Масштаб «держит» сайт целым: текст «гармонирует» от строки до заголовка.

💡
Масштаб 1.2/16px → 19/23/28/33/40px: «стройная» лестница почти без подбора.

Иерархия текста: готовая схема

Схема уровней: заголовок (крупно, вес), подзаголовок (меньше), текст (база), подпись (мельче). Каждому уровню — свой размер и «роль». Читатель «видит» иерархию с первого взгляда.

💡
«Видимый» контраст уровней — главный приём: разница размеров «организует» текст.

Кегль и удобочитаемость

Удобочитаемости — «размеры» не «волнуют» телефоны и десктопы одинаково. Основной текст 16–18px, футерные подписи — 12–14. «Мельчить» нельзя: глаза «устают». Крупное «солиднее», но «громче».

💡
«Помельче» — это «не стиль», а «грызня» глаз: держите базу человеческой.

Пропорции строки и ширины колонки

Колонка 45–75 символов + line-height 1.4–1.6 — «комфортная» пара. «Широкая» строка требует «больше» воздуха. max-width блоков текста — «правило» удобочитаемости.

💡
«Строка не шире 70 знаков»: max-width: 65ch, друзья. Считайте «символы», а не «пиксели».

Первый абзац: без отступа

После заголовка первый абзац «без» отступа: «отбивка» уже есть. Типографика текстов: отступ абзацев — через margin/padding, а не «двойной пробел». Читается «чисто» и «дышит».

💡
Абзацы разделяйте «воздухом» (margin), а не «красной строкой»: современный веб «дышит».

Веб-шрифты: загрузка своими файлами

Свои шрифты — через @font-face: url файла, font-family-имя, веса. Файлы .woff2 — «сжатые» и «быстрые». «Своё» семейство — «уникальная» типографика сайта.

@font-face {
  font-family: MySet;
  src: url("my.woff2") format("woff2");
}
💡
woff2 — «оптимальный» формат для веба: малый вес и быстрая загрузка.

Системные шрифты: локальный стек

Системные шрифты (Segoe UI, Roboto, system-ui) — «родные» устройствам: ноль загрузки. Стек -apple-system, Segoe UI, Roboto… — «универсал». Плюс: скорость; минус: «стандартность» вида.

💡
Нет загрузки — нет «ушей» в скорости: системный стек для «сервисных» интерфейсов.

Семейство шрифта: веса и начертания

Одна гарнитура = «семейство»: веса (300–900), курсив, «конденсация». Парой весов пользуются чаще: regular + bold. «Семейство» целиком дает «характер» без «раздвоения» шрифтов.

💡
«Один шрифт в трёх весах» часто «красивее», чем «два шрифта вперемешку».

Лицензии шрифтов: законность набора

Шрифты «не свободны» по умолчанию: у каждого — лицензия. «Коммерческое» подключайте «по разрешению». «Открытые» (SIL OFL) — «спокойное» использование. Проверяйте «право» перед «публикацией».

💡
Слова «free» не всегда «для бизнеса»: читайте лицензию — это «юридическая» гигиена.

Первая буква абзаца: стиль интроверта

Псевдоэлемент ::first-letter — «буквица» первого символа. Крупная «заставка» абзаца — «редакционный» смысл. И ::first-line — «первая строка». «Точечные» акценты — эти два инструмента.

💡
Буквица «статьи»: ::first-letter { font-size: 3em; float: left; } — «художество» без JS.

Вариативный шрифт: много видов в одном

Вариативные шрифты — «ось» параметров: вес меняется плавно в одном файле. CSS задаёт font-variation-settings. Анимация толщины/ширины — «живой» заголовок. Файл один — «динамика» богатая.

💡
«Хаки» вручную плавного веса — сфера вариативных шрифтов: эффект, но «по желанию».

Вертикальное выравнивание в строке

vertical-align правит «высотой» внутри строки: baseline, middle, top, числа. Для «картинок в строке» и «приподнятых» индексов. Не «рулит» блоками: только «строчными» соседями.

💡
Иконка «в тексте» — vertical-align: middle: «одна» строка не «скакает» по базе.

Свои маркеры списков: list-style

list-style: none убирает маркеры; ::marker «рисует» свои. Символ, картинка, «счётчик» — по вкусу. «Чистота» списков — половина «аккуратного» текста. Не «лепите» ::before в ущерб «простоте».

💡
Маркер-«картинка» декоративен; «данные» списка — в text: не прячьте суть в стилях.

Направление текста: writing-mode

writing-mode: vertical-rl — «столбец» текста сверху вниз. Плакаты, «восточные» надписи — его приём. «Горизонтальная» строка «становится» вертикальной «колонкой». «Эксперименты» — с «осознанием» цели.

💡
«Вертикальная» подпись у фото — тонкий «книжный» акцент, если текст «короткий».

Заглавные буквы: text-transform

text-transform: uppercase, lowercase, capitalize — «регистр» без правки текста. Капс «заголовков» — «жёсткий» тон; нормальная речь — «как в вёрстке». Не «кричите»: капс «СООБЩЕНИЯ» — «крик» везде.

💡
«АКЦЕНТ» сделать капсом в CSS, а не менять «исходник»: «смысл» текста «остаётся» человеку.

Разрывы слов: word-break и overflow-wrap

Длинные слова «разрываются» по-разному: overflow-wrap — «внутри», word-break — «в любом месте». Для URL и «терминов» в карточках. «Не разрывайте» обычные слова «насилием»: «афигеть» — не надо.

💡
«Мультидисциплинарный» в карточке — overflow-wrap: anywhere: «надежное» дыхание.

Переносы по слогам: hyphens

hyphens: auto — браузер переносит по правилам языка (с lang). Широкие колонки становятся «ровнее» — меньше «рвань» краёв. Настройка auto + lang — «естественные» переносы.

💡
Russian lang + hyphens: auto — «переносы по-русски», когда строка ужимается.

Типы гарнитур: с засечками и без

Serif (с засечками) — «книжное»; sans-serif (без) — «интерфейсное». Смешение: «сериф» для текста, «гротеск» для заголовков — классика. Классификация помогает «выбирать пару».

💡
«Гротеск для заголовков + сериф для тела» — «читаемая» пара в 80% редакционных сайтов.

Цвет в тексте: акцент без крика

Цвет «в тексте» — акценты: ссылки, ключевые числа, «лейблы». Один акцент-цвет + нейтральный текст — «сдержанно». «Радуга» в тексте — «клякса» читаемости. «Цвета» — служанки смысла.

💡
«Акцент» — для «важного»; обычный текст — тёмно-серый/почти чёрный: контраст «размерный».

Свой масштаб: html font-size в rem

html { font-size: 18px; } — «перемещает» базу; rem «следят» за ней. Весь «rem-мир» масштабируется одной правкой. Система «центральная» — удобна для «тем масштаба». Не «путайте» с «изменением текста» по зёрнам.

💡
«База выше» — сайт «крупнее» целиком: «ночная» версия, «детская» — системные истории.

Калькулятор px → rem: быстро и понятно

rem = px / база. База 16px: 48px = 3rem, 12px = 0.75rem. «Умное» деление «в уме» — скорость правок. Таблица соответствий «на столе» новичку — «мгновенный» перевод.

💡
16→1, 24→1.5, 32→2, 40→2.5: «округлые» ступени — «память» без калькулятора.

Единицы контейнера: cqw и cqh

«Контейнерные» единицы (1cqw = 1% ширины родителя-контейнера) — «родственники» vw, но «внутри» блока. Полезны при контейнерных запросах. Свежее, но «приемлемо» в современных браузерах.

💡
«Карточка-повторение» размера «по контейнеру» — «единицы» cqw: компонент самодостаточен.

Проценты ширины текста

width: 60% на text-блоке — «резина» от родителя. Сочетание «процент + max-width» — «и гибкий, и не дикий». Проценты «в тексте»: колонки и ввод. «Процентная» сетка текста — «общий» приём.

💡
«Процент + max-width/ch» — «универсальная» колонка: «дышит» быстро, не «перерастает».

Расстояние заголовок—текст

Отступ «между» заголовком и абзацем должен «склеивать» пару: меньше, чем «до» соседнего блока. Правило «близости» в типографике: related = «вместе». «Воздух» — «разделитель», не «ройпы».

💡
h2 margin-bottom «меньше», чем margin-top: «связка» с телом крепче, чем сверху.

Плотность текста: компактность и воздух

Плотность — «густота» строк на экране: служебные списки компактны, статьи «воздушны». Контекст решает: таблицы «плотные», лендинги «редкие». Регулируется размером, строкой, отступами.

💡
«Панель задач» — плотнее; «новостная статья» — воздушнее. «Контекст» диктует.

Зум браузера и единицы текста

Браузерный zoom «растягивает» всё; текстовый «только шрифты». rem наследует «базу» — зум работает предсказуемо. px «не масштабируются» текстом — «осторожно». «Текстовые» веб-страницы: rem «дружит» с зумом.

💡
rem «в паре» с текстовым зумом: «строки» набора «переприспосабливаются» сами.

Числа в тексте: табуляры и «старые»

Цифровые «старые» (вниз-вверх) красивы в тексте; «табулярные» — в таблицах (не скачут). font-variant-numeric управляет «набором» цифр. «Ценник» на таблицу — tabular-nums: «колонки» ровные.

💡
«Список цен» — font-variant-numeric: tabular-nums: «десятки» не «пляшут».

Почему база 16px: история и польза

16px — «классическая» база браузеров: «историческая» точка отсчёта. rem «по умолчанию» понятен — «ноль настроек» для старта. Изменения базы — «осознанный» ход, а не «фантазия».

💡
«Знай базу»: 16px — простота и «предсказуемость»; особенное — «по правилам» переменных.

Стандартный текст: разумный дефолт

«Дефолт» текста: 16–18px, line-height 1.5, sans-serif, тёмно-серый, ширина ~65ch. Начинайте «от» дефолта, «заостряйте» — от дизайна. Скучно? Зато «читаемо». Красота — «поверх» здоровой базы.

💡
«Скучный» дефолт — «надёжность»; стиль — «личность поверх каркаса», не «вместо».

Умное подчёркивание: стиль и цвет

text-decoration-style: dashed/wavy + text-decoration-color — «личность» линии. «Зелёная волнистая» — «редакторская» метка. Подчёркивание ссылок «по месту» — читаемость. Не «пёстрые» линии «в серой зоне».

💡
«Пунктирная» ссылка-«черновик» — отделение «живого» от «служебного» на странице.

Зачёркивание: смысл и аккуратность

line-through — «перечёркнуто»: старая цена, «отменено». Тонкая линия «незаметно»; смысл «важен». Зачёркивать «всем подряд» — «бардак» в наборе. Применение «точечно» — «редакторская» гигиена.

💡
«Старая цена» — line-through + новая рядом: «классика» акций, «честная» информация.

Подчёркивание по наведению

Ссылки «в спокойствии» без линии, при hover — появляется: «чистый» текст, ясный «реагируй». Реализация: border-bottom или text-decoration on hover. «Не скрывайте» полностью: «ссылочность» должна «жить».

💡
border-bottom с padding-«воздухом» — «мягкое» подчёркивание; text-decoration — «близко к тексту».

Тень текста: мягкие приёмы

text-shadow: сдвиг размытие цвет — «лёгкая» глубина. Тень-«силуэт» под крупным заголовком — «плакат». Не «буква в буче»: несколько теней — «зрелость», а не «муть».

💡
«Тень для читаемости на фото» — 0 2px 6px black: «подхват» букв над фоном.

Обводка текста: графика, не «текст»

«Буква с обводкой» (-webkit-text-stroke) — «плакатный» стиль. Для «логотипов» и «баннеров»; «мелкий» текст с обводкой — «грязно». Приём «зрелищный», но «экономный»: избранные места.

💡
«Холодный» заголовок: прозрачный текст + обводка — «контурный» силуэт логотипа.

Свечение текста: неон с осторожностью

Свечение — «множественные» тени одного цвета вокруг букв. Неон «клуба», «заставки» — «вечеринка». Для «интерфейсов» — редко: «глазам» не привыкнуть. «Доза» = «дело», «перебор» = «боль».

💡
Свечение — «0 0 8px» акцентных точек: «логотип региона», а не «весь абзац».

Русский «курсив»: стиль и полукурсив

Курсив кириллицы «отличен» от латинского: «наклон» букв особый. Некоторые шрифты «дают» «полукривь» русича. «Настоящий» курсив — в «лицензионной» семье. «Наклон-шейкер» (fake italic) — «эконом-заменитель».

💡
«Свой» русский курсив — у качественных гарнитур: «уклон» букв «родной», не «хим».

Сущности типографики: быстрый набор

« » — – …   © — «шляпа» сущностей для «русского набора». Кодовые «копирайтинги» — «прошита» в разметку. Редактор с «автозаменой» — «скорость» без «ошибок».

💡
«—» — длинное тире: «настоящий» русский «—», а не «-». «Кавычки» — ««»».

Сервисы автотипографики

«Типограф» Юрія Романова и его наследники — «правят» текст массово: кавычки, тире, пробелы. Строка «на вход», «вычистка» «на выход». Для больших «редакций» — «выигрыш» времени.

💡
Прогнал «готовый» текст — «взял» «чистое»: «машина» не заменит «глаз», но «спасает».

Умные кавычки в редакторе

Редакторы «автоподменяют» «“слово”» на ««слово»» для русского. Настройка «автотипографика» — «стандарт» MS Word и его «сёстры». Проверяйте «итог»: «умное» заменяет «все» виды «кавычек».

💡
«Включил» автокавычки — «убрал» дефисы в тире» «частично»: доконтролируйте «вручную».

Практика: подключение Google Fonts

Google Fonts: выберите пару, скопируйте <link> в head, примените font-family. Два веса + «запасной» стек. Быстрый результат — «новое лицо» страницы за пять минут.

<link rel="preconnect" href="https://fonts.googleapis.com">
💡
Две гарнитуры «максимум» на старт: системная + «характерная». Третья — «боль» и «вес».

Практика: страница-типографика

Соберите «витрину»: H1–H4, абзацы, списки, цитату, ссылки — в стилях. Покажите «масштаб» лестницей. «Типографская» страница — «шаблон» оформления будущих контентов.

💡
«Гайд текста» в одном файле — «референс» для всего проекта: верно один раз — «везде».

Практика: размерная лестница на макете

Возьмите макет «карточки» и постройте «лестницу» заголовков текста. Ступени 1.25: от «базы» к «герою». Каждый размер — «из шкалы», не «случайный». «Лестница» — «системное» око «текста».

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

Практика: разрядка заголовка

letter-spacing на «капсе» или «вывеске» — «официальность». Подберите «дозу»: 2–6px для крупных заголовков. Сочетайте с «чертой» под текстом. Разрядка — «микроприём» «величия».

💡
«ВЫВЕСКА» с разрядкой + тонкая линия — «титры» без «золота» и «акцидентов».

Практика: цитата в стилях

Оформите blockquote: отступ, рамка слева, курсив или «гарнитура»-акцент, автор-подпись. «Цитата» должна «глаза» «вести». Плюс тонкая типографика внутри: «кавычки» сущностями.

💡
«Рамка слева + курсив + отступ» — «книжный» вид цитаты без «рисунка».

Практика: газетная колонка

Попробуйте «газетный» набор: узкая колонка, сериф, выключка по левому краю. Пара: заголовок сериф, «шапка» — разрядка капсом. «Газетный» блок — «классика» придаёт «характер» блогу.

💡
«Узкая серифная» колонка 55–65зн — «газетный» ритм чтения: «нная» скорость.

Практика: тёмный интерфейс на белом

«Тёмная» тема: шрифт #e8e8e8 на #1a1a1a, аккуратный контраст. Проверьте a11y: 4.5:1 — норма. «Тёмный» текст «не кипель» чёрный: «природнее» слепящего. «Тёмные» данные «выглядят» «премиум».

💡
«Чистый чёрный» режет; «близко к чёрному» + светлый серый — «яхта» тёмной темы.

Практика: веб-письмо текстом

«Письмо» — «адрес», «глаза», «тело», «подпись»: все «текстом» и «структурой». address, p, time, footer. «Письмо» — «набор» понятий из прошлого урока в «типографической» обёртке.

💡
«Письмо» тренирует: семантику «заголовков», «строк», «отступов» — сразу «красиво и осмысленно».

Практика: стили ссылок в тексте

Ссылки в абзацах: цвет-акцент, подчёркивание-«лоток», hover — «утолщение», visited — «нейтрально». Отличие «контентных» ссылок от «меню». Практика «ссылочной типографики» — «польза» текстов.

💡
«В тексте»: подчёркивание + цвет-«чуть синий» — «видимая» ссылка без «крика».

Практика: логотип текстом

«Логотип» текстом: слово (или две буквы), вес 800, letter-spacing, «аккуратный» регистр. Плюс «начертание» рядом. «Текстовый» знак — «быстрый» бренд для «учебного» проекта.

💡
«Логотип» — «жирный + разрядка» + акцент-цвет: «архетип» многих «стартап-брендов».

Композиция текстового блока

Текстовый блок «живёт» по композиции: заголовок, лид, тело, «стройный» конец. «Ритм» — равные интервалы «между» смыслами. «Око» считывает «структуру блока» за мгновение — «делайте» её явной.

💡
«Лид» — короткий абзац «под» заголовком: «сжатое» содержание, «короткая» дорога к тексту.

Один акцент на абзац

«Акцент» (цвет, курсив, жир) — «один» cмысл на абзац: «здесь» важно «это». «Перебор» акцентов — «нет» акцентов. «Типографская» экономия — «сильнее» «типографского» богатства.

💡
«Выделено» одно слово в абзаце «звучит»; «пять» слов — «шум». «Экономите» выделение.

Правило двух шрифтов

Два «лица» на страницу: «заголовочное» + «текстовое» — «дисциплина». Третий — «акцидентны» акценты (цифры, лейблы). Два — «хорошо», один — «строго», три — «зоопарк». «Пара» — «баланс» настройки.

💡
«Сщрифт плюс гротеск» — «читабельная» пара на 90% «прод-сайтов»: «лицо» без «карнавала».

Пустота вокруг текста

Пустота «дышит»: поля, межстрочье, «белый» фон. Скученный текст «тяжёл»; «воздух» «ведёт» глаз. Добавьте «пустоты» — сложности «уходят». «Дизайн» — «половина пустого», «полем» текста.

💡
«Увеличили» поля и line-height 1.6 — текст «перестал» быть «стеной» («и психофон» — польза).

Заголовок и подзаголовок: отношение

Подзаголовок «мельче» и «спокойнее» заголовка: «1:0.7» размера примерно. Он «расшифровывает» тему «строкой». Связка «заголовок+подзаголовок» — «одна» единица «чтения».

💡
Заголовок «32», подзаголовок «20» — «родственные» ступени: «ясный» дуэт «тем».

Характер гарнитуры заголовков

«Характер» шрифта заголовков — «тональность» сайта: «жёсткий» у новостей, «мягкий» у «комфорта». «Причудливый» — «бренд-история». Выбирайте «лицо» под «смысл»: «заголовок» — самое «читаемое» «окно».

💡
«Скамейка» vs «квадратный» — это «губы» бренда: заголовок — «голос» сайта.

Числа и знаки в строке

«Один» — «в» контексте мер: «5 кг», «№ 7»; «%» и «°» — «неразрывно» с цифрой. Числа «в тексте» — «свои» шрифтовые «цифры». «Дроби» и «проценты» — по «стандартам» набора.

💡
«Цена 9.99» — «по-русски» с «запятой» и «единицей»: 9,99 ₽ — «единое» чтение.

Скобки и кавычки в наборе

«Правильные» пары: „лапки" внутри «ёлочек», скобки — «без» лишних пробелов. «Вложенность» знаков — «по» типографике. «Умные» редакторы «ставят» «правильно» — «проверяйте» сам.

💡
«Вторые» кавычки — „лапки', «первый» — «ёлочки»: иерархия «знаков» — «по-русски».

Висячая пунктуация: тонкость

«Висячая» пунктуация — «знак» за краем выравнивания: «точка», «кавычка», «тире» — «вне» блока. Мелочь, но «ровность» краёв «удерживает» взгляд. «Обработка» текста «автоматически» — «профессиональный» навык.

💡
«Строка» начинается «» или «—» — «повис» знак: «перенесите» «слово» — «край» «чист».

Матрица примеров: три начертания, три кегля

Соберите «таблицу»: три начертания (regular, bold, italic) на трёх кеглях (18/24/36). Смотрите «ритм» и «сочетание». «Матрица» — «глаза» для «выбора» шрифтов дальше.

💡
«Матрица» выявляет: какой «курсив» у шрифта? Какие «веса» «завезены»? «Выбирайте глубже».

Типографика и доступность: размеры

Доступность типографике: текст «не мельчит», «масштабируем», «контрастен». Основной текст 16px+, интервал 1.4–1.6, возможность «только шрифта» зумить. «Хорошая» типографика «здорова» — «дизайн» просто следует.

💡
«Крупнее + воздух» — почти «всегда» доступнее: «благодатный» трюк без JS.

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

«Зафиксированные» px «не масштабируют» текст в «только-текстовом» зумме. rem «следует» настройкам — «текстовый» режим работает. «Отказ» от «жёстких» размеров — «добро» пользователям.

💡
«Текстовым» зумом сменили базу — rem «пересобрал» размеры: «отзывчивая» типографика.

Дефолтные шрифты браузеров

Браузеры «по умолчанию»: Times (сериф), Arial/Helvetica (sans), «мышек» Courier. Дефолт «меняется» платформой. «Bеgrime» с «системным» стеком — «стабильная» база для «своих» правок.

💡
«Default» — «бездизайн», а «правило»: «явно задавайте» семью — не живите «случайностью».

Метрики шрифта: основание и выносные

Каждая буква «сидит» на основе (baseline); «хвосты» (g, p) уходят «вниз», «высокие» (б, к) — «вверх». Из этих «мер» — line-height и «пары». «Понимание метрик» — «глубина» выравниваний.

💡
«Картинка в строке» «скачет» — она привязана к baseline: vertical-align ставит «по линии».

Кернинг и лигатуры в вебе

Кернинг — «пара» букв «сближается» («Л» и «А»); лигатуры — «слияние» знаков («fi»). В вебе всё «автоматически» у шрифтов с фичами. font-feature-settings — «включатели» лигатур при «своём» наборе.

💡
«Лигатуры» — «красота» серифов; на «моно» — «стандартно» без них. «Включайте» по «вкусу».

Малые заглавные: font-variant small-caps

small-caps — «капс» уменьшенного «ростка»: «благородные» аббревиатуры. Внимание: «настоящие» малые «капсы» у шрифтов — «не все». «Используйте» для «имен», «логотипов», «примечаний».

💡
small-caps для «подзаголовков-скупов» — «интеллигентный» тон без «крика капса».

Загрузка шрифтов: font-display

font-display: swap — текст показывается «запасным» шрифтом, «затем» — настоящим. block — «молчание» до загрузки. swap — «быстрый» текст сегодня. «Выбор» поддерживает «скорость» восприятия.

💡
swap «блеск» «засветки» — «лучше», чем «пустота»: видимый текст — «ценность» мгновенной.

Инструменты подбора пары шрифтов

Сервисы пар (Fontpair, Google Fonts-подбор) — «готовые» паниры «гарнитур». «Поиск»: «по стилю», «по настроению». Не «мучайтесь»: «пара» — «проверенная» «формула», «не» копипаст «ссохшейся» идеи.

💡
«Погуглите в паре» — «половина» выбора; «проверьте» «кириллицу» — «своя» гарнитура «полная».

Проверка типографики на глаз

«Посмотр» — «отдалённо» (90 см) и «вблизи» (скан-глаз): «дыры» в строках, «рваные» края, «скаканье» строк. «Скриншоты» «в деле» — «картина» «на экранах». «Глаз» — «инструмент №1»; «инструменты» — «№2».

💡
«Прищурься» на абзац: «ритм» «плотности» и «промежутков» «виден» без «чтения».

Дальше от буквы: компоновка и сетки

Типографика — «один слой» текста; «сетка» и «блоки» — «следующие». Урок 5 — «селекторы» и «специфичность»: «управление» «тем, кого стилизовать». «Текст» «дружит» с «раскладкой» — «композиция смысла».

💡
«Слои»: смысл → вид текста → вид блока. «Двигайтесь» по «слоям», не «прыгайте».

Итоги урока 4: буква под контролем

Урок типографики «дал» контроль: шрифты, кегли, интервалы, акценты. Текст «заиграл» уровнем и «воздухом». Следующий шаг — «полное» «пятно» текста в раскладке страницы.

💡
«Типографика» — «тишина» типографа: меньше «мышц», больше «звука». «Скромность» «торжествует».

Частые ошибки типографики

Грехи: «всё» — «курсивом», «все» кегли — «случайные», «жирность» «везде», «узкий» text, «мельчайшие» подписи «принта». «Список» грехов — «противосила» «типографике»: «держите» «около» «файла стилей».

💡
«Десять» шрифтов — «магазин», «два» — «выбор»: «ограничение» даёт «стиль».

Закрепление: единицы на пальцах

«Перескажите»: px — «точка», rem — «корень», em — «родитель». «Переведите» 24px, 12px, 48px «в» rem при базе 16px. «Устный» перевод — «мускулатура» вёрстки: «мгновенная» «память» единиц.

💡
24→1.5, 12→0.75, 48→3: «тройка» шифров — «считайте» «в уме», «сверяйте» «в голове».

Домашнее задание: редакторский макет

Сверстайте «редакторскую» страницу: «передовая» статья с «лидом», «выноской», «подписью» фото. «Газетные» приёмы: «сериф», «висячая» пунктуация, «подписи». «Статья» — «итоговый» «проект» урока текста.

💡
«Статья» «соберёт» весь урок: размеры, линии, отступы, «цвета» в одних «полях».

Дальше: селекторы и специфичность

Урок 5 — «глубже» CSS: селекторы, каскад, специфичность, «пеер»-комбинаторы. «Точечный» «контроль», «не» «сплошной» «нажим» «на теги». «Типографика» «помнит» селекторы: «прицел» — «искусство».

💡
«Варunируйте» «точечно»: «не» «влом» всему «тексту», а «избранным» «абзацам».

Типографика будущего: что развивается

«Вариативные» «шрифты», «color»-шрифты, «контекстуальные» «моменты». «Отзывчивая» «увеличенность» «текста» по «запросам». «Экран» «меняет» «книгу» — «навыки» «базы» «остаются». «Следите» «за» «фичами» «CSS».

💡
«Базовые» «принципы» 500 лет: «читаемость», «иерархия», «ритм». «Технологии» — «прислуга» «принципов».

Разбор хорошей страницы

«Откройте» любимый сайт и «сострипайте» его «типографику»: шрифты (DevTools), размеры, «стройность». «Запишите» «открытия». «Разбор» «чужих» — «словарный» «запас» «своих» решений.

💡
«Инспектор» «покажет» font-family «чужака»: «почерк» «профессионалов» — «учебник» «без» уроков.

Стандарт и практика: микрогид

«Коротко»: «база» — 16–18px; «строка» — ≤70зн; «воздух» — 1.5; «шрифтов» — два; «акцентов» — один. «Микрогид» «на стену» — «мгновенное» «напоминание». «Правила» «живут» «в голове» — «вёрстка» «быстрее».

💡
«Стена-шпаргалка» — «30%» «правок» «ушло»: «рывком» «к качеству» — «формально».

Текст как интерфейс

«Текст» — «везде» интерфейса: кнопки, метки, ошибки, подтверждения. «Типографика» «интерфейса» — «краткость» «и» «ясность». «Читающийся» «текст» — «удобный» «интерфейс». «Слово» — «элемент» «дизайна» «тоже».

💡
«Кнопка-текст» «подписанная» «глаголом» («Сохранить») — «интерфейс» «честный» «и» «понятный».

Заключение урока 4: уважение к букве

«Типографика» — «это» «уважение» к «читателю»: «не» «заставлять» «ковырять» «буквы». «Хороший» «книжник» — «первый» «любимый» «аргумент» «продукта». «Урок» «усвоен» — «буква» «ухожена», «смысл» «уважен».

💡
«Уважение» «букве» — «внимание» «человеку»; «типографика» — «голос» «заботы» «о» «глазах».

Лента уроков «с» фильтром-«неделя»: <ul>+<li> «в» вежливом <section aria-label>

<section aria-label="Лента уроков"><ul>… — «недели» курса. Практика: дашборд ученика. Скринридер «найдёт» ориентир. Проверка: пункты — уроки. Доступность «ленты».

💡
Каждый <li>: <article><h3>Урок 1.1</h3>…

Плашка «домашнее задание»: <aside> + <h2> + кнопка «скачать»

<aside aria-label="Домашнее задание"> — «побочный» блок «к» уроку. Практика: задание. Скринридер «прочтёт» ориентир. Проверка: <a download>. Доступность «заданий».

💡
aria-label «имя» aside — «Домашнее задание к уроку 4».

Число «нерешённых» рядом «с» прогрессом: <span> + aria-hidden «и» text в sr-only

Прогресс: <progress> + <span class="sr-only">2 из 8 заданий</span> + декоративный «2/8». Скринридер «прочтёт». Проверка: «осмысленно». Доступность «счёта».

💡
«Не» «плюсуйте» aria-label «к» progress «с» текстом.

Карточка-«результат» экзамена: <dl> + <dt>Оценка</dt> + бейдж «−0,5»

<dl><dt>Ваш балл</dt><dd>87</dd>… — «ключ-значение». Практика: сессия. Скринридер «прочтёт». Проверка: пара. Доступность «оценок».

💡
<dd> «с» aria-label «Потребовалось попыток: 2» отдельно от «оценки».

Секция «сдают работы»: <input type="file" multiple> + label «загрузить»

<label for="hw">Загрузить домашнее задание</label><input type="file" id="hw" multiple>. Практика: портал. Скринридер «прочтёт» label. Проверка: имя. Доступность «загрузки».

💡
До «акцентирования» «виз-правки» — accept=".pdf,.zip".

Таблица «оценок» «по» урокам: <caption> + th scope + tfoot «итог»

<table><caption>Успеваемость</caption><tr><th scope="col">Урок</th>… «5 4 5». Практика: журнал. Скринридер «прочтёт». Проверка: итог. Доступность «журнала».

💡
<td> «5/5» — «без» CSS-задачи; «средний» в tfoot.

Кнопка «открыть ответ» в FAQ: <details><summary aria-expanded? — сам>

<details> — summary раскрывает; state сам. Практика: вопросы «по» оплате. Скринридер «управляет». Проверка: фокус. Доступность «FAQ».

💡
«Не» «дублируйте» aria-expanded на summary — «браузер» «сам».

Мини-«слider» цены «к» уроку: <input type="range"> + <output> ± aria-live

Слайдер «стоимость курса»: <input type="range" aria-label="Стоимость"> + <output aria-live="polite">… ₽. Скринридер «услышит». Проверка: границы. Доступность «цены».

💡
aria-valuetext="15 000 ₽" — «тысячи» читаются.

Поле «промокод» «с» кнопкой «применить»: label + input + button

<label>Промокод</label><input><button aria-label="Применить промокод">OK</button>. Практика: корзина. Скринридер «свяжет». Проверка: имя у кнопки. Доступность «промо».

💡
aria-live на «Применён: −10%».

Чекбокс «запомнить» «в» курсе: label «не» внутри input

<label><input type="checkbox"> Запомнить прогресс</label>. Практика: обучение. Скринридер «прочтёт». Проверка: имя. Доступность «прогресса».

💡
label «оборачивает» — «клик» «по» тексту «вбивает» галочку.

Ссылка «на» дополнительный материал: <a rel="nofollow"? — нет, просто ссылка

Ссылка «на» внешний гайд: <a href="https://…" rel="noopener">Гайд по CSS Grid</a>. Практика: урок. Скринридер «прочтёт» имя. Проверка: осмысленно. Доступность «материалов».

💡
«Не» «слепые» «здесь» — «имя» «тематично».

Заголовок «чему научитесь»: <h2> + <ul> с галочками aria

<h2>Что вы освоите</h2><ul><li>✓ «…». Практика: страница курса. Скринридер «прочтёт». Проверка: список. Доступность «цели».

💡
«✓» в li — декоративно; писать aria-label не надо «для» маркера.

Кнопка «повторить тест»: aria-label + aria-live «Результаты сброшены»

<button aria-label="Повторить тест" aria-live="polite">↻</button>. Практика: квиз. Скринридер «прочтёт». Проверка: имя. Доступность «повтора».

💡
«Сброс» — aria-live polite «сообщит».

Псевдо «лучший ученик»: <strong> «+» aria-label «не» нужен — текст

<strong>Лидер недели</strong> + имя. Практика: рейтинг. Скринридер «прочтёт». Проверка: акцент. Доступность «лидеров».

💡
<strong> — «важность», «не» «украшение».

Степпер «Профиль → Курс → Оплата»: <ol> + aria-current="step"

<ol><li aria-current="step">Курс</li>… — «шаги». Практика: мастер. Скринридер «прочтёт» позицию. Проверка: текущий. Доступность «степпера».

💡
<li aria-current="step"> — «озвучит» «текущий шаг: Курс».

Деплой «шапки» курса: <header> «внутри» body, «не» «вложен» «в» section «с» ею «ж» своей nav

<header> с логотипом + <nav> «Уроки/Задания/Сертификат» + <button>Профиль. Практика: учебник. Скринридер «найдёт» header-ориентир. Проверка: nav «везде» одна. Доступность «шапки».

💡
Логотип — <a href="/"> с svg + <span> текст «Название школы».

Имя «и» гарантия «записи»: <input aria-label="Порядковый номер заявки"> у «авто-номера»

<input aria-label="Номер заявки" value="№237" readonly>. Практика: регистрация на вебинар. Скринридер «прочтёт». Проверка: значок. Доступность «номера».

💡
readonly + aria-readonly? — «нет», readonly «хватает».

Ссылка «на» учебник «без» встроенного заголовка: <a>h2</a> «с» осмысленным «именем» «через» aria-labelledby на себя

<h2 id="book-t">…</h2> — ссылка «внутри» «имя»: <a href="#ch1" aria-labelledby="book-t">→</a>. Практика: витрина. Скринридер. Проверка: имя. Доступность «книги».

💡
«Если» «вся» карточка — ссылка: «не» «плодите» «второй» <a aria-labelledby>.

Кнопка «проверить решение»: <button type="submit"> «плюс» <output aria-live="polite"> результат

Практика: задачник. Скринридер «прочтёт» «Верно/Неверно». Проверка: имя кнопки. Доступность «проверки».

💡
<output> — «семантический» «результат»; aria-live — его «озвучка».

Заголовок «вкладки» «Уроки» как <h2> + «ниже» <nav> «с» меткой «Разделы глаза» — «не» «заголовок»

<h2>Уроки</h2> + <nav aria-label="Меню уроков">… Скринридер. Проверка: «название» vs «заголовок». Доступность «вкладок».

💡
aria-label на nav — это «имя» ориентира, не «заголовок» — «не» «путайте».

Чекбокс «Показать все вопросы»: <fieldset>+legend — «над» «массивом» переключателей «ответов»

<fieldset><legend>Фильтр вопросов</legend> + checkbox «Только нерешённые». Практика. Скринридер. Проверка. Доступность.

💡
legend — «короткая» «тема» группы.

Карусель «методов» обучения: <section aria-roledescription="карусель" aria-label="Способы"> + пауза

<button aria-label="Пауза">⏸</button>. Практика. Скринридер. Проверка. Доступность.

💡
aria-roledescription переопределяет роль: «карусель» «понятна».

Цена со «скидкой» «в» карточке: <p><del>5900</del> <ins>3900</ins> ₽ — «не» лая, но «честно»

Скринридер «прочтёт» оба. Практика: акция. Проверка: aria-label «не» нужен. Доступность «цены».

💡
«aria-hidden» «на» <del> — «нет»: скринридер «должен» знать «старую» «и» новую.

Поле «даты начала» «в» форме «записи»: <input type="date" aria-label="Дата начала обучения">

Скринридер. Практика. Проверка. Доступность «даты».

💡
aria-valuenow? — «не» «для» date; «нативная» семантика.

«Ссылка-подпись» таблицы «итогов»: <caption> + aria-hidden «для» «декоративной» линии «не» нужно «здесь»

<caption>Баллы за модуль</caption>. Практика. Скринридер. Проверка. Доступность.

💡
aria-hidden «на» caption «не» «вешайте» — «подпись» «значима».

Заголовок «комментария» «в» деревяшке: <h3> «ж» не «повторять» имя автора «в» aria-label...

«Имя» автора в комментарии — <h3>? «Нет»: «это» «не» «заголовок». Практика: ветка. Скринридер. Проверка. Доступность «ника».

💡
<p><strong>Иван</strong> — «имя»; h3 «не» нужен.

Инфо-плашка «Курс в записи» у «блока» доступа: <aside aria-label="Важно"> + <p aria-live="polite">?

<aside aria-label="Информация"> «Курс «в» записи, начнёте…». Скринридер. Практика. Проверка. Доступность.

💡
aria-live polite «у» появления плашки (JS) — «озвучится».

Таблица «успеваемости» + <tfoot> «итог»: «aria-label» «всего набранных баллов»

<tfoot><tr><th scope="row">Итого</th><td>98</td>. Скринридер. Практика. Проверка. Доступность.

💡
aria-label на <table> — «если» caption «не» «виден» (редко).

Заголовок-«раз» для блока «Ваши достижения»: h2 + ul «галочек» — «смысл» «без» декораций

h2 «Ваши достижения» + ul «icon-check». Скринридер. Практика: сертификаты. Проверка: «галочка» — aria-hidden. Доступность.

💡
«✓» на <span aria-hidden> + «слова» «реального» достижения «в» li.

Link-пагинация «в» ленте «уроков» «с» rel="prev next" — «и» aria-label «по»-русски

<link rel="prev"> <link rel="next"> «в» head. Практика: серия. Скринридер «не» о head-link, «но» «движение» «по» серии свободно. Проверка: имена. Доступность.

💡
<link> — «машине»; «людям» — «видимые» стрелки «назад/вперёд».

Заголовок 1: структура заголовка и h1 справа от лупы со связкой