- Модуль 1: Основы HTML-разметки
- Модуль 2: Форматирование текста
- Жирный текст (b и strong).
- Курсив (i и em).
- Подчеркивание и перечеркивание (u, s, del, ins).
- Верхний и нижний индекс (sup, sub).
- Цитаты и блоки цитат (q, blockquote, cite).
- Код и предварительно форматированный текст (code, pre).
- Аббревиатуры и определения (abbr, dfn).
- Технические элементы (kbd, samp, var).
- Двунаправленный текст (bdi, bdo).
- Модуль 3: Ссылки и навигация
- Базовые ссылки (a href).
- Внутренние ссылки и якоря.
- Относительные и абсолютные пути.
- Атрибуты target (_blank, _self).
- Заголовки ссылок (title).
- Ссылки на email и телефон.
- Скачивание файлов через ссылки (download).
- Атрибуты rel (nofollow, noreferrer).
- Создание кнопок-ссылок.
- Hash-навигация между разделами.
- URI-схемы (sms:, geo:).
- Модуль 4: Изображения
- Добавление базовых изображений (img).
- Атрибуты изображений (alt, width, height).
- Изображения-ссылки.
- Карты изображений (map, area).
- Picture элемент и множественные источники.
- Адаптивные изображения (srcset, sizes).
- Ленивая загрузка изображений (loading='lazy').
- Форматы изображений и их применение (JPEG, PNG, WebP, SVG).
- SV-анимация через элемент.
- Интерактивные SVG-карты.
- Модуль 5: Списки
- Неупорядоченные списки (ul, li).
- Упорядоченные списки (ol, li) и их атрибуты.
- Типы нумерации (decimal, alpha, roman).
- Вложенные списки и иерархия.
- Списки определений (dl, dt, dd).
- Создание навигационного меню из списка.
- Кастомные маркеры и стилизация списков.
- Атрибуты start и reversed в OL.
- Горизонтальные списки через CSS.
- Модуль 6: Таблицы
- Базовая структура таблицы (table, tr, td).
- Заголовки таблиц (th) и атрибуты scope.
- Объединение строк и столбцов (rowspan, colspan).
- Группировка ячеек (thead, tbody, tfoot).
- Заголовок и подпись таблицы (caption).
- Группировка столбцов (colgroup, col).
- Стилизация таблиц и чередующиеся строки.
- Фиксированные заголовки таблиц.
- Модуль 7: Формы и элементы ввода
- Создание базовой формы (form).
- Атрибуты формы (action, method, enctype).
- Текстовые поля (input type='text').
- Поля ввода пароля (input type='password').
- Флажки и чекбоксы (input type='checkbox').
- Радиокнопки (input type='radio').
- Кнопки (button, input type='submit', input type='reset').
- Выпадающие списки (select, option, optgroup).
- Многострочные поля ввода (textarea).
- Группировка элементов формы (fieldset, legend).
- Подписи к полям (label).
- HTML5 типы полей ( url, number ).
- Поля выбора даты и времени (date, time).
- Слайдеры и диапазоны (input type='range').
- Выбор цвета (input type='color').
- Поля с автозаполнением (datalist).
- Атрибуты полей (placeholder, autocomplete).
- Валидация форм (required, pattern, min, max).
- Загрузка файлов (input type='file').
- Скрытые поля (input type='hidden').
- Элемент output для вычислений.
- Модуль 8: Семантические элементы HTML5
- Шапка сайта (header).
- Основная навигация (nav).
- Основной контент (main).
- Боковая панель (aside).
- Подвал сайта (footer).
- Статьи и самодостаточный контент (article).
- Тематические разделы (section).
- Фигуры и подписи (figure, figcaption).
- Время и даты (time).
- Разворачиваемые блоки (details, summary).
- Прогресс и метрики (progress, meter).
- Диалоговые окна (dialog).
- Когда использовать div, а когда семантические элементы.
- Модуль 9: Аудио и видео
- Модуль 10: Метаданные и head
- Структура head элемента.
- Задание заголовка страницы (title).
- Кодировка и язык документа (meta charset, lang).
- Мета-описание и ключевые слова.
- Настройка viewport для мобильных устройств.
- Добавление favicon.
- Подключение внешних CSS (link rel='stylesheet').
- Подключение скриптов (script).
- Open Graph метаданные для соц.сетей.
- Метатеги для SEO и индексации.
- Предварительная загрузка ресурсов (preload, prefetch).
- PWA манифест и метатеги.
- Модуль 11: Фреймы и встраивание контента
- Модуль 12: SVG и Canvas
- Модуль 13: HTML и доступность
- Модуль 14: HTML для адаптивного веба
- Модуль 15: Практические проекты
Базовая таблица с фиксированной шапкой
Соберите таблицу с прокручиваемым контейнером и фиксированной шапкой. Заголовок с названиями колонок должен оставаться на месте при вертикальной прокрутке, а строки таблицы прокручиваться внутри рамки. Структура должна включать отдельный раздел для заголовков и раздел для данных.
*, *::before, *::after { box-sizing: border-box; }
.tbl-wrap { max-height: 220px; overflow: auto; border: 1px solid #e0e0e0; border-radius: 6px; }
.tbl { width: 100%; border-collapse: collapse; font-family: system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif; }
.tbl thead th { position: sticky; top: 0; background: #ffffff; z-index: 2; }
.tbl th, .tbl td { padding: 8px 10px; border-bottom: 1px solid #eee; font-size: 14px; text-align: left; }
.tbl thead th { border-bottom: 1px solid #ccc; }
<div class="input1">
<input2 class="input3">
<input4>
<input5>
<input6>Товар</input6>
<input6>Цена</input6>
<input6>Кол-во</input6>
<input6>Итого</input6>
</input5>
</input4>
<input7>
<tr>
<td>Кофе</td>
<td>350 ₽</td>
<td>2</td>
<td>700 ₽</td>
</tr>
<tr>
<td>Чай</td>
<td>180 ₽</td>
<td>3</td>
<td>540 ₽</td>
</tr>
<tr>
<td>Сок</td>
<td>120 ₽</td>
<td>4</td>
<td>480 ₽</td>
</tr>
<tr>
<td>Вода</td>
<td>70 ₽</td>
<td>5</td>
<td>350 ₽</td>
</tr>
<tr>
<td>Молоко</td>
<td>95 ₽</td>
<td>2</td>
<td>190 ₽</td>
</tr>
<tr>
<td>Какао</td>
<td>210 ₽</td>
<td>1</td>
<td>210 ₽</td>
</tr>
<tr>
<td>Лимонад</td>
<td>130 ₽</td>
<td>3</td>
<td>390 ₽</td>
</tr>
<tr>
<td>Квас</td>
<td>115 ₽</td>
<td>2</td>
<td>230 ₽</td>
</tr>
</input7>
</input2>
</div>
Добавьте атрибуты scope для колонок
Семантически опишите заголовки колонок так, чтобы они были корректно интерпретированы технологиями доступности. Шапка остаётся фиксированной при прокрутке, а каждая заголовочная ячейка должна явно указывать, что относится к столбцу.
.tbl-wrap { max-height: 220px; overflow: auto; border: 1px solid #ddd; border-radius: 6px; }
.tbl { width: 100%; border-collapse: collapse; }
.tbl thead th { position: sticky; top: 0; background: #fff; z-index: 2; }
.tbl th, .tbl td { padding: 8px 10px; border-bottom: 1px solid #eee; font-size: 14px; text-align: left; }
.tbl thead th { border-bottom: 1px solid #ccc; }
<div class="tbl-wrap">
<table class="tbl">
<thead>
<tr>
<th input1="input2">Товар</th>
<th input3="input4">Цена</th>
<th input5="input6">Кол-во</th>
<th input7="input8">Итого</th>
</tr>
</thead>
<tbody>
<tr><td>Кофе</td><td>350 ₽</td><td>2</td><td>700 ₽</td></tr>
<tr><td>Чай</td><td>180 ₽</td><td>3</td><td>540 ₽</td></tr>
<tr><td>Сок</td><td>120 ₽</td><td>4</td><td>480 ₽</td></tr>
<tr><td>Вода</td><td>70 ₽</td><td>5</td><td>350 ₽</td></tr>
</tbody>
</table>
</div>
Перенесите заголовки в отдельный thead
Приведите разметку к правильной структуре таблицы: заголовки должны быть отделены в специальную секцию, а данные — в свою. После исправления шапка должна фиксироваться при прокрутке благодаря готовому стилю.
.scrollarea { max-height: 230px; overflow: auto; border: 1px solid #ddd; border-radius: 6px; }
.data-table { width: 100%; border-collapse: collapse; }
.data-table thead th { position: sticky; top: 0; background: #fff; z-index: 2; }
.data-table th, .data-table td { padding: 8px 10px; border-bottom: 1px solid #eee; font-size: 14px; }
.data-table thead th { border-bottom: 1px solid #ccc; text-align: left; }
<div class="scrollarea">
<table class="data-table">
<input1>
<tr>
<input2>Город</input2>
<input2>Население</input2>
</tr>
</input1>
<input3>
<tr><td>Москва</td><td>13 104 177</td></tr>
<tr><td>Санкт-Петербург</td><td>5 603 797</td></tr>
<tr><td>Новосибирск</td><td>1 635 364</td></tr>
<tr><td>Екатеринбург</td><td>1 550 425</td></tr>
<tr><td>Казань</td><td>1 308 660</td></tr>
<tr><td>Нижний Новгород</td><td>1 222 796</td></tr>
</input3>
</table>
</div>
Сделайте левый столбец фиксированным
Кроме зафиксированной шапки закрепите также первый столбец с названиями элементов. Он должен оставаться видимым при горизонтальной и вертикальной прокрутке контейнера.
.scroll { max-height: 240px; overflow: auto; border: 1px solid #ddd; border-radius: 6px; }
.tbl { width: 100%; border-collapse: collapse; min-width: 480px; }
.tbl th, .tbl td { padding: 8px; border-bottom: 1px solid #eee; font-size: 14px; }
.tbl thead th { position: sticky; top: 0; background: #fff; z-index: 3; text-align: left; }
.tbl tbody th[scope="row"] { position: sticky; left: 0; background: #fff; z-index: 2; text-align: left; }
<div class="scroll">
<table class="tbl">
<thead>
<tr>
<th>Код</th>
<th>Наименование</th>
<th>Остаток</th>
</tr>
</thead>
<tbody>
<tr>
<input1 input2="input3">A101</input1>
<td>Смартфон</td>
<td>56</td>
</tr>
<tr>
<input4 input5="input6">B205</input4>
<td>Наушники</td>
<td>120</td>
</tr>
<tr>
<input7 input8="input9">C309</input7>
<td>Зарядное устройство</td>
<td>78</td>
</tr>
</tbody>
</table>
</div>
Фиксированная шапка через класс
Сделайте шапку фиксированной не по селектору элемента, а с помощью специального класса. Класс должен быть назначен нужной секции, чтобы заголовки оставались видимыми при прокрутке.
.table-scroll { max-height: 220px; overflow: auto; border: 1px solid #ddd; border-radius: 6px; }
.data { width: 100%; border-collapse: collapse; }
.data thead.sticky-top th { position: sticky; top: 0; background: #fff; z-index: 2; }
.data th, .data td { padding: 8px 10px; border-bottom: 1px solid #eee; font-size: 14px; text-align: left; }
.data thead th { border-bottom: 1px solid #ccc; }
<div class="table-scroll">
<table class="data">
<input1 input2="input3">
<tr>
<th>Дата</th>
<th>Доход</th>
<th>Расход</th>
</tr>
</input1>
<tbody>
<tr><td>01.09</td><td>12 000 ₽</td><td>8 500 ₽</td></tr>
<tr><td>02.09</td><td>15 300 ₽</td><td>9 200 ₽</td></tr>
<tr><td>03.09</td><td>11 800 ₽</td><td>7 900 ₽</td></tr>
<tr><td>04.09</td><td>14 050 ₽</td><td>9 100 ₽</td></tr>
<tr><td>05.09</td><td>13 500 ₽</td><td>8 750 ₽</td></tr>
</tbody>
</table>
</div>
Правильная обёртка для прокрутки
Сделайте так, чтобы таблица прокручивалась внутри собственного контейнера с рамкой, а заголовок оставался на месте. Контейнер должен иметь соответствующий класс для применения стилей прокрутки.
.cont { max-height: 200px; overflow: auto; border: 1px solid #dcdcdc; border-radius: 6px; }
.tbl { width: 100%; border-collapse: collapse; }
.tbl thead th { position: sticky; top: 0; background: #fff; z-index: 2; }
.tbl th, .tbl td { padding: 8px 10px; border-bottom: 1px solid #eee; font-size: 14px; text-align: left; }
.tbl thead th { border-bottom: 1px solid #ccc; }
<input1 class="input2">
<table class="tbl">
<thead>
<tr>
<th>Клиент</th>
<th>Счёт</th>
<th>Статус</th>
</tr>
</thead>
<tbody>
<tr><td>ООО "Вектор"</td><td>№ 541</td><td>Оплачен</td></tr>
<tr><td>ИП "Лес"</td><td>№ 542</td><td>Ожидает</td></tr>
<tr><td>ООО "Техно"</td><td>№ 543</td><td>Оплачен</td></tr>
<tr><td>ООО "Лайт"</td><td>№ 544</td><td>Просрочен</td></tr>
<tr><td>ООО "Контур"</td><td>№ 545</td><td>Оплачен</td></tr>
<tr><td>ИП "Сфера"</td><td>№ 546</td><td>Ожидает</td></tr>
</tbody>
</table>
</input1>
Двухуровневая фиксированная шапка
Создайте многоуровневую шапку из двух строк: верхняя строка объединяет колонки в группы, нижняя — содержит конкретные заголовки. Обе строки должны оставаться на месте при прокрутке.
.wrap { max-height: 230px; overflow: auto; border: 1px solid #ddd; border-radius: 6px; }
.tbl { width: 100%; border-collapse: collapse; }
.tbl th, .tbl td { padding: 8px; border-bottom: 1px solid #eee; font-size: 14px; text-align: left; }
.tbl thead tr:nth-child(1) th { position: sticky; top: 0; background: #fff; z-index: 3; }
.tbl thead tr:nth-child(2) th { position: sticky; top: 32px; background: #fff; z-index: 2; }
<div class="wrap">
<table class="tbl">
<input1>
<input2>
<th colspan="2">Продажи</th>
<th colspan="2">Склад</th>
</input2>
<input3>
<th>Город</th>
<th>Сумма</th>
<th>Доступно</th>
<th>Ожидается</th>
</input3>
</input1>
<tbody>
<tr><td>Москва</td><td>1 200 000 ₽</td><td>540</td><td>120</td></tr>
<tr><td>Казань</td><td>320 000 ₽</td><td>210</td><td>60</td></tr>
<tr><td>Пермь</td><td>210 000 ₽</td><td>130</td><td>20</td></tr>
<tr><td>Тверь</td><td>95 000 ₽</td><td>70</td><td>10</td></tr>
</tbody>
</table>
</div>
Групповые заголовки с корректным scope
Добавьте атрибуты для обозначения групп колонок и конкретных колонок. Это улучшает доступность и навигацию по таблице. Шапка остаётся фиксированной для обеих строк заголовков.
.wrap2 { max-height: 230px; overflow: auto; border: 1px solid #ddd; border-radius: 6px; }
.tbl2 { width: 100%; border-collapse: collapse; }
.tbl2 th, .tbl2 td { padding: 8px; border-bottom: 1px solid #eee; font-size: 14px; text-align: left; }
.tbl2 thead tr:nth-child(1) th { position: sticky; top: 0; background: #fff; z-index: 3; }
.tbl2 thead tr:nth-child(2) th { position: sticky; top: 32px; background: #fff; z-index: 2; }
<div class="wrap2">
<table class="tbl2">
<thead>
<tr>
<th input1="input2" colspan="2">Продажи</th>
<th input3="input4" colspan="2">Склад</th>
</tr>
<tr>
<th input5="input6">Город</th>
<th input7="input8">Сумма</th>
<th input9="input10">Доступно</th>
<th input11="input12">Ожидается</th>
</tr>
</thead>
<tbody>
<tr><td>Москва</td><td>1 200 000 ₽</td><td>540</td><td>120</td></tr>
<tr><td>Казань</td><td>320 000 ₽</td><td>210</td><td>60</td></tr>
<tr><td>Тверь</td><td>95 000 ₽</td><td>70</td><td>10</td></tr>
</tbody>
</table>
</div>
Горизонтальная прокрутка и фиксированная шапка
Соберите широкую таблицу, которая выходит за пределы видимой области по ширине. Внутренний скролл должен быть горизонтальным и вертикальным, а шапка оставаться закреплённой сверху при прокрутке.
.hscroll { max-height: 220px; overflow: auto; border: 1px solid #ddd; border-radius: 6px; }
.wide { border-collapse: collapse; min-width: 720px; width: 100%; }
.wide th, .wide td { padding: 8px 10px; border-bottom: 1px solid #eee; font-size: 14px; text-align: left; white-space: nowrap; }
.wide thead th { position: sticky; top: 0; background: #fff; z-index: 2; border-bottom: 1px solid #ccc; }
<input1 class="input2">
<input3 class="input4">
<thead>
<tr>
<th>Товар</th>
<th>Категория</th>
<th>Поставщик</th>
<th>Цена</th>
<th>Скидка</th>
<th>Наличие</th>
<th>Артикул</th>
</tr>
</thead>
<tbody>
<tr><td>Смартфон</td><td>Электроника</td><td>ООО "Мобайл"</td><td>29 990 ₽</td><td>5%</td><td>Да</td><td>SP-001</td></tr>
<tr><td>Планшет</td><td>Электроника</td><td>ООО "ТехноМаркет"</td><td>19 990 ₽</td><td>10%</td><td>Да</td><td>TB-210</td></tr>
<tr><td>Монитор</td><td>Периферия</td><td>ООО "Вижн"</td><td>17 900 ₽</td><td>0%</td><td>Нет</td><td>MN-432</td></tr>
<tr><td>Клавиатура</td><td>Периферия</td><td>ИП "Клаво"</td><td>3 200 ₽</td><td>15%</td><td>Да</td><td>KB-998</td></tr>
</tbody>
</input3>
</input1>
Добавьте подвал таблицы (tfoot) и закрепите его
К таблице с фиксированной шапкой добавьте подвал с итого-строкой, который будет прикреплён к нижней границе прокручиваемой области. При прокрутке вниз подвал должен оставаться видимым.
Комбинация: фиксированная шапка и первая колонка
Сделайте таблицу, в которой одновременно фиксируются шапка и первый столбец. При прокрутке вниз и в сторону заголовки колонок и названия строк остаются видимыми.
.view { max-height: 230px; overflow: auto; border: 1px solid #ddd; border-radius: 6px; }
.t { width: 100%; border-collapse: collapse; min-width: 520px; }
.t th, .t td { padding: 8px 10px; border-bottom: 1px solid #eee; font-size: 14px; text-align: left; }
.t thead th { position: sticky; top: 0; background: #fff; z-index: 3; }
.t tbody th[scope="row"] { position: sticky; left: 0; background: #fff; z-index: 2; }
<div class="view">
<table class="t">
<input1>
<tr>
<th>Код</th>
<th>Товар</th>
<th>Цена</th>
<th>Остаток</th>
</tr>
</input1>
<tbody>
<tr>
<input2 input3="input4">A1</input2>
<td>Флешка 32ГБ</td>
<td>790 ₽</td>
<td>45</td>
</tr>
<tr>
<input5 input6="input7">B2</input5>
<td>Жёсткий диск 1ТБ</td>
<td>4 990 ₽</td>
<td>12</td>
</tr>
<tr>
<input8 input9="input10">С3</input8>
<td>Мышь беспроводная</td>
<td>1 290 ₽</td>
<td>33</td>
</tr>
</tbody>
</table>
</div>
Заголовок таблицы (caption) и фиксированная шапка
Добавьте подпись к таблице и убедитесь, что шапка остаётся фиксированной. Подпись должна находиться в правильном месте структуры и не влиять на работу фиксированного заголовка.
.area { max-height: 220px; overflow: auto; border: 1px solid #ddd; border-radius: 6px; }
.rpt { width: 100%; border-collapse: collapse; }
.rpt caption { caption-side: top; padding: 6px 8px; font-weight: 600; text-align: left; }
.rpt thead th { position: sticky; top: 0; background: #fff; z-index: 2; border-bottom: 1px solid #ccc; }
.rpt th, .rpt td { padding: 8px 10px; border-bottom: 1px solid #eee; font-size: 14px; text-align: left; }
<div class="area">
<table class="rpt">
<input1>Отчёт по сделкам</input1>
<thead>
<tr>
<th>Менеджер</th>
<th>Сделок</th>
<th>Выручка</th>
</tr>
</thead>
<tbody>
<tr><td>Анна</td><td>12</td><td>1 200 000 ₽</td></tr>
<tr><td>Игорь</td><td>9</td><td>830 000 ₽</td></tr>
<tr><td>Светлана</td><td>15</td><td>1 450 000 ₽</td></tr>
<tr><td>Михаил</td><td>7</td><td>610 000 ₽</td></tr>
</tbody>
</table>
</div>
Комбо: шапка, первая колонка и подвал
Соберите таблицу с одновременно фиксированной шапкой, левой колонкой и подвалом. При прокрутке вниз шапка остаётся сверху, первая колонка — слева, а итоговая строка — у нижней границы.
.container { max-height: 240px; overflow: auto; border: 1px solid #ddd; border-radius: 6px; }
.table { width: 100%; border-collapse: collapse; min-width: 520px; }
.table th, .table td { padding: 8px 10px; border-bottom: 1px solid #eee; font-size: 14px; text-align: left; }
.table thead th { position: sticky; top: 0; background: #fff; z-index: 3; border-bottom: 1px solid #ccc; }
.table tbody th[scope="row"] { position: sticky; left: 0; background: #fff; z-index: 2; }
.table tfoot th { position: sticky; bottom: 0; background: #fff; z-index: 3; border-top: 1px solid #ccc; }
<div class="container">
<table class="table">
<input1>
<tr>
<th>Код</th>
<th>Товар</th>
<th>Цена</th>
<th>Кол-во</th>
<th>Итого</th>
</tr>
</input1>
<tbody>
<tr>
<input2 input3="input4">A1</input2>
<td>Флешка 32ГБ</td>
<td>790 ₽</td>
<td>2</td>
<td>1 580 ₽</td>
</tr>
<tr>
<input5 input6="input7">B2</input5>
<td>Жёсткий диск 1ТБ</td>
<td>4 990 ₽</td>
<td>1</td>
<td>4 990 ₽</td>
</tr>
<tr>
<input8 input9="input10">C3</input8>
<td>Мышь беспроводная</td>
<td>1 290 ₽</td>
<td>3</td>
<td>3 870 ₽</td>
</tr>
</tbody>
<input11>
<tr>
<input12 colspan="4">Итого</input12>
<th>10 440 ₽</th>
</tr>
</input11>
</table>
</div>