- Модуль 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: Практические проекты
Создание простого выпадающего списка
Давайте начнем с основ. Создайте выпадающий список для выбора предпочитаемого языка. Пока что он будет пустым, но главное — создать сам контейнер для будущих опций.
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
padding: 20px;
background-color: #f4f7f9;
color: #333;
}
label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #555;
}
select {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 6px;
background-color: #fff;
font-size: 16px;
cursor: pointer;
appearance: none;
background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E');
background-repeat: no-repeat;
background-position: right 10px top 50%;
background-size: .65em auto;
}
select:focus {
outline: none;
border-color: #007bff;
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
}
select:invalid {
box-shadow: 0 0 0 2px rgba(255, 0, 0, 0.25);
}
<label for="lang-select">Выберите язык:</label>
<input1 name="language" id="lang-select">
</input1>
Добавление пунктов в список
Теперь, когда у нас есть контейнер, нужно его наполнить. Добавьте три пункта (опции) в выпадающий список: 'Английский', 'Испанский' и 'Французский'.
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
padding: 20px;
background-color: #f4f7f9;
color: #333;
}
label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #555;
}
select {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 6px;
background-color: #fff;
font-size: 16px;
cursor: pointer;
appearance: none;
background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E');
background-repeat: no-repeat;
background-position: right 10px top 50%;
background-size: .65em auto;
}
select:focus {
outline: none;
border-color: #007bff;
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
}
select:invalid {
box-shadow: 0 0 0 2px rgba(255, 0, 0, 0.25);
}
<label for="lang-select">Выберите язык:</label>
<select name="language" id="lang-select">
<input1>Английский</input1>
<input2>Испанский</input2>
<input3>Французский</input3>
</select>
Задание значения для каждого пункта
Текст, который видит пользователь, и значение, которое отправляется на сервер, могут отличаться. Добавьте атрибут `value` для каждого пункта, чтобы задать отправляемые значения: 'en', 'es' и 'fr' соответственно.
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
padding: 20px;
background-color: #f4f7f9;
color: #333;
}
label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #555;
}
select {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 6px;
background-color: #fff;
font-size: 16px;
cursor: pointer;
appearance: none;
background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E');
background-repeat: no-repeat;
background-position: right 10px top 50%;
background-size: .65em auto;
}
select:focus {
outline: none;
border-color: #007bff;
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
}
select:invalid {
box-shadow: 0 0 0 2px rgba(255, 0, 0, 0.25);
}
<label for="lang-select">Выберите язык:</label>
<select name="language" id="lang-select">
<option input1="en">Английский</option>
<option input2="es">Испанский</option>
<option input3="fr">Французский</option>
</select>
Выбор пункта по умолчанию
Часто нужно, чтобы один из пунктов списка был выбран по умолчанию при загрузке страницы. Сделайте так, чтобы пункт 'Испанский' был выбран изначально.
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
padding: 20px;
background-color: #f4f7f9;
color: #333;
}
label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #555;
}
select {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 6px;
background-color: #fff;
font-size: 16px;
cursor: pointer;
appearance: none;
background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E');
background-repeat: no-repeat;
background-position: right 10px top 50%;
background-size: .65em auto;
}
select:focus {
outline: none;
border-color: #007bff;
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
}
select:invalid {
box-shadow: 0 0 0 2px rgba(255, 0, 0, 0.25);
}
<label for="lang-select">Выберите язык:</label>
<select name="language" id="lang-select">
<option value="en">Английский</option>
<option value="es" <input1>>Испанский</option>
<option value="fr">Французский</option>
</select>
Отключенный пункт-подсказка
Первый пункт списка часто используют как подсказку (например, 'Выберите...'). Такой пункт не должен быть доступен для выбора. Добавьте в начало списка пункт с текстом 'Выберите язык', сделайте его выбранным по умолчанию, но неактивным.
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
padding: 20px;
background-color: #f4f7f9;
color: #333;
}
label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #555;
}
select {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 6px;
background-color: #fff;
font-size: 16px;
cursor: pointer;
appearance: none;
background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E');
background-repeat: no-repeat;
background-position: right 10px top 50%;
background-size: .65em auto;
}
select:focus {
outline: none;
border-color: #007bff;
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
}
select:invalid {
box-shadow: 0 0 0 2px rgba(255, 0, 0, 0.25);
}
<label for="lang-select">Выберите язык:</label>
<select name="language" id="lang-select">
<option value="" input1>Выберите язык</option>
<option value="en">Английский</option>
<option value="es">Испанский</option>
<option value="fr">Французский</option>
</select>
Группировка пунктов
Для улучшения навигации по длинным спискам пункты можно объединять в группы. Сгруппируйте планеты 'Меркурий' и 'Венера' в группу под названием 'Ближайшие к Солнцу'.
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
padding: 20px;
background-color: #f4f7f9;
color: #333;
}
label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #555;
}
select {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 6px;
background-color: #fff;
font-size: 16px;
cursor: pointer;
appearance: none;
background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E');
background-repeat: no-repeat;
background-position: right 10px top 50%;
background-size: .65em auto;
}
select:focus {
outline: none;
border-color: #007bff;
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
}
optgroup {
font-weight: bold;
font-style: italic;
}
option {
font-style: normal;
}
<label for="planets">Выберите планету:</label>
<select name="planets" id="planets">
<input1 label="Ближайшие к Солнцу">
<option value="mercury">Меркурий</option>
<option value="venus">Венера</option>
</input1>
<option value="earth">Земля</option>
<option value="mars">Марс</option>
</select>
Создание нескольких групп
Давайте усложним задачу. У вас есть список отделов компании. Объедините их в две группы: 'Технический отдел' и 'Отдел продаж'. Вам нужно добавить теги групп и их названия.
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
padding: 20px;
background-color: #f4f7f9;
color: #333;
}
label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #555;
}
select {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 6px;
background-color: #fff;
font-size: 16px;
cursor: pointer;
appearance: none;
background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E');
background-repeat: no-repeat;
background-position: right 10px top 50%;
background-size: .65em auto;
}
select:focus {
outline: none;
border-color: #007bff;
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
}
optgroup {
font-weight: bold;
font-style: italic;
}
option {
font-style: normal;
}
<label for="department">Выберите отдел:</label>
<select name="department" id="department">
<input1 input2="Технический отдел">
<option value="dev">Разработчики</option>
<option value="qa">Тестировщики</option>
</input1>
<optgroup label="Отдел продаж">
<option value="sales_manager">Менеджеры по продажам</option>
<option value="support">Поддержка клиентов</option>
</optgroup>
</select>
Отключение целой группы
Иногда нужно временно отключить целую группу опций, например, если товары закончились. Сделайте так, чтобы все размеры из группы 'Большие размеры' были недоступны для выбора.
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
padding: 20px;
background-color: #f4f7f9;
color: #333;
}
label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #555;
}
select {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 6px;
background-color: #fff;
font-size: 16px;
cursor: pointer;
appearance: none;
background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E');
background-repeat: no-repeat;
background-position: right 10px top 50%;
background-size: .65em auto;
}
select:focus {
outline: none;
border-color: #007bff;
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
}
optgroup {
font-weight: bold;
font-style: italic;
}
option {
font-style: normal;
}
<label for="size">Выберите размер:</label>
<select name="size" id="size">
<optgroup label="Стандартные размеры">
<option value="S">S</option>
<option value="M">M</option>
</optgroup>
<optgroup label="Большие размеры" input1>
<option value="L">L</option>
<option value="XL">XL</option>
</optgroup>
</select>
Обязательный выбор
Сделайте выбор города обязательным для отправки формы. Если пользователь не выберет город (оставит пункт '-- Пожалуйста, выберите --'), форма не должна отправиться.
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
padding: 20px;
background-color: #f4f7f9;
color: #333;
}
label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #555;
}
select {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 6px;
background-color: #fff;
font-size: 16px;
cursor: pointer;
appearance: none;
background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23666%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E');
background-repeat: no-repeat;
background-position: right 10px top 50%;
background-size: .65em auto;
}
select:focus {
outline: none;
border-color: #007bff;
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
}
select:required:invalid {
border-color: #e53e3e;
box-shadow: 0 0 0 2px rgba(229, 62, 62, 0.25);
}
<form>
<label for="city">Выберите ваш город:</label>
<select name="city" id="city" input1>
<option value="">-- Пожалуйста, выберите --</option>
<option value="msk">Москва</option>
<option value="spb">Санкт-Петербург</option>
<option value="ekb">Екатеринбург</option>
</select>
</form>
Выбор нескольких вариантов
Стандартный выпадающий список позволяет выбрать только один пункт. Измените его так, чтобы пользователь мог выбрать несколько любимых жанров музыки, зажав клавишу Ctrl (или Cmd на Mac).
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
padding: 20px;
background-color: #f4f7f9;
color: #333;
}
label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #555;
}
select {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 6px;
background-color: #fff;
font-size: 16px;
}
select[multiple] {
height: 120px;
}
select:focus {
outline: none;
border-color: #007bff;
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
}
<label for="music">Выберите любимые жанры:</label>
<select name="music" id="music" input1>
<option value="rock">Рок</option>
<option value="jazz">Джаз</option>
<option value="pop">Поп</option>
<option value="classic">Классика</option>
<option value="electronic">Электроника</option>
</select>