Введение в HTML
Первый шаг в веб-разработке: узнаем, из чего состоит любая страница, и создадим свой первый документ.
Что такое HTML
HTML (HyperText Markup Language) — язык разметки гипертекста. Он не является языком программирования: HTML описывает структуру и смысл содержимого страницы, а не вычисления или логику.
Любой сайт, который вы видите, — это HTML, «одетый» в стили (CSS) и оживлённый скриптами (JavaScript). Сравните с человеком:
- HTML — скелет и органы: заголовки, тексты, картинки, кнопки.
- CSS — внешность: цвета, шрифты, отступы, анимации.
- JavaScript — мышцы и мозг: реакция на клики, логика поведения.
Из чего состоит тег
Строительный кирпичик HTML — тег. Чаще всего теги парные: открывающий и закрывающий, внутри между ними находится содержимое:
<p>Это абзац текста.</p>
| Тег | Что делает |
|---|---|
<h1>–<h6> | Заголовки от самого важного до самого мелкого |
<p> | Абзац текста |
<a> | Ссылка |
<img> | Изображение (одиночный, без «пары») |
<div> | Универсальный блок-контейнер |
<img>, <br>) не имеют закрывающей части — им нечего «закрывать».Каркас HTML-документа
Любая страница начинается с одного и того же скелета. Создайте файл index.html и вставьте туда это:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Моя первая страница</title>
</head>
<body>
<h1>Привет, мир!</h1>
<p>Мой первый HTML.</p>
</body>
</html>
Разберём по частям:
<!DOCTYPE html>— сообщает браузеру, что документ современный HTML5.<html>— корневой элемент всей страницы.<head>— служебные данные: кодировка, заголовок вкладки, подключение стилей. Здесь ничего не видно на странице.<body>— то, что пользователь реально видит.
Живой пример
Вот что получится — это уже настоящая веб-страница:
Привет, мир!
Мой первый HTML.
file://. Хостинг для этого не нужен.Комментарии в HTML
Комментарии нужны, чтобы пояснять код себе и коллегам. В браузере пользователь их не видит:
<!-- Это комментарий -->
<p>Пользователь видит только это.</p>
<!--
Многострочный комментарий
тоже допустим
-->
Атрибут lang и язык документа
Атрибут lang сообщает браузеру и поисковикам, на каком языке написан документ. Это влияет на проверку орфографии, выбор шрифтов и озвучивание скринридерами:
<html lang="ru"> <!-- русская страница -->
lang="ru-RU" или lang="en-US". Если язык указан неверно, браузер может споткнуться о встроенный переводчик.Анатомия URL
Любой адрес в интернете состоит из нескольких частей. Разберём на примере:
https://example.com:443/blog/post?page=2#comments
└──┘ └────────┘ └─┘ └───────┘ └──────┘ └──────┘
схема домен порт путь запрос якорь
| Часть | Что это |
|---|---|
https:// | схема (протокол). https — шифрованное соединение |
example.com | домен — адрес сайта |
:443 | порт. Для https обычно 443, его не пишут |
/blog/post | путь к ресурсу на сервере |
?page=2 | запрос: параметры после ? |
#comments | якорь: прокрутка к элементу с этим id |
DevTools — инструменты разработчика
Самый полезный инструмент верстальщика встроен в каждый браузер. Открывается клавишей F12 или Ctrl+Shift+I.
- Elements / Инспектор — смотреть и менять HTML и CSS на лету, экспериментировать без пересохранения файла;
- Console — логи и ошибки JavaScript;
- Network — какие файлы и как быстро загружаются;
- Responsive mode — проверить вёрстку в размере телефона.
Структура проекта и имя index.html
Главную страницу сайта принято называть index.html — сервер отдаёт её по умолчанию, когда открывают корень сайта. Держите порядок и в папках:
my-site/
├── index.html <!-- главная -->
├── about.html
├── css/
│ └── style.css
├── js/
│ └── main.js
└── images/
about-us.html, а не «О Нас.html». Пробелы в адресе кодируются и ломают вёрстку на части серверов.Мета-теги: charset, viewport, description
В <head> живут невидимые настройки документа. Три самых важных мета-тега:
<meta charset="UTF-8"> <!-- кодировка, без неё кириллица сломается -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Краткое описание страницы">
charset ставят первым, viewport обязателен для телефонов, а description поисковики нередко показывают в сниппете результатов под названием страницы.Текст: абзацы, переносы и линии
За абзац отвечает <p>. Внутри одного абзаца перенос вручную — это <br>, а тему отделяют горизонтальной линией <hr>:
<p>
Первая строка,<br>
вторая строка того же абзаца.
</p>
<hr> <!-- разделитель между блоками -->
<p>Новый смысловой блок.</p>
<br> для отступов между абзацами — для этого существуют CSS-отступы. <br> нужен только внутри текста.Валидность и стандарты W3C
Стандарты интернета пишет консорциум W3C. Его валидатор проверяет HTML на ошибки — разметка с ошибками может работать, но вести себя непредсказуемо в разных браузерах:
- validator.w3.org — официальная проверка кода;
- Проверяйте открытые теги, вложенность и атрибуты;
- Валидный HTML с осмысленной семантикой = лучший поиск.
Блочные и строчные элементы
Блочные теги существуют отдельной строкой и тянутся на всю ширину, строчные живут внутри строки как слова:
<div>Первый блок</div> <!-- каждый на своей строке -->
<div>Второй блок</div>
<p>Текст со <span>строчным</span> вкраплением.</p>
p, div, заголовки — блочные; a, span, strong, code — строчные. CSS меняет это поведение через display.Глобальные атрибуты: title и hidden
Некоторые атрибуты работают у любого тега. title даёт подсказку, hidden прячет элемент:
<p title="Подсказка при наведении">Наведите курсор</p>
<div hidden>Этого не покажем</div>
<abbr title="Гипертекстовая разметка">HTML</abbr>
Вложенные списки
Списки вкладываются друг в друга — получается иерархия, как в меню или оглавлении:
<ul>
<li>HTML
<ul>
<li>Теги</li>
<li>Атрибуты</li>
</ul>
</li>
</ul>
<li>, а не «между» пунктами — иначе структура ломается.Иерархия заголовков
Заголовки образуют дерево смысла. Одно <h1> на страницу, ниже <h2>, затем <h3>:
<h1>Статья</h1>
<h2>Введение</h2>
<h3>Цели курса</h3>
<h2>Итоги</h2>
h1 сразу на h3 — плохо для доступности и SEO. И не используйте заголовки ради «жирного текста».Кодировка UTF-8
Первый тег документа — <meta charset>. Без него браузер угадывает кодировку и часто ошибается — на странице «кракозябры»:
<meta charset="UTF-8">
Ленивая загрузка изображений
Картинки вне первого экрана грузить сразу незачем — браузер подтянет их, когда прокрутишь до них:
<img src="photo.jpg" alt="Фото" loading="lazy">
loading="lazy" не ставят: эта картинка видна сразу, отложенная загрузка только задержит её.Формы: базовые поля
Тег <form> и поля <input> собирают данные пользователя. Вспомогательный материал про формы увидим в следующих уроках, а вот каркас:
<form action="/send" method="post">
<input name="email" type="email">
<button type="submit">Отправить</button>
</form>
Чекбоксы и радиокнопки
Чекбокс — несколько «да/нет», радиокнопка — один из группы:
<label><input type="checkbox"> Согласен</label>
<label><input type="radio" name="opt" value="a"> Вариант А</label>
<label><input type="radio" name="opt" value="b"> Вариант Б</label>
name — можно выбрать одну. Чекбокс с тем же name просто передаст массив отмеченных значений.Валидация форм без JS
Браузер сам подскажет о незаполненном обязательном поле или неверном e-mail:
<input type="email" required>
<input type="text" minlength="3" maxlength="20">
<input type="number" min="1" max="10">
label и доступность форм
<label> связывает надпись и поле. Клик по надписи фокусирует поле — большая кнопка нажимаемости:
<label for="name">Имя</label>
<input id="name" type="text">
<!-- или вложенный вариант без for/id -->
<label>Имя<input type="text"></label>
Кнопки: <button>
Внутри формы у кнопки три режима: submit (по умолчанию), reset и button (просто кнопка):
<button type="submit">Отправить</button>
<button type="reset">Сбросить</button>
<button type="button">Нейтральная</button>
submit у кнопки в форме «по умолчанию» — случайный Enter в поле отправки «провалит» форму. Не дайте удивиться чужим кнопкам без type.Якорная навигация
Ссылка с # прокручивает к элементу с соответствующем id:
<a href="#contacts">К контактам</a>
...
<section id="contacts">Контакты</section>
href="#top" с id="top" у <body> — классическая «стрелка наверх» без единой строчки JS.HTML-сущности
Спецсимволы записываются символом &, кодом и точкой с запятой. Главные — угловые скобки:
<p>Тег начинается с < (это символ <).</p>
| Сущность | Что даёт |
|---|---|
< | < |
> | > |
& | & |
© | © |
| неразрывный пробел |
Как ускорить работу с кодом
Советы, которые экономят часы с первого дня живут в редакторе VS Code:
- Наберите
!и Tab — готовая каркас HTML; - Ctrl+Shift+F — поиск по всем файлам;
- Расширения Prettier — автоперенос и выравнивание;
- Emmet:
ul>li*3, затем Tab — сгенерирует список из трёх пунктов.
Одна минутка истории
HTML появился в 1991 году как разметка научных статей. Дальше — версии: HTML 3.2, HTML 4.01, строгий XHTML, и наконец живой стандарт HTML5, который развивается и сейчас.
Строение тега
Базовый синтаксис: открывающий тег, содержимое, закрывающий тег:
<p>Это параграф.</p>
<!-- тег с атрибутом: -->
<a href="https://example.com">Ссылка</a>
Самозакрывающиеся теги
Некоторые теги не имеют содержимого: img, br, input, hr, meta.
<img src="logo.png" alt="Логотип">
<br> <!-- перенос строки -->
<hr> <!-- разделитель -->
Регистр тегов
Теги пишут строчными буквами. Смешивать регистр можно, но это дурной тон:
<P>Так можно, но не надо</P>
<p>Так правильно</p>
Кавычки атрибутов
Классика — двойные кавычки. Если внутри нужны кавычки, используйте «ёлочки» или одиночные:
<a title="Читайте «это»">текст</a>
<input value='весь текст'>
Комментарии: <!-- -->
Комментарии не отображаются, но их видно в исходнике. Ими помечают разделы и временно выключают фрагменты:
<!-- ===== Шапка сайта ===== -->
<header>...</header>
<!-- <p>Баннер отключён</p> -->
Направление текста: dir
Атрибут dir управляет направлением письма — нужен арабскому и ивриту:
<p dir="rtl">مرحبا بكم</p>
<html dir="rtl"> или через CSS direction.Тег bdo: управление порядком
Принудительно развернуть вывод строки — экзотика, но полезна:
<p>Страница<bdo dir="rtl">Страница</bdo></p>
Заголовок в поисковиках: title
Title — это почти реклама результата в Google. Кратко и с ключами:
<title>Курс веб-разработки с нуля · 2026</title>
Мета-теги для ботов
Хочешь — чтобы не индексировать страницу. Пиши явно:
<meta name="robots" content="index, follow">
<meta name="author" content="Иван Иванов">
<meta name="theme-color" content="#0f172a">
Канонический адрес
Когда страница доступна по нескольким путям, укажите эталон:
<link rel="canonical" href="https://site.ru/page/">
Списки: начало и тип маркера
Нумерованный список начинается не всегда с 1 — и не всегда с цифр:
<ol start="5"> <!-- с пятого -->
<li>Пять</li>
</ol>
<ol type="A"> <!-- A, B, C -->
<li>Буква</li>
</ol>
Обратный список: reversed
Отсчёт сверху вниз — топ-10 для списка «наоборот»:
<ol reversed>
<li>Третье место</li>
<li>Второе место</li>
<li>Первое место</li>
</ol>
tabindex: порядок фокуса
Tab последовательно проходит интерактивные элементы. tabindex упорядочивает или исключает:
<button tabindex="2">Второй</button>
<button tabindex="1">Первый</button>
<button tabindex="-1">Скрыт из Tab</button>
Ссылка в новую вкладку
Атрибут target="_blank" открывает цель отдельно, а rel закрывает уязвимость:
<a href="https://example.com" target="_blank" rel="noopener noreferrer">Открыть</a>
noopener новая вкладка получает доступ к объекту window.opener вашей страницы — классическая дыра. Добавляйте rel всегда.Якорь «наверх»
Ссылка наверх страницы — просто #top или к первому id:
<body id="top">
...
<a href="#top">Наверх ↑</a>
</body>
Подсказка на ссылке
Атрибут title показывает всплывающую подсказку — но не заменяет текст:
<a href="/docs" title="Откроется в новом разделе">Документация</a>
Изображения: размеры против «прыжков»
Указывайте width и height — браузер зарезервирует место и страница не дёрнется при загрузке:
<img src="photo.jpg" alt="Фото" width="640" height="480">
width: 100%; height: auto — пропорции сохранятся.Формы: method GET и POST
Способ отправки данных на сервер:
<form method="get"> <!-- данные в адресе -->
<form method="post"> <!-- данные в теле, безопаснее -->
Формы: куда отправлять — action
Атрибут action указывает адрес обработчика формы:
<form action="/subscribe" method="post">
<input type="email" name="email">
<button>Подписаться</button>
</form>
Плейсхолдер: подробности
placeholder — подсказка внутри поля; исчезает при вводе и не является значением:
<input type="text" placeholder="Иван Иванов">
Многострочное поле: textarea
Для комментариев и сообщений:
<textarea name="comment" rows="4" cols="40">
Начальный текст
</textarea>
Выпадающий список: select
Пользователь выбирает один вариант из списка:
<select name="city">
<option value="msk">Москва</option>
<option value="spb">Санкт-Петербург</option>
</select>
Группы опций: optgroup
Длинный список разбивается на категории:
<select name="city">
<optgroup label="Россия">
<option>Москва</option>
</optgroup>
<optgroup label="Беларусь">
<option>Минск</option>
</optgroup>
</select>
Выбор по умолчанию: selected
Одна из опций может быть предустановлена:
<option value="msk" selected>Москва</option>
Числа: min, max, step
Поле-число с диапазоном и шагом:
<input type="number" min="1" max="99" step="1" value="1">
Цвет и дата
Специальные типы полей — браузер нарисует пипетку и календарь:
<input type="color" value="#38bdf8">
<input type="date">
<input type="range" min="0" max="100">
Загрузка файла: file
Поле выбора файла с ограничением типов:
<input type="file" accept="image/png, image/jpeg" multiple>
Автозаполнение формы
Атрибут autocomplete помогает браузеру подставить сохранённые данные:
<input type="email" name="email" autocomplete="email">
<input type="password" name="pass" autocomplete="new-password">
Фокус сразу: autofocus
Поле получает фокус при открытии страницы:
<input type="search" autofocus>
readonly и disabled
Два похожих запрета с разным смыслом:
<input value="ID-12" readonly> <!-- можно выделить, но не менять -->
<input value="Скидка" disabled> <!-- серый и не уходит на сервер -->
Группировка полей: fieldset
Логическая группа с подписью legend — для согласий и адресов:
<fieldset>
<legend>Способ доставки</legend>
<label><input type="radio" name="delivery"> Курьер</label>
<label><input type="radio" name="delivery"> Пункт выдачи</label>
</fieldset>
Скрытые поля: hidden
Данные, которые не показываются, но отправляются на сервер:
<input type="hidden" name="utm_source" value="ads">
submit или button
Тип кнопки определяет поведение внутри формы:
<button type="submit">Отправить</button>
<button type="button">Просто кнопка</button>
<button type="reset">Очистить</button>
type="button", иначе странный «перезапуск» формы обеспечен.Длина ввода: maxlength
Ограничение числа символов прямо в разметке:
<input type="text" maxlength="20" minlength="3">
Множественный выбор: multiple
Select позволяет выбрать несколько значений (удерживая Ctrl), а file — несколько файлов:
<select name="skills" multiple size="4">
<option>HTML</option>
<option>CSS</option>
<option>JS</option>
</select>
Проверка по шаблону: pattern
Регулярное выражение для поля — например, номер из цифр:
<input type="text" pattern="[0-9]{10}" title="10 цифр">
Прогресс: progress
Полоса выполнения задачи с процентами:
<progress value="70" max="100">70%</progress>
Измерение: meter
Шкала с качественным диапазоном (низко/оптимально/высоко):
<meter value="0.8" min="0" max="1" low="0.3" high="0.7">80%</meter>
Результат вычисления: output
Место для значения, которое посчитает скрипт:
<form oninput="result.value = a.valueAsNumber + b.valueAsNumber">
<input type="number" name="a" value="1"> +
<input type="number" name="b" value="1"> =
<output name="result">2</output>
</form>
Модальное окно: dialog
Нативный контейнер для всплывающего окна — без библиотек:
<dialog id="welcome">
<p>Добро пожаловать!</p>
<button onclick="welcome.close()">Закрыть</button>
</dialog>
welcome.showModal(). Диалог сам блокирует фон, ловит Escape и позиционируется по центру.Редактируемый текст: contenteditable
Превращает любой блок в «живой» редактор:
<div contenteditable="true">Попробуйте отредактировать этот текст.</div>
Тренировка
Откройте отредактируйте свой index.html и попробуйте:
- Сменить заголовок во вкладке (тег
<title>) на свою фамилию. - Добавить второй абзац и заголовок
<h2>. - Посмотреть, чем
<h1>отличается от<h6>по размеру.
Клиент и сервер
Любой сайт работает по схеме «запрос — ответ». Ваш браузер — это клиент: он просит данные. Программа на удалённом компьютере, которая их отдаёт, — сервер.
Браузер (клиент) --запрос--> Сервер
<---ответ HTML/CSS/JS---
localhost и сразу тестируете обе роли.DNS: как браузер находит сайт
Люди запоминают google.com, а компьютеры работают с IP-адресами вида 142.250.74.46. Переводит имена в адреса система DNS — «телефонная книга интернета».
Браузер: «где живёт google.com?»
DNS: «это 142.250.74.46, соединяйтесь»
Браузер: «спасибо, открываю!»
nslookup google.com в терминале.Протокол HTTP: запрос и ответ
HTTP — правила, по которым браузер и сервер общаются. Запрос уходит с методом (чаще всего GET), ответ приходит со статусом: 200 — хорошо, 404 — не найдено, 500 — ошибка сервера.
GET /index.html HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
404 означает лишь «страницы нет», а не «сайт не работает». Сайт жив, просто адрес ошибочный.Статические и динамические страницы
Статическая страница — заранее готовый файл .html, сервер отдаёт его как есть. Динамическая собирается программой на лету: для блогов, магазинов, личных кабинетов.
- Статический сайт: быстрый, дешёвый, простой — идеален для визитки;
- Динамический: данные меняются по действиям пользователя, нужен серверный код.
Фронтенд и бэкенд
Веб-разработка делится на две зоны ответственности. Фронтенд — то, что видно в браузере: HTML, CSS, JavaScript. Бэкенд — серверная логика: базы данных, авторизация, оплата.
Вы начали с фронтенда — и это правильно: пока нет страницы, нечего «оживать» на сервере.
Хостинг и публикация
Хостинг — место, где лежат файлы сайта, чтобы он был открывался по адресу. Бесплатные варианты для старта: GitHub Pages, Netlify, Vercel.
Файлы (index.html, css, js)
|
v
GitHub Pages / Netlify / Vercel
|
v
https://ваш-сайт.netlify.app
Домены, поддомены и зоны
Полный домен читается справа налево: зона → имя → поддомен. В mail.example.com зона — .com, имя — example, а mail — поддомен.
mail.example.com
└поддомен┘└─имя──┘┘зона
blog.example.com — ещё один поддомен того же сайта
Что такое гипертекст
«Гипер» — значит «сверх». Гипертекст — это текст со ссылками: вместо листания страниц вы мгновенно прыгаете между документами. Отсюда и название языка — HyperText Markup Language.
Обычный текст: читаете по порядку.
Гипертекст: ссылка «см. пункт 7» ведёт туда сразу.
Страница как документ
Хорошая веб-страница похожа на структурный документ: название, введение, разделы, выводы. Относитесь к странице как к тексту, а не как к «картинке с кнопками» — контент сам подскажет разметку.
- Заголовки — как оглавление;
- Абзацы — обычные абзацы;
- Списки — перечисления;
- Ссылки — сноски и переходы.
Браузеры и их движки
Браузер читает HTML по правилам веб-стандарта. Но реализации отличаются: Chrome и Edge используют движок Blink, Safari — WebKit, Firefox — Gecko.
Chrome / Edge Blink
Safari WebKit
Firefox Gecko
Как открыть файл в браузере
Самый простой способ увидеть результат — открыть файл .html двойным кликом. В адресной строке появится file:///C:/... — компьютер открыл страницу напрямую, без сервера.
file:///C:/golld/site/index.html
file:// блокируются. Для них позже пригодится Live Server.Именование файлов: регистр и дефис
Файлы и папки проекта называйте строчными буквами, цифрами, дефисом и подчёркиванием. Пробелы и кириллица в именах ломают ссылки на части серверов.
about-us.html ✓ правильно
about us.html ✗ пробел в имени
О_Нас.html ✗ кириллица
AboutUs.html допустимо, но капризно
About.html и about.html — два разных файла. Привыкайте к нижнему регистру сразу.Главная ошибка: незакрытый тег
Чаще всего «что-то сломалось» — из-за одного пропущенного </div>. Браузер не ругается: он сам пытается угадать, где вы хотели закрыть тег, и угадывает не всегда удачно.
<div>
<p>Текст</p>
<!-- забыли </div> — вложенность «поплыла» -->
Вложенность — правило «коробок»
Теги вкладываются как коробки: то, что открыли последним, закрываете первым. Нарушение порядка — классическая ошибка новичков.
<!-- ✗ неправильно: <p> прервал <div> -->
<div><p>текст</div></p>
<!-- ✓ правильно: закрываете по порядку -->
<div><p>текст</p></div>
Естественный поток документа
Пока нет CSS, браузер раскладывает элементы по простым правилам: блочные — каждый на своей строке, строчные — подряд, как буквы. Это «естественный поток» (normal flow).
<p>Один абзац — на своей строке
Следующий блочный элемент начнётся с новой строки, а строчные продолжат ту же.
Отступы и читаемость кода
Браузеру всё равно, как вы отступаете код. Людям — нет. Вложенные теги сдвигайте на два пробела: так читается структура «коробок».
<ul>
<li>Первый пункт
<ul>
<li>Подпункт</li>
</ul>
</li>
</ul>
Автозакрытие тегов в редакторе
VS Code закрывает тег за вас: набрали <p> — появился пустой </p>.
Печатаете: <p>
Результат: <p>|</p> ← курсор уже внутри
html.autoClosingTags.Сниппеты и шаблоны
Не печатайте каркас страницы с нуля каждый раз. В VS Code достаточно набрать восклицательный знак и нажать Tab — появится полный скелет документа.
Вводите: !
Результат: DOCTYPE + html + head + body и нужные meta.
Как браузер парсит HTML
Браузер читает разметку слева направо и строит в памяти дерево элементов — DOM. У каждого тега появляется «узел», который потом можно менять из JavaScript (об этом — урок 9).
HTML: DOM:
<html> html
<body> └─ body
<p>текст</p> └─ p «текст»
Пробелы и переносы в исходнике
В обычном тексте несколько пробелов и переводов строк сливаются в один. Поэтому красивые отступы в исходнике на внешний вид не влияют.
<p>Много пробелов
и перенос
слипнутся в один.</p>
white-space или , а не клавишу Space.Что браузер делает с опечаткой
Написали тег с ошибкой? Браузер не покажет сообщение — просто не узнает тег и создаст для него «анонимный» узел, чаще всего лишённый стилей.
<p>опечатка> // название тега сломано
→ текст виден, но семантический смысл потерян
HTML без CSS: вид по умолчанию
Браузер применяет к странице «стили по умолчанию»: заголовки крупные, ссылки синие и подчёркнутые, списки с маркерами. Это user agent styles, и у браузеров они чуть разные.
- Размеры и жирность заголовков — по умолчанию;
- Ссылки синие; посещённые — фиолетовые;
- Битая картинка показывает рамку и пиктограмму.
Что видит поисковик (SEO-вводная)
Поисковик не «видит» страницу глазами — он читает HTML. Хорошие заголовки, title, описание и осмысленный alt помогают людям найти ваш сайт.
- Один
<h1>и понятные<h2>; descriptionдлиной 150–160 символов;- Ссылки с осмысленным текстом вместо «нажмите сюда».
HTML — живой стандарт
HTML5 — не «выпущенная» однажды версия, а постоянно обновляемый стандарт: браузеры добавляют новые возможности ежегодно, без новых «версий языка».
Версии HTML и совместимость
История языковой эволюции: HTML 3.2 → HTML 4.01 → XHTML (слишком строгий) → HTML5 (живой). Современный HTML обратно совместим: страницы 90-х часто открываются до сих пор.
1991 HTML (первый черновик)
1997 HTML 3.2
1999 HTML 4.01
2000 XHTML 1.0 (жёсткая строгость)
2014 HTML5 — современная эпоха
Порядок мета-тегов в head
Внутри <head> важен порядок: charset — первым, затем viewport, потом title, description и подключение стилей.
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>Мой сайт</title>
</head>
charset должен идти до текста — иначе первые символы могут прочитаться не в той кодировке.title и h1: разные задачи
<title> — название вкладки и заголовок в поиске. <h1> — видимый заголовок страницы. Они могут быть близки по смыслу, но это два разных элемента.
<title>Купить велосипед в Москве — магазин «Колесо»</title>
<h1>Велосипеды для города и трейла</h1>
title главные слова ставьте первыми — в выдаче хвост обрезается.Ссылка или кнопка?
Правило простое: ссылка ведёт на другой адрес, кнопка запускает действие на странице. «Перейти в кабинет» — ссылка, «Отправить форму» — кнопка.
<a href="/cabinet">В кабинет</a>
<button type="submit">Отправить</button>
Эмодзи и шрифты на странице
Эмодзи — обычные Unicode-символы, только цветные. Они работают в любом браузере, если файл сохранён в UTF-8.
<p>Сегодня отличная погода 🚀</p>
Инспектор: живое редактирование
В DevTools на панели Elements можно менять HTML прямо на странице: поправили текст — увидели результат мгновенно, без сохранения файла. Идеальная песочница для экспериментов.
Live Server: автоперезагрузка
Расширение Live Server для VS Code поднимает локальный сервер и перезагружает страницу при каждом сохранении. Настроили один раз — правки видны сразу.
Горячие клавиши VS Code
Горячие клавиши ускоряют работу в разы. Начните с пяти, остальные добавятся сами:
- Ctrl+S — сохранить файл;
- Ctrl+Z / Ctrl+Shift+Z — отмена и возврат;
- Ctrl+D — выбрать следующее вхождение слова;
- Ctrl+/ — закомментировать строку;
- Ctrl+Shift+F — поиск по всем файлам.
Кэш и жёсткое обновление
Чтобы не грузить файлы заново, браузер кладёт их в кэш. После правки CSS вы иногда видите старую версию страницы — кэш ещё «не заметил» изменения.
W3C и WHATWG: стандарты
Стандарты пишут две организации. W3C — консорциум, автор валидаторов и множества спецификаций. WHATWG — группа браузерных компаний, поддерживает «живой» HTML как единый стандарт.
Веб-доступность: вводная
Доступность (a11y) — умение страницы работать для всех: слабовидящих, людей без мыши, пользователей с маленьким экраном. Начинается с честной семантики и текста на кнопках.
- Альтернативный текст для картинок;
- Видимый текст на кнопках, а не «только иконка»;
- Достаточная контрастность текста.
Как скринридер читает страницу
Скринридер — программа, которая озвучивает интерфейс для незрячих. Она читает не «как выглядит», а «как размечено»: заголовки — как заголовки, кнопки — как кнопки.
Поэтому <div>Оплатить</div> — просто текст, а <button>Оплатить</button> — настоящая кнопка, которую можно нажать с клавиатуры.
Типы сайтов: лендинг и портфолио
Понимать, какой сайт вы делаете, полезно — от этого зависит структура. Лендинг — одна длинная страница ради одного действия. Портфолио — витрина работ. Многостраничник — каталог или блог.
Что такое API простыми словами
API — набор готовых команд, которыми одна программа общается с другой. «Покажи погоду», «авторизуй пользователя», «сохрани комментарий» — всё это запросы к API.
Сайт --«погода в Москве?»--> api.weather.com
Сайт <--«+12, снег»---------- api.weather.com
fetch — тем самым способом звать API из браузера.HTTP и HTTPS: зачем шифрование
http:// передаёт данные открытым текстом — кто угодно «на проводе» может их прочитать. https:// шифрует канал: пароли и письма остаются тайной между браузером и сервером.
https обязателен. Браузер помечает такие сайты как «не защищено».Схема и порт в адресе
Схема говорит, как общаться, а порт — «дверь», через которую это делается. У https адрес по умолчанию на порту 443, у http — на 80, поэтому их почти никогда не пишут.
https://site.ru:443/ порт совпадает с «умолчанием», не пишем
http://site.ru:8080/ нестандартный порт — пишем явно
127.0.0.1:5500 тоже порт — это адрес вашего локального сервера.Контент важнее декора
Разметка начинается не с «красоты», а со смысла. Сначала контент и структура, потом стили. Так страница остаётся понятной даже без CSS и JavaScript.
Вёрстка и программирование
Вёрстка — превращение макета (или идеи) в HTML/CSS. Программирование — написание логики поведения. В вебе они связаны, но это разные навыки: один делает «форму», другой — «поведение».
Читаемые адреса страниц
Хорошие адреса говорят сами за себя: /blog/cats лучше, чем /page.php?id=55. Это удобно людям и немного помогает поисковикам.
blog/cats.html.Символы в URL и кириллица
В URL разрешены не все символы. Кириллица и пробелы при отправке «кодируются» (например, %20 — пробел), поэтому адреса могут выглядеть страшно.
пробел %20
кириллица %D0%BC... (URL-кодирование)
Иерархия папок проекта
Проект живёт в папке, внутри которой — подпапки: css/, js/, images/. Порядок экономит часы: браузер ищет файлы по относительным путям.
my-site/
├── index.html
├── about.html
├── css/ style.css
├── js/ main.js
└── images/ photo.jpg
css/style.css из корня, ../images/photo.jpg из подпапки.Первая самостоятельная правка
Быстрый практикум: измените заголовок <h1> на своей странице и посмотрите, как это отразится в DevTools — снова найдите его в инспекторе и поправьте прямо там.
Куда ведёт ссылка: осмотр адреса
В любой адрес можно «заглянуть» по частям. Наведите курсор на ссылку — внизу браузера появится статус-бар с адресом. Это бесплатная проверка, куда вы попадёте.
HTML — это не скучно, а структурно
HTML часто недооценивают: «ну, теги и теги». Но это язык, на котором компьютеры понимают смысл ваших страниц. Хорошая разметка — сильный навык, а не «простое ремесло».
Формы: зачем полям атрибут name
Атрибут name задаёт «ключ», под которым данные поля полетят на сервер. Без имени поле просто отправит пустоту — сервер не поймёт, что это было.
<input name="email" type="email">
<!-- уйдёт так: email=ivan@mail.ru -->
Формы: пароль — тип password
type="password" прячет введённое под точками — защита от «гляделки через плечо». Сами данные при этом идут в открытом виде, если нет https.
<label>Пароль<input type="password" name="pass"></label>
https и методом post — так пароль не попадёт в историю.Формы: поиск — тип search
type="search" почти как обычное текстовое поле, но браузер добавляет крестик очистки и учитывает «поисковую» семантику.
<input type="search" name="q" placeholder="Найти на сайте">
Формы: url и tel
Типы url и tel подсказывают браузеру, что в поле адрес или телефон: на телефонах появится нужная клавиатура, а браузер проверит формат.
<input type="url" name="site">
<input type="tel" name="phone">
Формы: date и time
Типы date, month, time, week дают браузерный календарь вместо ручного ввода. Пользователю не приходится угадывать формат даты.
<input type="date" name="birthday">
<input type="time" name="meeting">
2026-09-20). Формат для показа на странице настраивается отдельно.Формы: range и его настройка
type="range" — ползунок: удобно для цен, громкости, оценок. Значение уходит как число из min/max.
<input type="range" name="rating" min="0" max="10" value="5">
Формы: value — значение по умолчанию
Атрибут value задаёт начальное значение поля. Пользователь может его поменять — это подсказка, а не ограничение.
<input type="text" name="city" value="Москва">
value с placeholder: первый — реальные данные, второй — временная подсказка, которая исчезает при вводе.Формы: обязательные поля required
Атрибут required запрещает отправить форму, пока поле пустое. Браузер сам подсветит проблему и объяснит пользователю.
<input type="email" name="email" required>
Формы: novalidate и formnovalidate
Отключить встроенную проверку браузера можно целиком (novalidate на форме) или для одной кнопки (formnovalidate). Полезно, когда поля проверяет свой скрипт.
<form novalidate>
<button formnovalidate>Черновик</button>
</form>
Формы: загрузка файлов и enctype
Для передачи файлов форме нужен enctype="multipart/form-data". Без него файл уйдёт текстом — или вовсе потеряется.
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="photo">
</form>
post + enctype. Другой пары для удобной загрузки нет.Формы: поле вне формы — атрибут form
Атрибут form="id-формы" привязывает поле к форме, даже если оно стоит за её пределами. Выручает при сложных сетках из блоков.
<form id="f"></form>
...
<input name="query" form="f">
form — для редких исключений, а не ежедневный приём.Формы: подсказки автозаполнения
Браузер запоминает введённое, если атрибут autocomplete совпадает с ожидаемым («email», «name», «tel»). Это экономит пользователям время.
<input type="email" name="email" autocomplete="email">
autocomplete="one-time-code", чтобы браузер не «помогал» не тем значением.select: список с видимыми строками
У <select> есть атрибут size — он превращает выпадающий список в список с несколькими видимыми строками.
<select name="month" size="3">
<option>Январь</option>
<option>Февраль</option>
<option>Март</option>
</select>
option: подпись и длинные списки
У <option> есть атрибут label — короткое название для показа. А длинные списки опций помогают читаться с помощью <optgroup>.
<option value="msk" label="Москва">Москва, Россия</option>
Как разметить анкету: пример
Соберите всё вместе — форма анкеты на семантических тегах:
<form method="post">
<fieldset>
<legend>Контактные данные</legend>
<label>Имя<input name="name" required></label>
<label>E-mail<input type="email" name="email" required></label>
</fieldset>
<button type="submit">Отправить</button>
</form>
Практика: страница «Обо мне»
Задание: сделайте страницу about.html — заголовок, абзац о себе, список увлечений, одна ссылка на ваш любимый сайт. Без CSS: важно почувствовать структуру.
<h1>Обо мне</h1>
<p>Меня зовут Аня, я учусь вёрстке.</p>
<h2>Мои увлечения</h2>
<ul>
<li>Фотография</li>
<li>Походы</li>
</ul>
Что попробовать после урока 1
Малые эксперименты закрепляют лучше чтения. Попробуйте три упражнения:
- Поменяйте заголовок и текст своей страницы, откройте заново;
- Добавьте списки и посмотрите их «голый» вид;
- Поправьте текст прямо в DevTools и сбросьте страницу.
Типовая структура сайта
У большинства сайтов одинаковая анатомия: шапка с навигацией → основной контент → подвал (контакты и ссылки). Эти части в HTML называются header, main, footer.
<header>Логотип и меню</header>
<main>Главное содержание страницы</main>
<footer>Контакты, копирайт</footer>
Как люди читают страницы
Веб-читатели не вчитываются — они сканируют: F-паттерн (текст сверху слева), первые слова заголовков, подчёркнутое и перечисленное. Структурируйте контент под это.
- Первый абзац — суть, дальше детали;
- Маркированные списки «читаются» быстрее сплошного текста;
- Смысловые заголовки помогают пропускать лишнее.
Ошибка 404: что это и куда ведёт
404 — ответ сервера «страница не найдена». Частая причина: опечатка в адресе или переименованный файл. Пользователь попадает сюда, если ссылка где-то устарела.
Кракозябры и их причины
«Кракозябры» — это текст, прочитанный не в той кодировке. Файл в UTF-8 без тега charset или документ в CP1251 на странице с UTF-8 дадут примерно одинаковую кашу.
<meta charset="UTF-8"> в документе и сохранение файла редактором в UTF-8.meta keywords: почему это в прошлом
Раньше мета-тег keywords помогал поиску. Теперь им злоупотребляли (вставляли чужие популярные слова) — и поисковики его игнорируют.
<!-- было, сегодня не работает -->
<meta name="keywords" content="выиграть, лайки">
title, description и понятные заголовки — они видят реальную пользу.alt для служебных картинок
Если картинка чисто декоративная (иконка, разделитель), пустое alt="" — правильный выбор: скринридер пропустит её.
<img src="decor.png" alt="">
Чек-лист «голой» страницы
Перед тем как переходить к CSS, прогоните страницу по маленькому чек-листу:
- Один
h1и осмысленная иерархия; - Все теги закрыты и вложены верно;
- Есть
title,charset,viewport; - Картинки с осмысленным alt, данные в таблицах/списках.
Что такое форма по смыслу
Форма — мостик от пользователя к данным: поля собирают ввод, кнопка отправляет его, сервер отвечает. Даже поиск в Google — это форма, у которой поля спрятаны за красивым интерфейсом.
Тег form: область действия
<form> очерчивает зону «эти поля отправляются вместе». Всё, что попало в тег, отправляется кнопкой внутри него — при условии атрибутов action и method.
<form action="/send" method="post">
<p>Этот абзац «принадлежит» форме.</p>
</form>
Разница между URL и путём к файлу
URL — полный «почтовый адрес» ресурса (с доменом и протоколом). Путь к файлу — маршрут внутри проекта (css/style.css). Браузер понимает оба, но это разные сущности.
URL: https://site.ru/css/style.css
Путь: css/style.css (относительно текущей папки)
Абсолют: /css/style.css (от корня сайта)
/ удобна, когда структура сайта стабильна — её не нужно переписывать из подпапок.Зачем элементы и атрибуты одновременно
Элемент — «что это» (<input>, <a>), атрибут — «как его настроить» (type, href). Одна пара тегов может выглядеть по-разному в зависимости от атрибутов.
<input type="text"> <!-- текст -->
<input type="checkbox"> <!-- галочка -->
<input type="date"> <!-- календарь -->
Как проверять знание тегов на практике
Зубрить теги бессмысленно — они запоминаются через применение. Откройте любой вопрос: «как сделать список?» — и найдите ответ своим кодом.
- Сначала придумайте задачу: список, форма, ссылка;
- Разметьте по памяти;
- Проверьте в браузере и уточните по валидатору.
План первого сайта-визитки
Визитка — традиционная цель новичка. Продумайте заранее структуру, и уроки лягут на неё естественно:
index.html главная: имя, чем занимаюсь
about.html обо мне (структура из урока 1)
projects.html работы: список или карточки
contacts.html форма обратной связи
Экраны и пиксели: основы верстальщику
Размеры на экране живут в CSS-пикселях, а на маленьких экранах плотность выше. Верстальщику важно понимать: «ширина 320px» — это дизайн для телефона, «1200px» — для десктопа.
Адаптивность: одно предложение
Адаптивная страница выглядит удобно на телефоне, планшете и десктопе — контент не ломается и не вылезает за экран. За ингредиенты (fluid-сетки, media queries) возьмёмся в уроках CS.
DevTools: вкладки для верстальщика
Сюжат четыре вкладки: Elements (HTML+CSS), Console (ошибки JS), Network (что качается), Device toolbar (мобильный вид). Начните с Elements — она нужнее всего.
Разбор чужой страницы в DevTools
Смотреть чужой код — легальный и лучший способ учиться. Откройте любой сайт, найдите в Elements шапку, меню, карточку — и посмотрите, из каких тегов они собраны.
Git: версии для одного человека
Git — система контроля версий: сохраняет историю изменений. Даже одному человеку она полезна: «сломали — откатились», «эксперимент не удался — вернулись». Ваш первый проект уже можно положить в репозиторий.
git init
git add .
git commit -m "первая страница"
Проверка результата в трёх браузерах
Прежде чем считать страницу готовой, откройте её в Chrome, Firefox и Edge (или Safari). Разница в пару пикселей — норма, серьёзные расхождения — сигнал.
Первый сайт: ошибки новичков
Самые частые из них вы уже знаете, но они повторяются у всех:
- Незакрытые теги и поплывшая вложенность;
- Кириллица и пробелы в именах файлов;
- Забытый
charsetи «кракозябры»; - Нет
viewport— телефон «не понимает» страницу.
От одной страницы к многостраничнику
Сайт растёт из одной страницы: добавляете файл — появляется новая страница, связываете их ссылками — получается сайт. Никакой магии, просто папка с файлами HTML.
index.html ←→ about.html ←→ contacts.html
Итог урока 1: что вы уже умеете
После первого урока вы умеете: создавать HTML-файл, размечать текст и списки, делать простые формы, открывать страницу в браузере и смотреть её в DevTools. Это база для всех следующих уроков.
Куда дальше: урок 2 — теги и атрибуты
Дальше вы выучите «алфавит» HTML: семантические теги для текста, списков, цитат и блоков, а также правила их сочетания. Сложность вырастет, но основа уже есть.
Практика против теории: как учить HTML
Чтение даёт базу, практика — навык. Правило 20/80: двадцать минут теории, восемьдесят — своих экспериментов. Каждое новое знание тут же проверяйте в коде.
Почему «руки не запоминают» теги
Плохой память на теги — симптом нехватки практики, а не дурной головы. Начните каждый день с короткой разметки (список, форма), и через неделю теги станут «своими».
Место HTML в стеке разработчика
HTML — не единственный «язык» фронтенда, но фундамент: CSS одевает его, JavaScript оживляет. Без прочного HTML знание остальных уровней дрожит.
Сколько тегов нужно учить
В HTML порядка ста+ тегов, но активно используются двадцать-тридцать. Начните с самых частых, остальное будет появляться по мере задач.
Мелочи, которые «роняют» страницу
Кажется ерундой, а ломает: лишняя кавычка в атрибуте, русская «о» в названии тега, пробел в пути к файлу, забытая закрывающая скобка в атрибуте. Каждая такая мелочь — минута дебага.
Как «починить» испорченную страницу
Страница разъехалась или не открылась? Система поиска должна быть спокойной:
- Сверьте разметку в DevTools — где «поплыло»?
- Проверьте парные теги и пути к файлам;
- Уберите последние изменения (пока не Git — копия файла);
- Прогоните через валидатор W3C.
Финальное упражнение урока 1
Соберите мини-проект «первая страница»: заголовок, введение, список навыков, форма с одним полем и кнопкой, ссылка «наверх». Откройте в трёх браузерах и проверьте по чек-листу.
Самый первый файл: страница «Привет»
Любой сайт начинается с одного файла: создайте index.html, впишите каркас и откройте в браузере. Уже в первой строке видно, что HTML — это текст с правилами.
<!DOCTYPE html>
<meta charset="UTF-8">
<title>Привет</title>
<h1>Привет, мир!</h1>
Слэши в путях: косые правила
В путях HTML-файлов разделитель — косая черта «/». В адресах страниц она же отделяет «папки» сайта. Это универсальная «дорога»: от имени файла до URL.
<img src="images/photo.jpg">
<a href="about.html">О нас</a>
Пробелы и табы: только для читаемости
Множество пробелов подряд браузер схлопывает в один. Отступы нужны не машине, а вам: правильная вложенность — половина «читаемости» разметки.
<ul>
<li>один</li>
<li>два</li>
</ul>
Редактор кода: что выбрать новичку
Блокнот хватит, но редактор «заряжает»: подсветка синтаксиса, автозакрытие тегов, живой предпросмотр. VS Code — бесплатно, по-русски, с множеством дополнений.
Как браузер строит страницу из кода
Маршрут: HTML-текст → разбор в дерево DOM → стили → рисование на экране. Понимание «пайплайна» объясняет, почему страница иногда «скачет» при загрузке.
«Прощаемые» ошибки браузера
Браузер пытается «достроить» пропущенный закрывающий тег — но не всегда так, как вы хотели. Не полагайтесь на снисходительность: закрывайте теги.
<p>Текст без закрытия
<p>Второй абзац
Кодировка против «кракозябр»: детали
Кракозябры — это байты, прочитанные не той кодировкой. Мета-тег charset=UTF-8 в head сообщает браузеру, как «прочитать» файл. Отсюда всё начинается.
<meta charset="UTF-8">
head против body: что где живёт
head — «служебный отдел»: мета, стили, скрипты, заголовок вкладки. body — видимое содержимое страницы. Пока они не спутаны — порядок в документе.
<head>
<title>Заголовок вкладки</title>
</head>
<body>видимый контент</body>
Валидатор W3C: как проверить страницу
Официальный валидатор (validator.w3.org) «прочитает» ваш HTML и перечислит ошибки и предупреждения по стандарту. Отличная «вторая пара глаз» для новичка.
Описание и ключевые слова: meta на деле
Один «служебный» тег отвечает за текст под результатом поиска. Описание пишет человеку, заголовок — и человеку, и поиску. Слова — ваша «витрина».
<meta name="description"
content="Уроки веб-разработки для новичков">
Папки assets, css, js: порядок всему
Маленький сайт живёт без папок, но привычка окупится: стили в css/, скрипты в js/, картинки в images/. Через месяц вы легко найдёте любой файл.
site/
index.html
css/style.css
js/main.js
images/photo.jpg
Навигация по файлам в редакторе
В VS Code переключайтесь между файлами мышью или Ctrl+P (быстрый поиск). Когда уроков много, «перепрыгивание» между HTML и CSS — основной темп работы.
TODO-заметки прямо в HTML
Комментарий <!-- TODO: добавить цены --> — «личная записка» для будущего вас. Так недостроенное не теряется, пока страница «дозревает».
<!-- TODO: переписать текст под бриф -->
lang: язык страницы и его код
Атрибут lang на html — «язык документа»: скринридеры читают с нужными интонациями, поиск понимает аудиторию. Для русского — lang="ru".
<html lang="ru">
Почему полезно печатать код вручную
Сниппеты и автозакрытие экономят секунды, но «печатать руками» учит: вы запоминаете теги, чувствуете структуру и не теряетесь при чтении чужого кода.
Публикация на GitHub Pages
Готово — и хочется показать? GitHub Pages хостит статические страницы бесплатно: закоммитили файлы в репозиторий, включили Pages — и у вас есть адрес вида username.github.io.
<a href="https://username.github.io/">
Мой первый сайт</a>
Частые опечатки в HTML
Лишняя кавычка, закрытый не тот тег, имена файлов с пробелом, два «=» в атрибуте — классика опечаток. Спокойствие и валидатор разбирают их за минуту.
<img src="images/photo.jpg" class="photo"> // src без кавычки — «тихая» ошибка
Стратегия чтения чужого кода
Чужие страницы — лучший учебник: откройте в инспекторе, «прочитайте» структуру от корня к тегам, отметьте для себя приёмы. Так вы учитесь «сверху вниз», как браузер.
Контраст текста: читаемость всем
Цвет фона и текста должны различаться достаточно, чтобы читал и «плохой» экран, и человек со зрением послабее. Контраст 4.5:1 — рабочая норма для обычного текста.
Как измерять прогресс в разметке
Прогресс — не «прочитал главу», а «сделал страницу». Поняли таблицу — сверстайте расписание; поняли формы — соберите анкету. Один проект на одну тему.
Поля и их типы: как устроена форма
Каждое поле формы — это input с типом: text, email, number... Тип решает, какую клавиатуру покажет телефон и как браузер проверит ввод. «Правильный» тип — половина валидации.
<input type="text" name="city">
<input type="email" name="mail">
Группа радиокнопок: один выбор из списка
Радиокнопки объединяются одинаковым атрибутом name: выбрать можно ровно один вариант из группы. Редко, но полезно: переключение «темы», «тарифа», «пола».
<input type="radio" name="theme" value="light"> Светлая
<input type="radio" name="theme" value="dark"> Тёмная
Отмеченный по умолчанию: checked
Атрибут checked делает радиокнопку или чекбокс выбранными сразу при загрузке. Удобно для «согласен с правилами», для варианта «по умолчанию» в группе.
<input type="checkbox" checked> Присылать новости
Связка label и элемента: бонус клика
label привязанный к полю атрибутом for (или оборачивающий поле целиком) расширяет зону клика: можно «ткнуть» в подпись, и фокус уйдёт в поле. Доступно и удобно.
<label for="city">Город</label>
<input id="city">
Подсказка-плейсхолдер и его границы
placeholder рисует серый пример внутри поля. Это не замена label: подсказка исчезает при вводе, а подпись остаётся. Используйте оба — напоминание и пример вместе.
<input type="tel"
placeholder="+7 900 000-00-00">
Выпадающий список: size строк
Атрибут size делает select «раскрытым»: видно сразу несколько строк, а не один выбранный пункт. Когда вариантов мало и выбор «на виду» — выглядит естественно.
<select size="3">
<option>Эконом</option>
<option>Стандарт</option>
<option>Люкс</option>
</select>
Ползунок range: значение подписью
input range — ползунок с «дорогой» от min до max и шагом step. Сам ползунок не показывает число: поставьте рядом output, куда скрипт пишет текущее значение.
<input type="range" min="0"
max="100" value="50">
Ввод даты: календарь вместо строки
input type="date" отдаёт калибрированный календарь — удобно с телефона и без ошибок формата. Парой идут time (время) и datetime-local (дата+время).
<label>Дата поездки
<input type="date" name="when">
</label>
Длина поля: minlength и maxlength
maxlength ограничивает, сколько символов разрешено ввести; minlength задаёт минимум, который браузер проверит при отправке. Пароль и комментарий — любимые поля правил длины.
<input type="password"
minlength="8" maxlength="20">
Шаблон номера телефона: pattern
pattern принимает регулярное выражение — «маску» ввода. Например, телефон в формате +7(900)000-00-00. Если ввод не подходит — браузер не даст отправить форму.
<input type="tel" name="phone"
pattern="\+7\([0-9]{3}\)[0-9]{3}-[0-9]{2}-[0-9]{2}">
Неактивные поля: disabled и его цена
disabled выключает поле: оно не принимает ввод и не отправляется. Его «двоюродный брат» readonly только запрещает изменение, но значение уходит на сервер.
<input type="text" value="Только чтение" readonly>
<input type="text" disabled>
Числовое поле: number и стрелки
input type="number" даёт числовую клавиатуру и стрелки-шаги, проверяет min/max/step. Осторожно: «число» здесь — строка с цифрами, к серверу обычно приходит именно строка.
<input type="number" min="1" max="10" step="1">
Телефонная клавиатура: inputmode
inputmode подсказывает, какую клавиатуру показать на телефоне: decimal — цифры, numeric — числа, email — «@» и «.», tel — цифры и символы номера. Поле остаётся text — меняется только клавиатура.
<input type="text" inputmode="numeric"
placeholder="Код из SMS">
Список вариантов: datalist подсказки
datalist подключается к input через атрибут list и «приносит» подсказки при вводе: пользователь выбирает из них или пишет своё. Гибче select — можно своё значение.
<input list="cities">
<datalist id="cities">
<option value="Москва">
<option value="Казань">
</datalist>
Скрытые данные: input hidden
input type="hidden" уносит с формой значение, которое пользователь не видит: id записи, версию формы, токен от бота. Оно участвует в отправке, но не занимает места.
<input type="hidden" name="post_id"
value="42">
Горячие клавиши формы: accesskey
Атрибут accesskey назначает элементу «горячую» клавишу: Alt+буква переводит фокус или активирует. Удобно для форм «по клавиатуре», но комбинации меняются браузерами и раскладками.
<a accesskey="s" href="#search">Поиск</a>
Отправка Enter: поведение по умолчанию
В форме Enter в любом поле обычно «нажимает» первую кнопку submit/button. Это ожидание людей: не путайте его и не вешайте «случайных» обработчиков без причины.
<form>
<input type="text">
<button type="submit">Искать</button>
</form>
Автозаполнение: доверие и настройка
Браузеры запоминают введённое и подставляют заново: имя, почта, пароль. Атрибут autocomplete направляет это «досье» в нужные поля: email, name, current-password.
<input type="email"
autocomplete="email">
Кнопка вне формы: атрибут form
Кнопка связана с формой не вложенностью, а атрибутом form: атрибут задаёт id формы. Так можно расположить кнопку где угодно на странице — даже за пределами тега form.
<form id="reg">...</form>
<button type="submit" form="reg">Сохранить</button>
Итоги форм: чек-лист «живой» формы
Форма готова, когда: тип у каждого поля «правильный», label связаны, есть placeholder примеры, minlength/maxlength заданы, required проставлены, кнопка с type=submit. Проверьте по списку — и отправьте тестовые данные.
Меню из вложенных списков
Иерархическое меню — это список внутри элемента списка: li хранит ul с подпунктами. Глубина «веток» читается по вложенности, а не по классам.
<ul>
<li>Курсы
<ul>
<li>HTML</li>
<li>CSS</li>
</ul>
</li>
</ul>
Нумерация с продолжением: start
Атрибут start задаёт стартовое число нумерованного списка. Удобно, когда статья продолжает нумерацию «с 41-го пункта» или список начинается не с единицы.
<ol start="3">
<li>третий пункт</li>
<li>четвёртый</li>
</ol>
Маркеры списков: circle, square, disc
У маркированного списка три «родных» маркера: disc (точка), circle (кольцо), square (квадрат). Выбор — через CSS list-style-type. Это про вид, смысл остаётся «перечисление».
<li style="list-style-type: square">пункт</li>
Один h1 на страницу
На странице обычно один h1 — «заголовок документа». Дальше идут h2 для разделов, h3 для подразделов. Иерархию читают люди, поисковики и скринридеры.
<h1>Учебный курс по HTML</h1>
<h2>Основы тегов</h2>
<h3>Как устроен тег</h3>
Структура страницы: header, main, footer
Три «зоны» есть у каждой страницы: header (шапка), main (содержимое), footer (подвал). Добавьте nav для навигации и aside для допов — и каркас почти готов.
<header>шапка</header>
<nav>меню</nav>
<main>основное</main>
<footer>подвал</footer>
Декоративная картинка: пустой alt
Если картинка ничего не сообщает — пусть alt будет пустым (alt=""). Скринридер пропустит её молча. Текст «фото» или «картинка» лишь шумит для читающего вслух.
<img src="divider.svg" alt="">
SEO-связка: title, description, alt
Три «полки» поисковика: title (заголовок результата), description (анонс), alt у информативных картинок. Заполнены осмысленно — страница понятнее и человеку, и поиску.
Карта якорей: навигация по длинной странице
Для длинной страницы удобно «оглавление»: список ссылок на якоря через href="#id". Имя якоря — id любого элемента, не обязательно в начале страницы.
<a href="#chapter2">Глава 2</a>
<h2 id="chapter2">Глава вторая</h2>
Браузерные отступы текста
До CSS браузер уже рисует «что-то читаемое»: абзацы с отступами, списки с маркерами, заголовки жирные. Знание «по умолчанию» помогает предсказать, как ляжет вёрстка.
Инлайн-код в абзаце: тег code
Внутри предложения фрагмент кода оборачивают code: <div>. Так пометка «это код» видна и человеку, и техническим инструментам. Для блока строк — pre + code.
<p>Тег <code><a></code>
делает ссылку.</p>
Сущности на практике: ©, &, <
Знак «&» откроет символ, «<» и «>» спрячут HTML. Строки вроде & и © — «сущности»: безопасный способ вписать спецсимвол в текст.
& // амперсанд
< // знак «меньше»
© // копирайт ©
Практика: страница-«меню» ресторана
Сверстайте меню без стилей: заголовок ресторана, список блюд с ценами, подсказку «готовят 15 минут». Это упражнение тренирует структуру: h1, h2, ul, dl.
<h1>Кафе «Уют»</h1>
<h2>Завтраки</h2>
<ul>
<li>Омлет — 150 ₽</li>
</ul>
Разметка новостей: список статей
Лента новостей — это список: каждый «анонс» — article с заголовком, датой и коротким текстом. Снаружи секция или список, внутри — самостоятельная статья.
<section>
<article>
<h2>Открытие сезона</h2>
<p>Сегодня стартуют соревнования.</p>
</article>
</section>
Аудио на странице: тег audio
audio вставляет аудиофайл: controls показывает плеер, autoplay включает сам, loop повторяет. Для «подкаста», «голоса» и «фона» — это базовый тег мультимедиа.
<audio controls src="voice.mp3">
Ваш браузер не поддерживает аудио.
</audio>
Проверка на сервере: localhost
Локальный сервер (напр. Live Server) притворяется хостингом: адрес вида http://localhost:5500/ — как «настоящий» сайт, только ваш. Так проверяют пути и поведение точно-по-HTTP.
Практика: страница «Свяжитесь с нами»
Соберите «контактную» страницу: заголовок, форма (имя, почта, сообщение), данные связи (телефон, адрес) и карту-ссылку. Все изученные элементы — в одном проекте.
<h1>Свяжитесь с нами</h1>
<p>
<a href="tel:+79000000000">
+7 900 000-00-00</a>
</p>
Чек-лист страницы с формой
Перед отправкой проверьте: каждый input имеет label и name; есть submit; у полей правильные типы; placeholder и required на месте; данные не «секретные» в hidden. Быстрая «перекрёстная» проверка экономит часы после запуска.
Изоляция фрагмента: span и вложение
span — «бессмысленный» строчный тег: нужен, чтобы подчеркнуть кусок текста (стилем или смыслом), не ломая поток. Внутри абзаца — главное применение.
<p>Цвет <span class="hot">красный</span> в моде.</p>
Пустые теги: зачем они нужны
Теги без закрывающего — это элементы, у которых нет содержимого: img, br, input, hr. Они «самодостаточны»: картинка показывает себя, перенос строки разрывает поток.
<img src="logo.png">
<br>
<hr>
Контрольная: всё ли собрано с урока 1
Быстрая самопроверка: страница с DOCTYPE, UTF-8, языком ru; уникальным title и описанием; структура body из заголовков, абзацев, списков; одна форма с полями и кнопкой. Собрали — открывайте следующий урок.
Визитка: одна страница про вас
Сайт-визитка вмещает всё важное на одной странице: кто вы, чем занимаетесь, как связаться. Для практики лучше всего: мало контента — много решений о структуре.
Структура «Обо мне»: блоки и порядок
Типичный порядок блока «обо мне»: кем работаете, что умеете, чем гордитесь. Абзацы короткие, важное — отдельными тегами: strong, ul, ссылки на проекты.
<section>
<h2>Обо мне</h2>
<p>Меня зовут Костя, я учусь вёрстке.</p>
</section>
Портфолио: мини-галерея своими руками
Портфолио из 3–4 работ располагают сеткой или списком: «карточка» — миниатюра, название, ссылка. Всё руками, без фреймворков: вы уже умеете достаточно.
<h2>Мои работы</h2>
<ul>
<li><a href="work1.html">Первая работа</a></li>
</ul>
Блог: страница со статьями
Блог — записи в обратном порядке: свежие сверху. Каждый пост — article с заголовком, датой и кратким вступлением, ссылкой «читать дальше».
<article>
<time datetime="2026-09-01">1 сентября</time>
<h2>Как я учил HTML</h2>
</article>
Лендинг: одна цель на страницу
Лендинг продаёт одно действие: «оставить заявку», «скачать», «записаться». Вся страница ведёт к этому: заголовок → выгода → форма. Структура простая — тренировка смысла.
Многостраничник: навигация между файлами
Три страницы складываются в «сайт» через навигацию: index.html, about.html, contacts.html. Ссылки ведут на относительные пути — и сайт «ездит», если папку перенести.
<nav>
<a href="index.html">Главная</a>
<a href="about.html">О нас</a>
</nav>
Хостинг: как файл становится сайтом
Хостинг — компьютер, который 24/7 «раздаёт» ваши файлы по адресу. Вы кладёте папку на сервер, люди открывают URL — и видят страницу. Локальный «двойник» этого — localhost.
Домен: адрес, который запоминают
Домен (golld.ru) — имя вместо IP-адреса. Его покупают у регистратора и «привязывают» к хостингу через DNS: специальные серверы переводят имя в адрес.
HTTPS: замок в браузере
HTTPS шифрует трафик между браузером и сайтом. Замок в адресной строке — признак «зашифровано». Без него данные формы могут «услышать» по пути. С 2021 года почти все сайты перешли на HTTPS.
Кэш браузера: почему «старая» страница
Браузер запоминает файлы, чтобы не качать их снова. После правки CSS «старый» стиль может остаться в кэше — и страница выглядит «не обновившейся». Это не баг, а экономия.
Мобильные экраны: как проверить самому
Половина посетителей — с телефонов. В DevTools есть «режим устройства»: эмуляция экранов iPhone/Android и «переключение» ширины вручную. Загляните туда перед выпуском.
Жёсткое обновление: ctrl+F5
Обычный F5 — «перезагрузить», но кэш иногда «застревает». Ctrl+F5 (жёсткое) — очистить и загрузить заново. Лекарство от «я же поменял, а оно не работает».
Инспектор кода: осмотр чужого сайта
Правый клик — «Исследовать элемент»: открывается DOM и стили любой страницы. Учитесь «читать» вёрстку именитых сайтов: разбирайте, как устроены их блоки.
Копирование вёрстки: этично ли
Перенимать приёмы (структуру, подход) — нормально; копировать чужие тексты и шрифты целиком — нет. В сетях и вёрстки «фишки» общие, но результат должен быть ваш.
Веб-стандарты: почему «сверху вниз»
HTML описывают стандарты W3C и WHATWG: браузеры обязаны «читать» одинаково. Поэтому одна страница открывается везде. Стандарты — это «общий язык» интернета.
Доступность: инклюзивный сайт
Сайт «для всех» — с alt у картинок, подписями у форм, читаемым контрастом. Слабовидящие, глухие, люди с ограничениями моторики пользуются теми же страницами, что и вы.
Цифровой след: что видно в поиске
Title, description, структура заголовков — то, что покажет поиск вашей странице. Вы формируете «визитку» ещё до того, как кто-то нажал ссылку.
Профессия «верстальщик»: что сейчас
«Верстальщик HTML/CSS» — часть «frontend-разработчика». Сейчас востребованы навыки: семантика, адаптивность, доступность, аккуратность. Это отличная точка входа в веб-разработку.
Пути развития: верстальщик или разработчик
Дальше развилки: углубляться в интерфейсы (анимации, доступность, дизайн-системы) или идти в код (JavaScript, затем фреймворки). Обе ветки растут из базы HTML/CSS.
Итоги урока 1: план роста на месяц
Вы владеете базой: структура документа, теги, формы, пути, публикация, DevTools. План на месяц: сверстайте визитку → «меню» → блог → портфолио; выложите одну страницу на GitHub Pages.
Вложение короткое: тег внутри тега
Один тег может жить внутри другого: в абзаце, в li. «Внутренний» тег закрывается раньше «внешнего» — строго «по-матрёшечному».
<p>Краткое <strong>описание</strong>.</p>
Атрибут всегда с именем и значением
Атрибут — пара «имя=значение» внутри открывающего тега: href="page.html". У одних атрибут значение обязательно, у других его можно опустить (boolean-атрибуты). Имя — латиницей, без пробелов.
Кавычки внешние и внутренние в атрибуте
Значение можно оборачивать в «двойные» или «одиночные» кавычки. Если внутри есть кавычка одного вида — используйте другой: title='Он сказал "да"'.
Строки и пробелы: браузер «склеивает»
Несколько пробелов, табов и переносов строк браузер «схлопывает» в один пробел. Раскладка кода «в столбик» не «ломает» текст — наоборот, делает его читаемым.
<p>Тайные
пробелы
схлопнуты</p>
<br> или <pre>, а не «свои» пробелы.Комментарии: заметки не для показа
Комментарий в HTML пишется так: <!-- текст -->. Его не показывают браузер, но видят разработчики в исходном коде. Комментарии поясняют «сложные места» и «отключают» блоки на время.
<!-- шапка страницы -->
<header>...</header>
Верхний и нижний регистр тегов
HTML не различает регистр тегов: <P> и <p> — одно и то же. Но «нижний» регистр — общепринятая норма: легче читать и согласовано с XHTML-наследием.
Заброшенные теги: что «устарело»
Теги-«реликвии» (<font>, <center>, <marquee>) устарели: их заменил CSS. Современный HTML их «терпит», но не рекомендует. Не вводите «старинный» код в новые страницы.
<center> в старом коде — замените на CSS text-align/flex-центр.Источники HTML: файлы и генераторы
HTML пишут руками в редакторе, но страницы часто «собирают» генераторы (CMS, конструкторы, фреймворки). Начинающему важнее понимать «простые» куски, чем «говорить» генератору вслепую.
Структура документа: два «больших» блока
Каждый HTML-документ делится на head (служебное) и body (видимое). В head — метаданные и подключения, в body — контент страницы. «Скелет» так читается всегда.
Порядок подключений в head
Раньше грузятся мета-теги и «критические» стили; скрипты — «после» или с отложенной загрузкой. Порядок влияет на скорость отображения. «Тяжёлые» ресурсы — «ниже», «быстрые» — «выше».
Заголовок вкладки: title как «строка окна»
title — текст во вкладке браузера и в выдаче поиска. Он должен «рассказывать» страницу: коротко, информативно, с «брендом». Честный title — «визитка» вкладки.
<title>Урок 1 — Основы HTML</title>
Язык страницы: атрибут lang
<html lang="ru"> говорит браузеру и скринридерам, на каком языке текст. От кодировки зависит «подсказки правописания», «перевод», «озвучка». Правило: lang — всегда.
Кодировка файла: одинаково на всех экранах
DOCTYPE и charset="UTF-8" «договариваются», как читать символы. Без объявления кодировки кириллица может «рассыпаться». Текстовый файл должен быть сохранён «в той же кодировке».
<meta charset="UTF-8">
Читать страницу: источник и инспектор
«Просмотр кода страницы» (Ctrl+U) показывает исходный HTML; «Инспектор» (F12) — «живое» DOM-дерево. Исходник — «то, что прислали»; инспектор — «то, что построил браузер».
Валидатор: формальная проверка
Валидатор проверяет разметку «по спецификации»: закрытые теги, атрибуты, вложенность. Он не «художник», но «страж порядка». Прогоняйте страницы — «мелкие» ошибки уйдут раньше, чем «найдут» браузеры.
«Обновить» страницу: жёсткий и мягкий
F5 — «взять заново», Ctrl+F5 — «забудь кэш, возьми всё заново». После правки CSS «старый» кэш может «держать» старое. Ctrl+F5 — «железный» способ проверить себя.
Сколько страниц: многостраничность
Сайт часто состоит из нескольких файлов: index.html, about.html, contacts.html. Ссылки между ними — относительные пути. «Структура папок» = «структура сайта».
<a href="about.html">О нас</a>
Относительные пути: «отсюда и вниз»
Путь «cat.jpg» — файл рядом; «img/cat.jpg» — в подпапке; «../cat.jpg» — на уровень выше. Относительные пути переносимы: «переезжает» сайт — путь «живёт».
«Корень» сайта: абсолютные адреса
Путь «/assets/style.css» начинается «от каталога сайта» (не от файла). На «локальных» техниках и «в продакшене» работает по-разному. Ставьте «корневые» — когда точно знаете «серверную» структуру.
Файлы-страницы: расширения и пробелы
Страницы — файлы .html; избегайте пробелов и кириллицы в именах: page-2.html вместо «страница два.html». Пробел в URL кодируется «плохо» и путается. «Простые» имена — «спокойные» ссылки.
Заголовки внутри: h3 и h4 на практике
Кроме h1–h2 в разметке живут h3 и h4: подразделы внутри разделов. Иерархия «сложна», но «правильна»: не пропускайте уровни. Скринридер строит «карту» страницы по всем заголовкам.
<h2>Раздел</h2>
<h3>Подраздел</h3>
Абзацы и переносы: p и br
<p> — абзац (блок), <br> — перенос строки «внутри». Абзац разделяет «мысли», br переносит «строку». Не «штампуйте» br ради отступов — там место margin у p.
Маркированные списки: ul и li
<ul> — «набор» пунктов (ul>li). Маркер по умолчанию — «точка». Списки «разбивают» перечисления на «опоры» чтения. Вложенность списков допустима — «двухуровневое» меню.
<ul>
<li>Первый</li>
<li>Второй</li>
</ul>
Нумерованные списки: ol и порядок
<ol> — «последовательность»: шаги, рейтинг, хронология. Нумерацию «ставит» браузер, а не «вручную» текст. Серийность «сама» пересчитывается — удобно при правках.
Списки определений: dl, dt, dd
Словарь-список: dl содержит пары dt (термин) и dd (определение). Характеристики товара, глоссарий, «пара-значение» — «смысловая» пара. Читается «машиной» и «человеком».
<dl>
<dt>Монитор</dt>
<dd>27 дюймов</dd>
</dl>
Цитаты в тексте: q и blockquote
Строчная цитата — <q> (« » добавляют «по ситуации»); большая — <blockquote>. Атрибут cite у q «свешивает» источник. Цитата «внутри» текста — «кавычки», отдельная — «блок».
Изображения: img с alt и без
<img src="foto.jpg" alt="описание"> — картинка. alt — «текст» при её отсутствии и для доступности. Декоративную картинку «обозначают» пустым alt=" ". Не «грузите» картинки «для красоты» без alt.
Ссылки на скачивание: атрибут download
<a href="file.zip" download> — «начать скачивание» вместо «открыть». download «говорят» браузеру «качай». Для PDF и ZIP — «прямое» действие по имени ссылки.
Горизонтальная линия: hr
<hr> — смысловой «разделитель» между частями содержания. «Эра», «акт», «смена темы» — его стихия. «Толстую линию для красоты» лучше рисовать CSS-границей, а «смысл» — hr.
Средства для текста: em и i
<em> — смысловой акцент (интонация); <i> — «начертание» (термин, название, иноязычное слово). Не путайте: «эмоциональное» — em, «типографское» — i.
Код в тексте: code и pre
<code> — «строчный» фрагмент кода; <pre> — блок с сохранёнными переносами и пробелами. Для «разметки в разметке» символы «<» и «>» экранируют. Код «в статье» — «мелким моноширинным».
<p>Пишем <code><h1></code>.</p>
Даты и время: тег time
<time datetime="2026-09-20">20 сентября</time> — «машиночитаемая» дата. Осень «правильная» у поиска и календарей. Текст для «людей», datetime — «для машин».
Выделение «для роботов»: тег mark
<mark> подсвечивает «важное для справки»: совпадения поиска, ключевые слова. По умолчанию — жёлтая «подсветка». Смысл — «полезная» метка, а не «любая» краска.
Переносы слов: тег wbr в помощь
<wbr> — «место возможного переноса» длинного слова. Длинные URL и «термины» «в тесноте» переносятся «по-доброму». Браузер переносит «только в нужную минуту».
Если символ не «на клавиатуре»: сущности
«©», ««», «—», « » — HTML-сущности: «кодовые» символы. Нужны для «неудобных» знаков и «надёжной» вёрстки кавычек/тире. «&» — сам «символ амперсанда» как сущность.
Пробел «недробищийся»:
— «неразрывный» пробел: слова не «разрывают» на переносе. «и 500 ₽» — «единое» целое. Цифры с «единицами» живут «вместе», когда « » между ними.
Подстрочные и надстрочные: sub и sup
<sub> — «индекс» (H₂O), <sup> — «степень» (м²). Формулы и единицы — «их» стихия. Смысл «ниже/выше» строки — «начертание», но «математический» ввод — «в типографике».
Термин и его расшифровка: abbr
<abbr title="HyperText">HTML</abbr> — сокращение с расшифровкой. Наведение «показывает» title; скринридер «читает» текст. Акронимы «объясняются» при первом вхождении.
Ссылка на телефон и почту: tel и mailto
href="tel:+7..." и href="mailto:hi@site.ru" — «живые» контакты: звонок и письмо «по клику». На телефоне «набирает», на десктопе — «почтовик». «Международный» формат — без пробелов.
Скачивание с именем: download="имя"
Значение атрибута download задаёт «имя» скачиваемого файла: download="program.pdf". Пользователь «сохраняет» с «вашим» именем. Удобно для «шаблонов» и «программ» из «безликих» ссылок.
Формы: что «собирается»
Форма «собирает» данные пользователя: form содержит поля input, textarea, кнопки. Атрибут name у поля — «имя» данных. После отправки данные «уходят» на сервер (или «ловятся» скриптом).
Поле ввода: input с типом text
<input type="text" name="имя"> — «строка» для текста. type задаёт «вид»: text, email, number, date... name — «адрес» данных, placeholder — «подсказка внутри».
Подпись к полю: label
<label for="имя"> привязан к полю: клик по тексту «фокусирует» поле. Скринридер «читает» label как имя поля. Пара «label+input» — «минимальная» доступная форма.
<label for="email">Почта</label>
<input id="email" type="email">
Большой текст: textarea
<textarea></textarea> — «многолинейное» поле: комментарии, отзывы. «Переносы» и «строки» работают «как в блокноте». Размер задаётся CSS (не «атрибутами» ширины-строк).
Выбор из списка: select и option
select — «раскрывающийся» список вариантов (option). value у option — «значение» пункта, текст — «показываемый» вариант. «Выбираемое множество» — его родная задача.
<select name="city">
<option value="msk">Москва</option>
<option value="spb">Санкт-Петербург</option>
</select>
Чекбокс: галочка да/нет
<input type="checkbox"> — «флажок» из «независимых» пунктов. Согласие с правилами, «выбор нескольких». «Меченый» (checked) — «включён по умолчанию». value «согласия» — на «отправку».
Радио-кнопки: один из группы
<input type="radio"> — «селекция одного» в группе: одинаковый name у всех вариантов. Выбрать можно только один. «Число для 1» — «по выбранному радиокоду»: value разное, имя — общее.
Кнопка отправки: input submit
<input type="submit" value="Отправить"> — «отправляет» форму. Без submit форма «отправки» не имеет. Кнопку «нажимают» и Enter в поле «запускает» её.
Кнопка сброса: reset осторожно
<input type="reset"> «сбрасывает» форму к начальному виду. Пользователь «потерял» ввод — страшно. В «простых» формах reset обычно «лишний»: разочаровывает «случайными» кликами.
Скрытое поле: hidden-значение
<input type="hidden" name="session" value="abc"> — «невидимое» поле для «служебных» данных формы. «Не показывается», но «отправляется». Токены, id записи, «состояния» — его работа.
Обязательное поле: required
Атрибут required «не отпускает» форму без заполнения: браузер «подскажет» и «покажет» ошибку. «Логическая» обязательность — на server-стороне; required — «первый уровень» UX.
<input name="email" required>
Ограничение длины: maxlength
maxlength="30" «ограничивает» символы в поле: «счётчик» ввода. Полезно для «публикаций», «био», «кода». «Сервер» тоже «должен верить» maxlength — вдруг обойдут.
Числовое поле: input type="number"
type="number" — «цифровое» поле со стрелками «вверх/вниз». min/max/step «рамки» и «шаг» числа. На телефоне «цифровая» клавиатура. Для «чисел, а не «страниц» — number.
Дата в форме: input type="date"
type="date" — «календарь» в поле: выбор даты без «ручного» формата. Браузер «ставит» свой виджет. «Событие», «бронирование», «доставка» — «календарные» поля его область.
Пароль: input type="password"
type="password" — «замаскированные» символы. «Точки или звёздочки» скрывают ввод. «Безопасность» — это «шифрование» на сервере, а маска — «от глаз». «Вспышка» пароля — отдельная кнопка-«глаз».
Почта и URL: валидность типов
type="email" и type="url" дают «встроенную» проверку формата: браузер «ругается» на «непохожее». На телефоне — «нужная» клавиатура (@, «точки»). «Мягкая» валидация «первого» уровня.
Диапазон: input type="range"
type="range" — «ползунок» для выбора из диапазона: громкость, объём. min/max/step — «границы» и «шаг». «Значение» — в value, «глаз» — свой UI. «Грубая» настройка «ёлочкой» — его место.
Цвет: input type="color"
type="color" — «выбор цвета» со «своей» палитрой браузера. Значение — HEX: #ff4400. Настройки темы, «палитра» редактора — «цветные» поля. «Точная» копия — для «дизайнеров».
Фокус по порядку: tabindex
Нажимая Tab, пользователь «ходит» по интерактивным элементам. tabindex="0" — элемент «в» порядке «обычных»; «положительный» — «первее»; «-1» — «нет в Tab-цепочке» (фокусируется скриптом).
Выключенное поле: disabled
disabled «блокирует» поле: нельзя вводить, «передано» не будет. «Отключено», «недоступно», «ждать» — его слово. Доступность: «не работает» читается ролью «недоступно».
Группа полей: fieldset и legend
Поля «по смыслу» группирует fieldset; название группы — legend. «Контакты», «адрес доставки», «платёж» — «разделы» формы с «заголовком». Скринридер «читает» legend «группе» полей.
<fieldset>
<legend>Контакты</legend>
<label>Почта <input type="email"></label>
</fieldset>
Место для «наведения»: placeholder
placeholder — «пример» или «подсказка» внутри пустого поля. Он «не label»: исчезает при вводе. Уместен «+ подпись», а не «вместо». «Что и как писать» — «подсказка не постоянная».
Направление вращения: autofocus
autofocus «ставит» курсор в поле «при загрузке»: поиск, первый шаг формы. «Экономия клика», но «скролл» может «прыгнуть». Один autofocus на страницу: не «все» поля сразу.
Отправка без кнопки: Enter
Enter в поле «отправляет» форму, если есть submit-кнопка. «Только поле + Enter» — быстрый поиск. Для многострочных textarea Enter «делает» перенос. «Логика Enter» — «свойство формы», не «магия».
Предзаполнение: атрибут value
value="Предзаполнено" — текст в поле «до ввода». Для «fixed» значений; пользователь «меняет». Для «запоминания ввода» — атрибут autocomplete. value «не заменяет» placeholder — это «данные», не «подсказка».
Автозаполнение форм: autocomplete
Атрибут autocomplete="email" говорит браузеру «что это»: имя, почта, телефон. Согласие «дать» из «сохранённого» — браузер «подставляет». «Логичные» типы = «меньше» ввода руками.
Список в подсказках: datalist
datalist — «предложить», но «свободный ввод»: list у input «соединяет». «Город», «валюта», «браузер» — «подсказывает», но «не ограничивает». Список + «свободная строка» — его суть.
<input list="city">
<datalist id="city">
<option value="Москва">
</datalist>
Поиск с очисткой: input type="search"
type="search" — «поисковое» поле: браузер даёт «крестик»-очистку. На телефоне — «поисковая» клавиатура. От chapter-«текст» отличает «ролью» и «кнопкой». Поиск «слушал» — «уважайте» знак х.
Дня и месяца: месяц и неделя
type="month" и type="week" — «выбор» месяца и «недели». Бронирование, отчёты, расписание — «периоды», а не «даты». Формат «значений»: YYYY-MM и «неделя-номер».
Время: input type="time"
type="time" — «часы:минуты» без даты: начало встречи, «занятие». «Полночь» и «24:00» — пограничные значения. Удобен «в паре» с date: «дата+время» — два поля.
Форма и семантика: «правильный» каркас
Форма «в» структуры: главная «несколько» форм — каждая «своя» (поиск vs заявка). «Вложенных» форм «не бывает» — HTML «запрещает». «Правильная» иерархия форм — «спокойная» отправка.
Ссылки и формы: когда что
Ссылка — «переход»: на страницу, к записи. Форма — «отправка»: собрать данные. «Важно»: поиск — форма, «назад к списку» — ссылка. «Гиперссылка на действие» — «scene» «запутывает» систему.
Стилизация без CSS: атрибут выравнивания
align="center", bgcolor — «старые» атрибуты выравнивания и цвета. Они «работают», но «вытеснены» CSS. «Новый» код: стили — в CSS, а «атрибут» — «реликт» хранения.
Универсальный контейнер: div
<div> — «блочный» контейнер без смысла «сам по себе». Его «наполняют» классом: div class="card". Когда «своего» семантического тега нет — div «честный» выбор.
Строчный контейнер: span
<span> — «строчная» обёртка внутри текста: подсветить «слово» стилем. Не создаёт строк, «течёт» в тексте. «Кусочек» с классом — его работа.
<p>Жирное <span class="accent">слово</span>.</p>
Практика: мини-страница «визитка кода»
Соберите страницу со всем из урока: заголовки, абзацы, список, картинка, ссылка, форма с полями. Плюс «иерархию» заголовков и «списки по смыслу». Это ваш «сверхкомпактный» справочник-визитка.
Практика: опросник из полярных типов
Соберите «опрос»: text, radio-группу, checkbox, select, textarea, «обязательные» поля. Отправьте «в никуда» action="#" — и «потеряйте» данные с удовольствием. Формы «в рукаве» готовы.
Практика: меню из вложенного списка
Двухуровневое меню: ul с вложенным ul. «Смысл» — список; «красота» — выпадающее. Скринридер «прочтёт» структуру. На пустом пути «важные» пункты «наверху».
Оценка своей страницы: 5 проверок
Проверьте «пятерку»: 1) h1 один; 2) alt у картинок; 3) label у полей; 4) ссылки «со смыслом»; 5) валидатор «без критического». «Пятёрка» — «двадцатка» страниц «здоровых».
Контрольная работа по уроку 1
Соберите «страницу-конференцию»: тема (h1), описание (p), программы (ol), спикеры (ul с figure), форма заявки. Всё «по семантике» урока. Покажите «решение» — и урок 1 «закрыт».
Атрибуты данных: data-* для своих меток
data-любое-имя — «свой» парный атрибут-метка: data-id="42". JS «читает» их без классов-«закоулков». «Метаданные» элемента: id записи, состояние, конфиг — их дом.
<div class="card" data-id="42">...</div>
Семантические поля: role-атрибут ARIA
role «объясняет» элементу его «роль»: role="button" на div. «Свою» роль сохраняют «нативных» тегов (kbd
«Вертикальный» срез: главное для читателя
Читатель видит «сверху-вниз»: название → суть → детали → призыв. Разметка «на этом порядке»: h1, абзац-введение, статьи, ссылка действия. «Сильная» страница — «сильная» структура.
Про «чтение»: из чего «складывается» страница
Страница = «оглавление» (заголовки), «текст» (параграфы и списки), «медиа» (картинки), «интерактив» (ссылки и формы). Разметка «об этом» «говорит» машине. «Чтение страницы» — «сборка смысла».
Порядок в документе и «путь» чтения
DOM «читается» по порядку разметки: «до» и «после» важны. Кнопка «действия» — «после» объяснений. «Живой» порядок в DOM = «понятные» скринридера и «честные» стили.
«Быстрая» проверка между браузерами
«Один» сайт — «все» браузеры: Chrome, Firefox, Safari, Edge. «Проверяйте» хотя бы «пару»: «расходятся» между собой в «мелочах». Инструменты «dev-режим» и «реальность» — «расход» невелик.
Знакомство с DevTools: краткий обзор
F12 открывает DevTools: «Элементы» (структура), «Стили» (CSS), «Консоль» (JS), «Сеть» (запросы). «Дороги» к «вёрстке» — «Элементы» и «Стили». «Практикуйтесь» с ними с первого урока.
DevTools: «Стили» и отладка CSS
Панель «Стили» показывает «какие» правила «применены» и «откуда». «Отключите» правило галочкой — «увидите» причину «поломки». «Computed» — «финальные» значения. «Эксперемент» тут «бесплатен».
DevTools: консоль для JavaScript
Вкладка «Консоль» выполняет JS «прямо на странице»: «попробовать» выражение, «посмотреть» ошибку. console.log «печатает» туда. «Первая дверь» в программирование страницы — консоль.
Зачем «инструменты разработчика» на уроках
DevTools — «рентгеновский» взгляд на интерфейс: структура, стили, сеть. Учиться «на виду» проще, чем «вслепую». Начинайте «ходить» по инспектору с первого дня — навык «не пропадёт».
Раскрывающийся блок: details и summary
details «упаковывает» контент, который «открывается» по клику на summary. Без JS — «нативные» раскрытия. Атрибут open держит «раскрытым». Частые вопросы, спойлеры, инструкции. «Раскрытие» — «эконом» места страницы.
<details><summary>Ответ</summary><p>… </details>
Термин и определение: dl, dt, dd
Список определений: dl — «контейнер», dt — «термин», dd — «описание». Глоссарии, мета-данные, «пара значение-пояснение». «Пара» может быть «повторной». «Семантика» данных — «аккуратные» пары.
<dl><dt>HTML</dt><dd>язык разметки…</dd></dl>
Подпись у таблицы: caption
caption — «заголовок таблицы» внутри table. Первый ребёнок таблицы. Читается «скринридером» первым. «Тема» таблицы «видна» сразу. Серый стиль «по подпись» — «естественное» оформление.
Группа ячеек: thead, tbody, tfoot
Таблица «делится» на «шапку» (thead), «тело» (tbody) и «подвал» (tfoot). «Стилизация» по частям; «скролл тела» — «голова» видна. Скринридеры «понимают» структуру. «Признак» зрелой вёрстки таблиц.
Заголовок и подпись: figure, figcaption
figure «оборачивает» иллюстрацию, схему, код. figcaption — «подпись» к ней. Связь «рисунок-подпись» «семантична». «Скрытая» цель: «переносить» figure как «блок» с подписью. «Врезки» и «инфографика».
<figure><img …><figcaption>…</figcaption></figure>
Выделение значимого: mark
mark «подсвечивает» часть текста, «найденную» или «важную». По умолчанию — «желтый фон». Поиск «по странице» любит «эту» семантику. Стилизуйте «цвет» выделения. «Маркер» для «цитат» и «ответов» на вопросы.
Дата и время: тег time
time «машиночитаемо» «обозначает» дату/время: datetime="2026-01-01". «Скринридеры» и «календарные» представления читают. «Видимый» текст свободный. «Расписания» и «события» обретают «смысл». «Машина» «понимает», человек читает.
Сокращение: abbr с title
abbr отмечает сокращение: abbr title="HyperText…">HTML. title — «расшифровка» при наведении. Скринридеры «читают» title. «Акронимы» в тексте «объясняются» один раз. «Правило»: расшифровываем I использываем HTML.
Индикаторы: progress и meter
progress — «ход выполнения»; meter — «значение в диапазоне». progress max и value. meter min/max/low/high/optimum. «Полоски» загрузки, «рейтинги», «шкалы». «Встроенные» виджеты без «JS-фигни».
Вводы из списка: datalist
datalist «даёт» подсказки «для» input: опции «подставляются» при наборе. Связь через list="id". «Свободный» ввод + «предложения». «Выпадающие» подсказки «из коробки». «Поля» поиска и «текста» с автодополнением.
<input list="cities"><datalist id="cities">…</datalist>
Группа полей с общим легендом: fieldset + legend
fieldset «собирает» связанные поля; legend — «заголовок группы». «Логические» блоки формы «видны». Скринридер «зачитает» её «группой». «Оформительская» обводка по «желанию». «Анкеты» выигрывают от «группировок».
<fieldset><legend>Данные</legend>…</fieldset>
Автодополнение: атрибут autocomplete
autocomplete подсказывает браузеру «род» значения: name, email, tel, current-password. «Менеджер паролей» и «браузер» помогают. «off» — «отключить» подсказки. «Заполнение» «форм» становится «быстрее». «Уважение» к чужим данным — «on» по умолчанию.
Обязательное поле: required: практический разбор
required «объявляет» поле обязательным: форма «не отправится» без него. Браузер «покажет» сообщение. «Встроенная» валидация «без» JS. «Пометка» обязательных — «звездочки» + legend. «Гигиена» входных данных — «свой тег».
Блокировка ввода: disabled и readonly
disabled — «поле неактивно» (не отправляется). readonly — «только чтение» (значение «в форме»). «Сери» настройки «выключены» — disabled. «Заполненное» кодом поле «не редактируется» — readonly. «Контекст» решает «выбор».
Минимум и максимум: min, max, step
Для number/range — границы и «шаг». range min/max/step; number «те же». «Шкала» «ограничена» «естественно». «Браузер» «не даст» выйти «за рамки» (почти). «Дополнительная» валидация «в JS» — «не лишняя».
Образец ввода: placeholder
placeholder — «серая подсказка» внутри поля, исчезающая при вводе. «Что вводить» — «пример», не «значение». Длинный placeholder «читается» плохо — «лейбл» важнее. «Стилизация» placeholder — псевдоэлемент. «Подсказка» «нейтральна».
Длина строки: maxlength и minlength
maxlength — «потолок» символов; minlength — «минимум». Контроль «имён», «кодов», «номеров». Браузер «подрежет» ввод «через» maxlength. Проверка minlength — «при отправке». «Форма» «держит» «порядок» длины.
Ограничение символов: pattern
pattern — «регулярное выражение» — «шаблон» ввода. «Проверка» при отправке. Например, ^[0-9]{6}$ — «почтовый индекс». Регэкспы — «точный» контроль формата. «Кастомизируемая» валидация «у браузера» в руках.
Проверить перед отправкой: novalidate
novalidate на форме — «отключить» браузерную проверку. «Своя» валидация в JS «берёт» ответственность. Полезно для «двухшаговых» форм. «Намеренный» выбор, не «забытый» атрибут. «Кто проверяет, тот и решает».
Отправка формы: атрибуты action и method
action — «куда отправить»; method — «get» или «post». get — «в адресе» (поиск); post — «в теле» (данные). Отсутствие action — «та же» страница. Формы «живут» с серверами «через» эти атрибуты.
HTML как простой текст в блокноте
HTML — «плоский» текст с «разметкой». Начните с «пустого» файла и наберите «структуру» руками. Блокнот «не мешает» учиться: без «подсветки» — «мышцу» «аттенции». «Сохраните» как .html и «откройте» браузером. «Пишете» вы — «читает» браузер.
расширение .html: зачем оно
Расширение «говорит» системе: «это веб-страница». Двойной клик — «откроется» браузером. .html vs .htm — «историческая» близнец; используйте .html. «Имена файлов» — «без пробелов», «латиницей», kebab-case: my-page.html. «Расширение» — «паспорт» формата.
Просмотр в браузере: путь привычки
Сохранить → переключиться в браузер → обновить. Каждая «правка» — «цикл» три секунды. Быстрее «заметить» «эффект». Alt+Tab «пляшет» между окнами. «Цикл» правка-вид — «ритм» вёрстки. «Обновление» — «пульс» разработки.
Редактор: чем писать HTML
VS Code — «фаворит» новичков: подсветка, автозакрытие, отступы. Notepad++ — «лёгкий». Блокнот — «жёсткий тренажёр». Выбор — «по вкусу», «не по моде». Плагины «придут» позже. «Главное» — «ваше внимание», «не» «инструмент».
Структура страницы: скелет ввода
Каждая страница — «три зоны»: doctype, head, body. В head — «служебная» настройка (мета, заголовок, CSS). В body — «видимое» содержимое. Первые две строки — «вечная» гимнастика. «Скелет» — «универсальный» для любых сайтов.
<!DOCTYPE html>
<html lang="ru">
Служебная зона head: метаданные
head «не виден» на странице, но «важен» для браузера и поисковиков. title, meta charset, meta viewport, link для CSS. «Настройки» документа «до» открытия. head «невидимой» — «киностудня» страницы. Don't «путайте» с header.
Кодировка: как кириллица не ломается
Без meta charset браузер «угадывает» кодировку и «ошибается» — «кракозябры». utf-8 — «мировой» стандарт: и русский, и эмодзи. meta charset «до» остальных тегов head. «Сохраняйте» файл «в» UTF-8 (редактор). «Кодировка» — «первая» гигиена.
Заголовок вкладки: title тега
title «живёт» во вкладке браузера и «в результатах поиска». «Точный» и «краткий»: "HTML за 9 уроков — главная". Не «перегружайте» «ключевиками»: страница «недоумевает». title — «визитка» страницы. «Первый» тег, который «увидят».
meta description: аннотация для поиска
description — «краткое описание» страницы для поисковых систем. Показывается «под заголовком» в выдаче. 150–160 символов; «вовлечение» — «через» текст. Не «дублируйте» title. «Уникальная» аннотация — «приглашение» кликнуть.
meta viewport: окно на мобильном
meta viewport «контролирует» ширину на телефонах: width=device-width «совпадает» с экраном. Без него — «мелкий текст» и «горизонтальный» скролл. initial-scale=1 — «стартовый» масштаб. «Мобайл-фриендли» начинается здесь. «Одна строка» стоит «тысяч».
Стили на странице: тег style
style «вкладывает» CSS прямо в HTML (в head). Для «демо» и «малых» проектов — «удобно». Для «больших» — «вынесите» в .css-файл. style «не обязан» быть в head (валидно и в body, но «не стильно»). «Фиксируйте» стили «рядом» на ранних уроках.
Семантика выделения: strong вместо bold
strong — «важность», b — «просто» стилевой «жирный». Представьте: скринридер «читает» strong с «усилением», b — «молчит». Выбирайте «по смыслу». «Ключевые слова» — strong; «декорация» — b. Два тега — «разные судьбы» при одной «толщине».
em против cite: где чьё ударение
em — «смысловое ударение»: мысль «сама» меняет оттенок интонации. cite — «название» произведения (книга, фильм): курсив. «Я» читал «Войну и мир» — cite. «Я» читал «Войну и мир» — em (ударение, что именно). Разница — «смысл, а не шрифт».
Старый добрый i: не только курсив
i — «чужое» слово, термин, мысль, название корабля — класс исторически «курсив». Не «ломайте» смысл: i для «иноязычного» слова, названия, мысли. b/strong, i/em — «две пары»: декорация против смысла. semantic-lite «встроено».
Маленькие детали: small как сноска
small — «мелкий текст»: дисклеймеры, копирайты, примечания. Не «весь» мелкий текст — «только» дисплеймеры. Юридическая «мелочь» «внизу» — classicа small. «Не злоупотребляйте» — «шлифуйте» важное крупно. small «принижает» роль с осмыслением.
Перечёркнутое и исправленное: s, del, ins
s — «устаревшее» (цена была). del — «удалённое» из актуальности. ins — «добавленное» позже. s «просто» зачёркивает; del — «семантика удаления» со временем (datetime). ins — «вставка» правки. «Редакторские» метки «в» живой документ.
Нижний и верхний индекс: sub, sup
sub — «нижний» индекс (H₂O), sup — «верхний» (м², x²). Химия, математика, единицы. «Без» sup — «квадратные метры» смазываются. sub/sup «не» для «стиля» — для «науки». «Формулы» «становятся» читаемыми.
Одинаковые слова, разные смыслы: wbr
wbr — «где можно перенести», если не умещается: «рекомендация» переноса. «Длинные» URL, «сложные» слова. Браузер «получит» точку «разрыва» по просьбе. «Никогда» не «жёсткий» перенос — только «возможный». «Ломать» «слова» бережно.
Направление письма: bidi и атрибут dir
dir="rtl" — «справа налево» (иврит, арабский); dir="ltr" — «слева направо». bdi — «изолированный» участок с «неизвестным» направлением. «Смешанные» языки «в» списках «имён». Автоматика «не» угадывает — «уточняйте». «Биди» — «про», «кто редко» видит.
Цитируемый блок: blockquote в потоке
blockquote — «большая цитата» отдельным блоком. Диалоги, цитаты авторов. Может «вмещать» параграфы. Атрибут cite — «источник» URL. Браузер «отодвинет» отступом «как» в типографике. «Не разрывайте» «цитату» ради «красоты».
Что такое HTML: разговор с содержанием
HTML — «что» это «быть» документом: содержимое, которое «читают» люди и машины. Не «картинка», не «рисунок» — «смысловой каркас». Разметка управляет «верхним» слоем смысла. «Слоёный пирог»: HTML → CSS → JS. «Начинать» «всегда» с HTML.
Первый сайт: структура относительно файла
Сайт — «папка» с index.html и ресурсами: css/, images/, js/. Открывайте index.html — «лицо» сайта. Файлы «рядом» — «соседи»: картинка в папке images. Пути «относительные»: "images/cat.jpg". «Папка-сайт» — «корень», всё «внутри».
Индексы: файл index.html как точка входа
index.html — «первый», кого «спрашивает» сервер по умолчанию. Папка + нет имени — «покажет» index. «Домашняя» страница «по умолчанию». На локальном — просто «откройте» его. «Правило»: у каждой «директории» — «свой» index.
Текстовая ось страницы: body изнутри
body — «видимая» территория всего, что «несёт» содержание. Заголовки, абзацы, списки, таблицы, медиа — «жильцы». Всё «внутри» body «отрисовывается». head «невидим», body «видим». «Сцена» начинается с body.
Разделение: идея одностраничности
Один HTML — «одна» логическая страница. Меню «ведёт» к другим «документам» или «разделам» этой страницы. «Одностраничник» — «компактен». Разделы «через» якоря #. «Навигация» «разрезает» длинный поток. «Идея» урока: каждый файл — «одна» тема.
Параграфы: абзац как кирпич текст
<p> «держит» абзац: мысль целиком. Браузер «добавит» отступы «сверху/снизу». Не «пишите» весь текст одним абзацем — «мысли» «разделяйте». Пустые p — «двойной» перенос? Нет, «дырка». «Параграф» — «единство» «темы».
Пустые элементы: img, br, hr по делу
Некоторые элементы «не имеют» содержимого: img, br, hr. Без закрывающего тега. img — «картинка», br — «перевод строки» (в тексте), hr — «горизонтальная» линия-разделитель. «Запись»: <img …> — «пустой слот». Не «злоупотребляйте» br для «отступов».
Строчные и блочные: природа элементов
Блочный (block) — «своя строка»: занимает всю ширину, «толкает» следующий вниз. Строчный (inline) — «в потоке»: рядом с текстом, не ломает строку. div/block; span/inline. Понимание «природы» — «половина» раскладки. «Природа» — «не» стиль, «база».
Временные рамки: введение в span и div
span — «строчный» контейнер для текста; div — «блочный» для групп. Сами «не значат ничего» — «дают» точки для стилей/JS. Не «перегружайте»: если есть «семантический» тег — берите его. div/span — «резервные» «скрепки».
Это не стиль: где начинается вёрстка
Вёрстка начинается с «строения», не с «красоты». Структура — HTML; красота — CSS (позже). Хороший HTML «не зависит» от CSS: читается и без него. «Каркас» важнее «одежды». «Сначала скелет — потом мускулы».
Объединение ячеек: colspan и rowspan
colspan="2" — «ячейка растекается» на две колонки; rowspan="2" — на две строки. «Заголовки» с «объединением», карточка товара «с фото в объёме». «Осторожно»: пересчитывайте «сетку» — «не поехала». Таблица «без дыр» — «мастерство».
Как объяснить браузеру столбцы: col и colgroup
<colgroup> «группирует» колонки для «общих» настроек: ширины, фоновые цвета. <col> — «одна» колонка внутри группы. «Позиционная» логика: первый col = первая колонка. «Одна» правка «раскрашивает» столбцец. «Сетка» «из» ощутимых «границ».
Атрибут id: уникальный пропуск
id — «уникальное» имя элемента на странице: один id на один элемент. «Якоря»: <a href="#contacts"> прыгает к id="contacts". JS: getElementById. Не «повторяйте» id — «путаница». id = «паспорт» элемента (один на всех).
Знакомство с комментарием в разметке
<!-- текст --> — «комментарий»: не показывается, но «остаётся» в коде. Пояснения, отключение «куска», заметка. Не «комментируйте» поверхностно — «зачем», а не «что». Берегите «будущие» глаза. «Заметка» — «инструкция» читателю кода.
Проверка себя: мини-разметка в блокноте
Соберите «модель» в блокноте: заголовок, пара абзацев, список, параграф с ссылкой. Откройте в браузере. «Увидели» структуру? Теперь «поменяйте» порядок — «следите» как «течёт». «Практика» «вручную» — «основание» «архитектуры».
Взгляд «внутрь»: и как их выключить
CSS «живёт» «внутри» <style> в head — «внутренние» стили. Общее «настройка» для «одной» страницы. Минус — «не переиспользуется» между страницами. «Внешний» CSS — «общая» таблица .css «по» ссылке. «Многостраничный» сайт — «общий» файл стилей.
Атрибут lang: язык для машины и скринридера
lang="ru" — «язык» документа. Скринридер «выберет» интонацию, браузер — «проверку правописания» и «перевод». Настройте «на» html корня. Подстраница — «перекрытие» lang="en". «Машиночитаемость» «локальных» текстов. «Сайт» «говорит» на родном.
Мини-инструмент: заглушка за 5 минут
«Заглушка» — «черновая» страница: заголовок + текст + пара списков. «Проверка» структуры «до» стилей. «Пустая сцена», «где» каждая «деталь» — «мыслимая». Сохраните «шаблон.html» — «не пишите» с нуля. «Скелет» «всегда» готов.
Contents в CSS: концепция «голых» свойств
CSS не «обязан» меняться только в селекторе: «свойство» 'content' генерирует «текст». «Псевдоэлементы» ::before/::after «вставляют» контент. «Не злоупотребляйте» — «это» «молчащий» смысл, не «видимый» в HTML. «Сокрытие» текста в CSS «двусмысленно».
Пара слов про дочерние и вложенные списки
Списки вкладываются «один в другой»: ul в li — «вложенный список». Древовидные меню, оглавления. «Уровень» рисуется отступом. «Не глубже» — «читаемость» страдает. «Дочерний» ul «идёт» строго «внутрь» li, не после него. «Вложенность» — «сила» структур.
Спецсимволы: следуйте за «&»
Символа < в тексте — <, > — >, «&» — &. «Набор» сущностей: © ©, неразрывный пробел. Браузер «спрашивает» — «символ или тег?» Отвечайте сущностью. «Не пишите» HTML «внутри» текста «через» символы.
Чуть про смылс тега «шапка»: большая картина
header — «вводная» зона блока: логотип, навигация. article/section «тоже» могут «иметь» свой header. Не «два» header «в» одну страницу — «каждый» контейнеру «свой» вход. «Заголовочная» часть — «лицо» раздела. «Логотипы» и «меню» — «части» header.
Почему разделение на слои — план победы
HTML — структура, CSS — представление, JS — поведение. «Раздельные» папки файлов. «Один» слой не «лезет» в другой. «Обслуживаемость», «переиспользование». «Забудьте» про «инлайн-стили в HTML». «Слои» — «контракт» современных команд.
Тестовое задание: собрать карточку товара
Карточка: название, цена, описание, кнопка «В корзину». Соберите «семантически»: article, h3, p, button. Без CSS — «нормальный» смысл. «Читаемость» глазами и роботами. «Домашняя» «практика» — «переиспользуемая». «Соберите» вторую карточку — повторите.
Как устроена гиперссылка изнутри
«Атом» ссылки: адрес (href) + «текст-якорь» (что показывается). «Куда ведёт» — «внутри» href. «Текст» — «что» открыть. Браузер «прыгает», когда клик по «зону» ссылки. «Целостность»: ссылка читается «сделай X». «Не» «нажимайте» на «нажимай сюда».
Изображение с подсказкой: альтернатива в деталях
alt — «резервный текст» картинки. «Сломалось» — покажет alt. Скринридер «прочитает» — «невидимая» рука. «Сколько» alt — «смысл», «не» описание пикселей. alt="" — «декоративная». Без alt — «пустой» звук. «Каждая» картинка «отвечает» на вопрос: что «это»?
Размер под картинку: width и height
Указанные width/height «резервируют место» до загрузки — «нет» прыжков макета. Числа «в» атрибутах — «не» px, просто «цифры». Если «только» один — соотношение сторон «может» просесть. Атрибуты + CSS width:100% — «рецепт» адаптива. «Не рвите» пропорции.
Атрибут title на картинке: второй слой
title «даёт» всплывающую подсказку при наведении. «Дополняет» alt, «не заменяет» его. Скринридеры «не всегда» читают title — «прячьте» важное «в» текст. title — «мобильные» «не показывают» (нет ховера). «Декорация» в меру. Подсказка «значит» медленно.
Векторная графика: место для SVG
SVG — «вектор»: линии и фигуры «по формулам», «не» пиксели. Бесконечное «увеличение» — «чётко». Иконки, логотипы, графики. Размер файла «мал». Рисуется «тегами»: circle, rect, path. Можно «стилизовать» CSS. «Растровые» img — для фото. «Вектор» — для «лого» и «икон».
Красивый блок для кода: тег pre
pre — «сохраняет» пробелы и переносы как «набрано». Отлично «для» кода и ASCII-арта. «Внутри» — code для смысла: pre+code. Шрифт «моноширинный» по умолчанию. «Не» для обычного текста: переносы «вырвут» строки. «Дворники»: сохранить «отступы» — «трудно» вручную, pre «помогает».
Перенос строки внутри абзаца: br
br — «вручную» перевод строки «внутри» текста: адреса, стихи, подписи. «Не» для отступов между абзацами — это работа «блочных» тегов. Два br подряд — «дурной тон»: значит, не хватает «структуры». «Разбивайте» на p или списки. br — «исключение», «не» правило.
Горизонтальный разделитель: тег hr
hr — «тематический» разрыв между «блоками»: смена сцены, раздела. «Было» — просто линия, «сейчас» — «семантический» разделитель. Не «для» декоративных линий — для «смысловой» паузы. «Например»: конец главы, перед сноской. Стилизуется CSS. «Не путайте» с br: br — строчный, hr — блочный.
Что делает → куда: ссылка с путём
Ссылки «в» навигации — «переход» между страницами. Относительный путь: "about.html", ".. /docs/start.html". Абсолютный: "https://…". «Внутренние» ссылки — «относительные»: сайт «переезжает» без «правок». «Якорь» — #имя на той же странице. Атрибут target="_blank" открывает «новую» вкладку — «используйте» с осторожностью.
Якорь: прыжок к нужному месту
Якорь — ссылка на id внутри страницы: <a href="#top">. Просто «прокрутка». Полезно для «длинных» страниц: содержание → разделы. Один id — один якорь. id должен «быть уникальным». Браузер «поищет» элемент с данным id. «Без» JS. Мгновенное «перемещение» взгляда.
Как «сложить» документ: структура целого
Документ — «не» груда тегов, а «слоёный» текст. Заголовки — «скелет», абзацы — «мясо», списки — «рубрики». Сверху — «шапка», середина — «основной», низ — «подвал». Каждый блок — «мысль». Скопируйте «скелет» шаблона — «наполните» текстом. Структура «ведёт» взгляд читателя.
Стили без CSS файла: тег style в head
style «внутри» head — «внутренние» стили: быстрые эксперименты, одностраничник. «Всё» в одном файле: HTML + CSS. Плюс: простота; минус: «не переиспользуемо». «Внешний» CSS — файл .css через link. «Инлайн» style — атрибут style — «последний» резерв. «Разделяйте»: CSS — отдельным файлом для «реального» сайта.
Подключение внешнего CSS: link
link rel="stylesheet" href="styles.css" — в head. «Разрыв» стилей «и» структуры. Кеширование — загрузится один раз. Порядок: CSS-файлы → стили документа. «Множество» файлов link — можно. Атрибут media для «условий» печати/экрана. Внешние стили — «стандарт» проектов.
Единицы размера: px, em, rem
px — «фиксированные» точки экрана. em — «относительно» родителя (размер шрифта). rem — «относительно» корня (html). «Оба» — «живой тип». Плюс vw/vh (%) и vmin/vmax. «Для» шрифтов предпочитают rem — стабильно при «глубоких» вложенностях. px — для границ «точных». «Помните»: размеры «по смыслу», не «по причуде».
Псевдокласс :hover в первом приближении
:hover — «состояние» наведения курсора. Ссылки меняют цвет, кнопки подсвечиваются. «Однострочные» реакции. :hover — «не» только ссылки: любой элемент. «На мобильных» нет курсора — hover «спит». Используйте для «явной» обратной связи. :hover — «семена» интерактивности.
Знакомство с одиночными тегами: img, br, hr
«Пустые» элементы — «без» закрывающего тега: img, br, hr, input, meta, link. Закрывать «нечем» — нет «контента». В HTML5 «слэш» в конце — «необязателен»: <img src="…">. Валидатор «простит» и с «/». «Пустота» — «природа»: данные приходят «из» атрибутов. Почему hr — «пустой»: он разделяет «своей» линией.
Уникальный id: паспорт элемента
id — «уникальное» имя элемента в документе. Два элемента — «не могут» иметь одинаковый id. Про «настроку» скорее всего: id — «один». Используется для «якорей», «стилей» (#id), «JS». Именование: «без» пробелов, «латиница», «прописная» для разделения? «Короткое» и «говорящее»: id="main-nav". «Переживает» rename страницы.
Заголовки и роли: почему «h1» один
h1 — «заголовок страницы», обычно «один». h2/h3 — «секции внутри». «Порядок» — «не» пропускайте: h1→h2→h3, «не» h1→h3. Скринридеры строят «sólu» из заголовков — «оглавление» страницы. Один h1 — «имя страницы». Подзаголовки — «разделы». «Заголовок» — «не» визуальный размер, а «уровень смысла».
Жирность и курсив: strong/em против b/i
strong — «сильная важность», em — «акцент» (интонация). b/i — «стилистические»: текст «просто» выглядит жирно/курсивно, «без» смысла. Скринридер «меняет» голос на strong/em, «не» на b/i. «Правило»: «важность/внимание» → strong/em; «оформление» → b/i нельзя ли «стиль» в CSS? «Смысл» — в разметке, «эффект» — в CSS.
Мелкий текст: тег small для примечаний
small — «мелкий» сопутствующий текст: лицензии, копирайты, дисклеймеры, «мелкий шрифт». «Не» для «всего» мелкого — только «официально» сопутствующее. Ставитьfont-size — «дело CSS», «не» тега; small «только» силу смысла. «Юристы» любят small. «Смысл»: «незначительное» дополнение к основному тексту.
Дата и время: тег time — продолжение практикума
time — «машиночитаемая» дата/время: <time datetime="2025-01-15">15 января</time>. «Люди» видят «удобный» текст, «машины» — datetime. «Поиск» и «календари» понимают. «Исторические» события, расписания. Атрибут datetime «невидим» для людей, но «точен». «Без» time — дата «просто слово».
Базовый текст для старта: приветствие на странице
«Стартовая» строка приветствия — «взгляд» в будущее. Комбинируйте: h1 «Биография», p «Я учу HTML». «Закрепите» разметку на «себе» — данным «интереснее». Пара слов о человеке на старте «в пару» строк. Пусть «первая» страница «заговорит» о вас. Это «вдохновляет» на «продолжение» пути.
Если текст не умещается: запас по ширине текста
Try: «длинное слово» без пробелов «ломает» ширину. «Решение»: перенос в точках wbr, дефис-место. «Компьютерное» имя -webkit… — «подскажите». «Не» рвите числа и даты «в неподходящих» местах. Hyphens: auto + lang="ru" — «немузыкальный» перенос. «Ширина» — «не оружие», «а» забота о «глазах».
Невидимые символы вокруг: как браузер «стрижёт»
Браузер «обрезает» края: пробел «в начале» элемента и «в конце» — часто «невидим». Внутренние «соседи» — сжаты. «Съеденные» пробелы — «ужас» вёрстки «inline»-компонентов: «проще» — нет. white-space: normal «по умолчанию». «Понимаете» деформацию — «легче» контролировать. «Режут» лишнее — «сами» при «вёрстке».
Итого структуры: каркас вашей первой страницы
Соберите всю страницу «полюсно»: header → main → footer. В main — h1, абзацы, списки, ссылки. В footer — «подпись». Проверьте: «все» теги закрыты и «смысл» на месте. Откройте валидатором. Структура «без» CSS — «полный» смысл. Это «эталон» для каждого следующего урока. «Скелет» «родился».
Мнемоники передовых трюков: от HTML к JS
После HTML — CSS, потом — JS. «Не» «прыгайте» за JavaScript «вперёд паровоза»: структура «без» него «стоит». Каждый «слой» «заботится» о своём. JS «оживляет» правила CSS и «ложь» структуры. «Путь» — «последовательность»: скелет → одежда → жизнь. «Подкопите» терпение — «глубина» «награждает».
Эмодзи в тексте: кодировка и семантика
Эмодзи — «символ», не «картинка» из тега. Кодировка UTF-8 «хранит» и «за». Скринридер «молчит» или «зачитывает» название. «Декоративные» эмодзи — role="img" + aria-label, иначе «шум». «Не» вставляйте «случайно» в заголовок поиска. «Изучайте» язык «эмодзи» осмысленно, «со» смыслом.
Проверка 2: формы бьются в голове
Соберите форму: поле ввода, селект, кнопка «Отправить». Полю — label. Селекту — опции. Обязательному — required. placeholder «подскажет», maxlength «ограничит». Проверьте валидацию браузером. Кнопка submit «соберёт» всё. «Учусь» — «строгая» форма — «хороший» HTML. «Отправка» «без JS» — «честное» дань.
Проверка 3: семантика — секретный экзамен
Пролистайте страницы и спросите: «почему» этот тег, «а не» другой? Заголовок — h?; сноска — small; цитата — blockquote; код — code. Если «ответ» — «просто так», подозревайте класс div. Строение — «между смыслов и стиля». Сдайте «экзамен» «своей» разметке: завтра «вы» поймёте её «в» мгновение.
Промежуточное слово: зачем всё это вообще
HTML «начинает» путь к «любому» сайту: блог, магазин, визитка, игра. Без понимания скелета — CSS и JS «мажутся» по пустоте. «Стойкий» фундамент «держит» вкусные «надстройки». «Первый» урок «не» «о» разметке — «о» мышлении «структурой». Это «ложится» в «каждую» технологию дальше.
Вступайте: финальная сборка страницы
Соберите «эталон»: шапка + навигация + main (h1, p, ul, table, form, img) + подвал. Проверьте валидатором «без» стилей. Переоткройте в браузере и «пройдитесь» глазами. Шаг «назад» — «широкая» картина. «Всё» на своих «местах». Это «стартовый» фундамент на «месяцы» практики. Дальше — CSS «оживит» скелет.
Зачем нужен атрибут dir: истоки языка
dir — «направление письма»: ltr/rtl/auto. Не для иврита «в» урок — «для» тега bdi «дома». «Логика» макета «важно» для «зеркального» rtl. Атрибуты dir on-box по ситуациям. Когда интерфейс «русский», направление «не заметно». Но «не удивляйтесь» — «мировые» сайты «смотрят» двусторонне.
Псевдоэлемент ::marker у списка
::marker — «блюдце» маркера: точка/номер/символ «у» li. Цвет, шрифт, «картинка» вместо маркера. «Индивидуальный» стиль каждого пункта. CSS: li::marker { color: tomato; }. Не путать с ::before — маркер «замещает» содержимое именно li. UA-стили «могут» перекрыть. «Списки» — «живые» элементы с «характером».
Мультимедиа и базовые аргументы: img, встроенный звук
«Изображение» и «аудио» — базовые «носители». audio — «звук» для «слушателя»; img — «картинка» для «глаз». controls — «плеер» для audio. «Показ» обложки — poster у video. Не «встраивайте» каждый «ролик» целиком — «ссылкой» проще. Медиа «облегчает» восприятие. «Понимайте» форматы: mp3, webm. «В» файле — «мета» из атрибутов.
Приветствие, атрибуты: осмысленные имена
Атрибуты — «параметры» элемента: имя и значение. class, id, href, src — «известные». Пишите «осмысленно»: class="menu" лучше class="m1". «Компромисс» краткости и ясности. Не «лепите» неоговорённых. «Именование» — «часть» мастерства: «переименовать» дорого позже. «Читая» завтра, «вспомните» решение «безмолвно».
Кодировка и содержимое: снова про UTF-8
UTF-8 «зашифровывает» весь Юникод: и русский, и эмодзи. Один charset — «одна» истина. «Старые» кодировки — «битые» буквы. Проверьте: НЕ «кракозябры» — head+meta. «Откройте» файл в редакторе — «сохраните» как UTF-8 «без BOM». «Смешение» — «хаос» печати. Единый стандарт — «спокойствие» для всех инструментов.
Вложенность и «фоновые» дела: путь к реальному
<div><div>…</div></div> — «матрёшка». Вложенность «ведёт» иерархию стилей. Не «боитесь» — но следите за «глубиной». «Пол» — «матрёшка» без «предела». Глубоко вложенный код сложно «читать». Держите «простыми»: 2–3 уровня. «Фон» и «границы» «мешают» смотреть. «Блочная» «модель» — наследие «ящиков».
Внутренние линии: списки и их оформление
ul «рисует» маркеры «по умолчанию»; CSS — интервал и цвет. «Линии» между пунктами — border-bottom у li. «Рамки» и «тени» — «деко» от «фона». «Не» путайте «декор» списки с «содержимым». «Списки» могут быть «меню» без «обёрток»: ul+li+ a. «Разделители» ставят «ритм» между «вкладками». «Серьёзный» список — «стержень» навигации.
Контроль высоты: min-height страницы-подвала
«Липкий» подвал — «страница» тянется «на всю» высоту (100vh) и подвал «внизу», даже если «контента» мало. min-height: 100vh + flex. «Пустая» середина — «подвал» не «всплывает». «Слабый» запрет для «короткой» страницы. «Вёрстка» «под» конец окна — «профессиональная» привычка. Следите: content «не» «перекашивается».
Итог-повторение: разметка — это структура
HTML ≠ «картинка»: HTML — «скелет». Каждый тег — «роль». Заголовки — «карта», списки — «перечни», ссылки — «пути», медиа — «иллюстрации». Валидатор — «друг». «Закрывайте» теги, «разделяйте» слои. «Погружение» в широкий «мир» сайта начинается с «этого». Следующее — CSS, «выборы» цвета и ритма. «Молодой» «фундаменталист» — «будущий» профи.
Один большой итог деталей: практические мелочи
«Мелочи» «помечают» страницу «ухоженной»: правильный alt, осознанный lang, «честный» title. Кодировка — «правильная»: UTF-8. «Невидимое» для глаз — «видимо» для машин. Дата — time, цитата — figure. Эти «деталочки» — «подпись» мастера. «Повторите» их в каждой странице — «шик» вырастет «сам». «Мелочи» «вместе» — «профессия».
Звонок в мир: телефонный префикс в ссылке
tel: — «звонок» из браузера (на мобильном — звонилка). href="tel:+74951234567" — «нажми-позвони». Пробелы/скобки в ссылке — «дробит» — пишите голый номер. Внутри текста — «узор» для человека. Скринридер «прочитает». Мобильная аудитория «обожает». Визуально — подчеркни стилем. Избегайте tel без «пути» «внутри» JS.
Выбор с клавиатуры: атрибут accesskey
accesskey — «горячий» ключ для элемента (letter). Alt+буква «активирует» — браузер-специфично. Меню: accesskey="m". Ссылка «прыгает» без мыши. Конфликты: одна буква — одно действие. Скринридер «предупредит»? Не всегда. «Не» «два» одинаковых accesskey на странице. «Мало» знают — ясность «ваша». Тонкость для «продвинутых» форм.
Тёмная тема: prefers-color-scheme и доп.
prefers-color-scheme: dark | light — «вкус» системы. CSS запрос media: @media (prefers-color-scheme: dark). Белый текст на чёрном — «ночным» глазам. «Не» переворачивайте «просто» цвета — «контраст». meta color-scheme «подсказывает» браузеру. Переключатель — «свой» чекер: данные в prefers… «читаются». «Уважайте» выбор системы. «Ночь» — не «брандер».
Базовый вертикальный ритм: простой абзац-норма
Вертикальный ритм — «одинаковые» межстрочные отступы между абзацами. line-height и margin-bottom в «одной» единице. p { margin: 0 0 1em } — «дышит». Не «забивайте» один-в-один em «свободно». Скринридеры «не учат» ни в чём. Читатель «не спотыкается». «Типографика» — «отступ равно, повторение равно» — «музыка» колонки. Вертикаль CSS — «правило» vis prof.
Домашнее: создать «плановую» страницу с разделами
Задание: страница «Мой план на год» — header + main: 3—4 секции h2 с абзацами; footer. Плюс один список и одна таблица. Каждая секция — отдельный «блок» логики. Проверьте валидатором. Откройте без CSS — читается? Это «скелет плана». Завтра «украсите». «Сдача» — в этом задании «прощается» с базой.
Почему ссылки ведут: понятие протокола
Протокол — «правила разговора»: http/https для веб, ftp для файлов, mailto для почты. href="https://…" — «визит» на сервер; mailto «включит» почтовик. Без протокола «//» — «протокольная» ссылка. Браузер «сам» подберёт. http «не» шифрует — https «шифрует». Ищите зелёный замок. «Знание» протоколов — «уверенность» в путях ссылок. «Сайты» «без» https — «красный» браузер.
Метавзгляд: как HTML видит поисковый робот
Робот «читает» как скринридер: заголовки h1→h6, текст внутри p, ссылки и alt. Структура определяет «ходы». Полностью простой текст «не улавливает». h1 содержит ключевые слова? Тогда «поиск» на «вашей» теме. title и description — «витрина». «Повторяйте» главные слова «естественно». Семантический HTML = «понятный» роботу «язык». «Не» пишите «мета-воды». «Релевантность» — «урожай» смысла.
Кнопка-ссылка: стоит ли <button> у ссылки
button «действие», a — «переход». Не «оборачивайте» ссылку кнопкой — «смысл» у действия. Внутри форм — button; вне — a «к» URL. Для треккинга клика по «кнопке»-переходнику — a. Скринридер «спросит»: «кнопка» или «ссылка»? Не путайте «действия». AK: если «выполнится» навигация — «это» ссылка. Осталось «одно» верное — «две» роли в «теле». «Валюты» интеракции не «разменивать».
Практика формы: вход без регистрации
Соберите простую форму входа: email, пароль, «Войти». label обоим, required, autocomplete. Кнопка submit. Обсудите, что «в» реальности «не» отправляется (нужен сервер/JS). «Разложите» по смыслам. Не забудьте placeholder нейтральный. Проверьте фокус и клавиатуру Tab. Простая форма — «канон» форм. «Вход» без «реальности» — «демо», но «полное».
Условие видимости: hidden атрибут
hidden — «скрыть» элемент из потока (display:none в UA). Не «в» скринридере — «удалён» из восприятия. aria-hidden — «скрытие» от ассиста, но «локально» видимо. Используйте «по» смыслу JS: «показать/скрыть» блок. Не «стиль» видимости — «состояние». hidden атрибут «не» «перебивает» CSS display. Спорить с браузером не «нужно». «JS» — «жизнь» кнопки «показать ещё».
Пункт меню активен: раздел о class="current"
class="current" (или active) — «подмаркировка» текущего раздела меню. Нужен CSS: .current { font-weight:bold } . Только «один» активный пункт. HTML «не знает», где вы «сейчас» — но «мы» рукой «помечаем». Каждая страница «свою» ссылку «подсвечивает». Скринридер «не видит» цвет — aria-current="page". «Ваш» «там» без CSS: «структура» — «хорошо». «Классы» готовы для «динамики».
Атрибуты-переключатели: и фокус без мыши
Делайте «порядок» в форме: tabindex="0" — «путь» к Tab; отрицательный — «скрыть» из «прохода» (для JS-фокуса). «Не» «лепите» tabindex="5" к «каждому» — хаос навигации. Ссылки/кнопки/поля — «в» порядке «по умолчанию»: каскад документа. «Сломали» порядок — «пересоберите» структуру. «Фокус-виден» (outline) — «скрывайте» только со «своей» заменой.
Тултипы на CSS: вариант и граница реализации
Тултип можно «поднять» на CSS: position:relative у родителя; position:absolute у псевдоэлемента. opacity/display + :hover. Информация «появляется» рядом. Но «переполнение» и «обрезка» — забота. Скринридер «может не» прочитать «абсолют». aria-describedby — «мостик» к «настоящей» подсказке. CSS-тултип — «стильная бабочка», не «единственный» ответ. Сочетайте.
Ссылка «наверх»: кнопка-якорь внизу
Длинная страница «желает» пути назад. <a href="#top">↑ Наверх</a> — «якорь» на body (id="top"). Кнопку «липкой» сделает CSS (fixed). Повторите в footer или плавающей. На телефоне — «менее» важна. «Дубль» по смыслу — «подпись». aria-label="Наверх страницы" — скринридеру «понятно». Скролл-прыжок «мгновенен»; плавный — matchMedia JS/CSS. «Удобство» маленькое, «ценное» большое.
Практика: тёмная карточка-профиль с классом
Соберите профиль «в» тёмном мини-блоке: имя, роль, контакты-ссылки, аватар. Смысловая структура: article + h3 + p + ul с ссылками. Один класс на «все» карточки: .profile. «Прелесть» — «тот же» класс масштабируется. Не «втуливайте» лишние div — «чистая» карточка. Пока без настоящих стилей: HTML «дышит» сам. Следующая тема — первая стилизация разметки.
Фокус-обман: что такое sr-only техника
sr-only — «класс», который «скрывает» текст визуально, но «оставляет» его скринридерам. position:absolute; clip…; 1px-ть. Используется для «скрытых» заголовков секций, пояснений к иконкам. Визуал «чист», содержание «полно». Не злоупотребляйте — «спрятать» ≠ «кричать» не читателю удобство. aria-label «похож»; sr-only — «настоящий» текст для «подробного» описания.
Полное: разбор страницы, где 0 CSS
Покажите себя: откройте страницу с выключенным CSS. Что «живёт»: заголовки, параграфы, списки, ссылки (синие/подчёркнутые), таблицы сеткой. Разметка «без» стиля — «паспорт» смысла. Если понятно «без» или почти без — вёрстка «честная». CSS — приятность поверх; без него — «каркас». Проверка «бедности» — проба золота. Такая страница всегда «опрятна» структурой.
Абстракция списка: ul служит для сетки?
Раньше списки «рисовали» сетки: «строки» = li, «ячейки» = display: inline-block. Адаптив «хромает». Сегодня CSS Grid/Flex «честнее». Но пробелы между li «наследие». Не «выдумывайте» ul «для» сетки — есть структуры. «Сетка» стиля — CSS; «список» — перечень. Соломоново решение: семантика диктует тег. ul «для» меню и пунктов — «да»; «для» колонок цен — «нет»?
Последние штрихи вложенности: комментарий строки
Комментарии «внутри» чанков кода — <!-- -->, они «не» влияют на рендер, «но» объясняют. Пишите по-русски: // «смысл» у кода. «Не» «комментируй» каждую строку — «штекер» шума. Комментарий «наверху» файла: автор, дата, цель. HTML и CSS и JS — разные «языки» комментариев. Помогите «завтра» себе. Комментарий — «память» команды, не «дневник» вообще. Берегите «смысл».
Связанные объявления: сначала src, потом alt
«Естественный» порядок атрибутов у img: src «что», alt «зачем», width/height «размер». Внутри одного атрибута — «правильная» логика. HTML допускает «любой» порядок, читаемость «требует» его постоянства. Ссылки: href первый, потом title. Дисциплина «порядка» — «профессиональный» почерк. Валидатор не «проверит», но человек «решит». Аккуратность «в» деталях — «визитная карточка».
Простые факты: где искать поддержку браузера
caniuse.com — «база» поддержки: тег, свойство, атрибут — «зелёный»/«красный» по браузерам. MDN — «эталон» с примерами. «Проверяйте» перед «хорошими» идеями: <dialog>, display:grid, aspect-ratio. Мобильные версии «отличаются». Не «боитесь» современных, если большинство «зелёные». fallback — «запас» для старых. «Инструмент» экономит «часы» фрустрации: научитесь «читать» таблицы caniuse.
Шорткод на практике: невидимый комментарий-заглушка
Иногда нужно «временно» убрать абзац, но «жалко» удалять текст: html, язык разметки, семантика. Закомментируйте строки. «Вернуть» — «снять» комментарий. «Код» прощает «планы». «Полезно» при сомнении: <!-- <p>…</p> -->. «Не» стекируйте «комментарии» в «продакшене» про прошлое. Чистота кода — уважение к завтрашнему себе.
Текст по центру текста: разве без тега?
«Пустых» тегов-центровщиков <center> нет — deprecated ещё в HTML4. Выравнивание — удел CSS: text-align:center. HTML не «рисует», а «говорит». Валидный код без center — «чистый». Боритесь с привычкой. Если хочется центра — спросите: «заголовок» или «структура»? Смысл — не центр. CSS справится везде. «Не ищите» тег, «ищите» причину.
Необычное: верхний регистр латиницей нет
«Верхний регистр» латиницы в дипломах? Нет. В HTML это уже не регистр, а «смысл»: var — переменная; samp — вывод программы; kbd — клавиша. Стилистические uppercase решает CSS text-transform. В тексте — «чем» написан код, «то» и семантика. Не пишите ПОЗДРАВЛЕНИЯ капсом в HTML — «кричащая» типографика слабость. HTML молчит — CSS говорит. «Смешайте» правильно.
Проверка понимания: разрядка номера страницы
Помните: «Страница 1 из 3» — это «структура пагинации», не театр. Соберите эмуляцию list+links. Если доступен только «1» — выделите особо. «Двойные» ссылки не плодите. Каждая страница статьи — пагинация полноценности. Проверьте себя: <a href="article-2.html"> — «в глубину», <a href="#top"> — «вверх». Всё по месту. «Нумерация» — это данные, кнопки — это действия.
Граница изобилия: сколько тегов знать
Не «учите» все 110+ тегов сразу. Ядро — ~30. Каждый новый — «когда понадобится». Чтение чужого кода расширит словарь. Не зубрите список «потому что»: смысл важен. Карманная шпаргалка — html.ambassadors? MDN. «Понять» систему — важнее имён. Количество тегов не делает профи. Профи — тот, кто чувствует, когда какой уместен. Словарь растёт практикой. «Шляпа не в этом».
Примитивы мысли: блоковая модель и её части
Блочная модель — «ящик» с контентом: content и padding, border, margin вокруг. Каждый элемент страницы — «коробка» с содержимым. Размеры и отступы — свойство CSS, но HTML «расставляет» ящики по порядку. Невидимо «в» HTML, «видимо» в DevTools. Важно «первое» знакомство: боксы складываются. Позже CSS задаст ширину и цвет. Пока — просто представление.
После слайдов: вопросы к самому себе
Ответ честно, без гугла: зачем нужен тег main? Сколько h1 на странице? Что делает alt? Чем strong отличается от b? Где живёт viewport meta? Назначение lang? Если 3 ошибки — перечитайте. Флэш-карточки удобнее. Цель — «независимое» воспроизведение структуры. Слова своими — значит, поняли. Лёгкая самопроверка — спутник прокачки. Не стесняйтесь повторять: мастерство — повторение.
Связь текста и медиа: caption как текст под фото
Медиа в HTML: подпись животины — figcaption; текст под видео — тоже. Связь — логический союз. «Семантическая пара» — смысл. Не смешивайте: подпись ≠ пояснение картинки. Фото + подпись = понятный блок. Скринридер читает последовательно. «Обрамление» в figure — «контейнер единства». Красивая подача — детали. Практику подсмотрите в новостях.
Двери в таблицы: входные columns и rows
Таблицы живут строк (tr) и столбцов (td/th). Смысл в ячейке. «Не» для раскладки — для данных. Каждая строка — запись, столбец — поле. Заголовок th — «направление» чтения. Объединение — для «нестандартной» сетки. Валидная таблица — «реестр». «Строки идут сверху вниз», «столбцы слева направо» — так кодируется истина. Читается легко, осмысленно, по-научному.
Финальная демо: мини-сайт «Книжная полка»
Соберите трёхстраничник: index (обложка + книги), about (биография), contact (контакты/форма). Общая шапка-навигация и подвал. Смысловые теги + относительно-структурные ссылки. Каждая страница — «полка» структуры. Цель: валидный, проверенный, «смысловой» скелет. Пока без CSS. Открывайте в браузере и «ходите» по ссылкам. Вы — архитектор мини-информационного сайта. Книги «ждут» рифмовки стиля.
Пагинация вокруг статьи: ссылки «следующая» и «предыдущая»
rel="prev" и rel="next" — «связи» последовательности: страницы серии. Search engines и браузеры «поймут»: одна, две, три… «Ссылки» внизу статьи: «← Назад», «Читать дальше →». «Двойное» меню навигации не «врется». rel=… «и» для свежих статей. «Порядок» в URL: article-1, article-2. «Навес» важного — навигация. «Не» форсируйте prev/next «главной» странице.
Скрывать содержимое: дилемма title и ссылок
Скрыть текст ссылки «визуально», оставив для скринридера — техника sr-only: «позиционируй» абсолютом за экраном, «клипни» 1px. Не «прячьте» важные ссылки полностью: правило инклюзии. «Эмодзи-ссылка» без текста: aria-label. «Скрытый» до «фокуса» — «keeper» по требованию. «Скрытый» от мыши, «но» открыт Tab. Вопросы доступности «внутрь» умной разметки. «Кнопка без слов» — «скидкаая»… «снова» про alt? Вместо «это CSS»: это «и» HTML-практика.
Списки и пробелы: лишний пробел между словами
В списках li «подряд» идут «плотно»; горизонтальное меню собирается в одну строку? Отступы — «естественные» пробелы между inline-block/li рисуют «щели». Проще: display:inline-block li + margin-right. Или flex gap. «Дребезг» пробелов — классика «белых» промежутков. Подсказка: font-size:0 на ul, li font-size:1rem. «Стиль» против «пробела» — «поле битвы» CSS. Внимание — деталям.
Пустая ссылка: когда href="#" не выход
<a href="#"> — «ныряет» к top, «возвращает» в начало; может «запороть» состояние скролла. Если ссылка ведёт «никуда», но должна «выглядеть» кликом — временный «плейсхолдер»: href="#" + JS preventDefault позже. Лучше: кнопка <button>, если «действие» — не «переход». «Не» вешайте бордер на «пусто». На пулю: валидная пустая цель — hash место. «Диплом» аккуратен даже в мелочах якоря.
Практика: меню-хлебные крошки в nav
Хлебные крошки: <ol> с пунктами через «/». Первый пункт — "Главная", последний — текущая (не ссылка). Разделитель добавьте псевдоэлементом ::before. aria-label="Хлебные крошки" на nav. Схема: nav > ol > li (a?) + li[aria-current="page"]. Плюс видимый «…». Не «путайте» понятия placement: крамбли — позиция, breadcrumb — путь. Практика: соберите «вверх» по 3 уровня глубиной. Валидатор и семантика — ваши.
Заголовки в навигации: nav без h1 хитрая штука
nav не «нужен» внутренний заголовок; но если «пространство» велико — h2 «Навигация» на странице большого меню. «Двойной» label «нет»: aria-label null. Заголовок-nav «только» если «содержит» логические группы. Обычно превосходно просто ul>li>a. «Нумерация» списка пользователю видна… «не всегда». Правило: «навигация» — «наличие», заголовок — «роскошь» для контекста. Строите сайт — «взвешивайте» роскошь. Мастера не «украшают» ради украшения.
Практика: таблица расписания с thead и полями
Соберите расписание недели: колонки «Пн…Пт», строки «Утро/День/Вечер», ячейки — «Занятие». thead (th), tbody (tr+td), tfoot — итог/примечание. scope="col" на th. colspan для «обед» по двум дням? Или «пустая» ячейка. border 1px в CSS позже. Проверьте валидатором и увидьте чтение скринридером. «Таблица — это данные, не полотно». Большие таблицы «разрывайте» на части осмысленно.
Кодировка файла и текст: снова продвинутая тема
Самая «странная» причина «кракозябр» — файл сохранён не в UTF-8. Редактор: File → Encoding → UTF-8. Проблемы с русским текстом не в браузере, а «в» сохранении. UTF-8 без BOM — норма. Меняйте кодировку «до» вставки русских букв. Браузер с meta charset="utf-8" не «спасёт», если файл сохранён в cp1251. IntelliJ/VS Code дают индикатор внизу. «Серебряная» пуля — всегда UTF-8.
Тег data-*: карман для своих данных
data-* — «произвольные» атрибуты данных: data-user-id="42", data-price="1.5". JS читает getAttribute/dataset. «Не» для стилей; «для» связи HTML↔JS. «Лёгкие» данные в разметке — понятная «перекличка» скриптов. Индексы, id, флаги, состояние. Не «мешайте» data- с class семантики. Валидатор «пропустит» навсегда. «Метаданные» для функциональности, «не» для «смысла». Легко и нежно.
Итог-повторение: фундамент семантики сдан
Вы прошли: документ, тексты, списки, ссылки, медиа, таблицы, формы, доступность и немного практики. Скелет любого сайта «в» голове. Следующие уроки — CSS и поведение. «Не» «боитесь» десяти новых тегов. Семантическая «база» готова. Откройте реальный сайт и «найдите» структуры. Вы больше «не» «видите» просто текст — «видите» разметку. Дальше — стилизация и жизнь.
Зачем «просматривать» исходники: не бояться чужого кода
Пункт меню браузера «Просмотреть код» — «инъекция» любопытства. Чужой сайт — «задачник» без ответов. «Друзья»: viewsource (Firefox), Ctrl+U. Не «крадьте», но «читать — учиться». Иногда код «некрасив» — и «почему бы» нет? Просто «в» реальности так «бывает». Ищите «одну» деталь: как сделан «тот» аккордеон? «Опыт» добывается прочтением «живых» примеров. «Собственность» кода — лицензии: смотрите глазами, не «липкой» мышью. Растёт «вкус».
Заголовки и перевод строки при мелочах microdata
microdata: itemscope/itemtype/itemprop — «словарь» для машин: товары, люди, рецепты, события. Скринридер «игнорирует». Поиск Google «читает» и «собирает» rich snippets («звёзды» рейтинга, цены). Не «злоупотребляйте» метками. <div itemscope>… itemtype="https://schema.org/Product" + itemprop="name"/"price". Валидатор «пропустит». Проверка микроразметки «у» Google Rich Results. Смысл — «данные на полке» витрины. Сегодня почти «декор», завтра — «упоминания».
Причина неравных половин: ИЯ и погрешность вёрстки
Если контент «левой» и «правой» колонки «разной» высоты — вёрстка «честная», но «неуклюжая» по глазу. Начало «у» одинаковой базовой линии; конец — «свободный». Flex+align-items:start «не» «растягивает» рамы. CSS «пометит» высоты. «Психология» сетки: читатель «всё равно» сканирует зигзагом. Не «добавляйте» хитростей ради «идеальной» симметрии. «Неровности» — «норма» реального контента — «принимайте». Стремление к «паре» строк — «фетиш». Важно понимать: структура остаётся «стабильной».
Словарь семантики: dl больше, чем список «термин — текст»
dl снова в кадре: группы терминов «связаны» в словарь: <div class="def"> внутри dl группирует dt+dd. Не «только» «вопрос-ответ» FAQ; «свойства» сущностей (характеристики товара), «метаданные» карточки. dt может «варьироваться» (синонимы-термины в одной группе). HTML5 позволяет div-обёртки в dl для стилей. Семантика: термин «не объяснён» — вопрос к вам. «Плотность» «словарных» пар — богатство. Структура как «энциклопедия» — читается и машиной.
Абзац как смысловая «рваная» нить: перенос deps
Один параграф — «одна» завершённая мысль. Если мысль «длинная» — она «просится» на «два» p. Не «рвите» предложение пополам «в» два абзаца, «если» читатель «должен» соединить. С признаком: «НО», «потому что», «однако» — «пограничный» шов. Скринридеры «ставят» паузу «между». Чтение «развивает» дышать. Перенос на «новый» абзац — «ждёт» перемены сцены. Держите: p — «мысль», paragraph — «речь». Рвёт нить — тот, кто не чувствует. Шитье абзацев — «ремесло». Слушайте скорость дыхания читателя.
Семантика «предложения»: где «точка» и «запятая» в HTML
Пунктуация — не HTML, но HTML «иногда» «отошлёт» к ней. Скринридер «диктует» пунктуацию: точка = конец, запятая = пауза. Скобки «читаются» словом «скобка». Не «стыдитесь» правильной пунктуации: «спотыкание» чтеца — плохо. Длинные «предложения» «режьте». Русский текст «в» HTML «живёт» по правилам языка. Абзацы — дыхание; предложения — выдох. Запятая «перед» «что» — классика. Не бойтесь «тире» для «объяснений»: «это» «по-русски». Логика текста — правда структуры. Дисциплина — смысл.
Мотивация: маленькая победа = гормон успеха
Каждая завершённая страница «хвалит» мозг: дофамин — «повторилось» — захочется ещё. Не «глотайте» весь урок разом: «порция» + «пауза». «Приз» после задания — кофе/прогулка. Успех «в» рутине — «не» «в» рывке. Навык накапливается «через» маленькие «да». Маленькие «да» создают большую веру. Прогресс «виден» в блокноте: словарь, флаги. Превратите обучение «в» игру: очко за тег. Итог: учиться — привычка с дофаминовой «петлёй». Побеждает не «талант», а «система». Стройте ритуал — не «чудо».
Многостраничность: первый раз — общая шапка у всех
Из повторяющихся «index + about + contacts» вырос сайт с «общей» шапкой. Шапка «в» каждой странице «своя», «руками». Позже — серверные фрагменты/templates. Сегодня копируйте блок header+nav «аккуратно». Следите: активный пункт «текущей». Изменение «одного» меню — правится «во всех». «Неудобно», зато «прозрачно». Так рождается дисциплина: единый «cardк» навигации. Многостраничник «тренирует» ссылки. Структура папок: о корне. «Понимание» повторяемости — шаг к «мастерству» шаблонов.
Сырые данные и код-вставка: снова про сущности
Знак «&» в URL бывает «и» параметром — в href понадобится «&»? Внутри атрибутов — тоже сущности: <a href="?a=1&b=2">. Один «&» в HTML-документе, как правило, — «&». Браузер «не пугает», валидатор «подскажет». Двойной параметр «без» экранирования «сломает» чтение? Форма XHTML-строгая; HTML5 — «мягче». Но «привычка»: экранируйте & — «мелочь». Привыкли, «летают». «Смысл» сущности — «пережить» передачу. Знак «стрелки» — тоже сущность (→). Станьте «аккуратным»: это гигиена данных.
Практикум самоконтроля: страница «обо мне» валидно
Соберите страницу «Обо мне» снова, но «эталонно»: главный заголовок, 3 абзаца биографии, 2 списка навыков, 1 цитата, таблица достижений, форма-контакт (имя + email + кнопка). Проверьте валидатором — «честно». Уберите лишние div. Добавьте <time>. Проглядите «слои» — main/article/header/footer. «Не» «пропускайте» «шапку» формы. Объект — «живая» страничка, которой гордитесь. Сверяйте по списку урока — «всё» на месте? «Мастерство: валидность + осмысленность = степень». Отличная работа. Следующая точка — стили.
Гениальность простоты: преимущество чистого HTML
Сайт на чистом HTML — «быстрый», «дешёвый», «стабильный». Нет зависимостей, нет сборки. Файлы — текст. Открывается везде, живёт годами. «Хрупкость» — миф: простота не боится. Страницы-визитки, документация, конспекты — идеальные соседи. Инструменты простые — «знание» важнее. Это «базовый» слой: все остальные «становятся» стилем сверху. «Достоинство» скелета — надежность. Не гонитесь «за» фреймворком, пока «не» соберёте руками. Простота — конец гонки за сложностью.
Ключевое различие: <br> внутри vs перенос CSS
br ломает строку «внутри» контента (адреса, стихи); CSS переносит «по» ширине. Не «используйте» br для вертикальных отступов — «это» margin. Если колонка «узкая» и нужно «слово» на «своей» строке — воля дизайна. Скринридер «не» «чувствует» br как новое предложение. Вопрос «когда» — по смыслу: стихотворная строка — br; статистика мяча в «абзац». Братство: «не» «рубите» абзацы на br. Поняли «вид» переноса — управляете текстом. «Часто» новички «перегибают» с br — «боровичок» грина. Трезвость — снова написано.
Правило золотого пароля: пляшем от label
«Пароль» в форме: label «Пароль», input type="password". autocomplete="current-password"/"new-password" — «менеджер» ключей предложит. minlength≥8. «Не» отключайте «один» менеджер паролей; «не» «debug»: глаз никому. placeholder «Не» держите при «установке» нового? «Скрытые» расшифровки — system. Атрибут maxlength следует «давать» разумный. «Повторный» пароль — второй input; браузер «не» «сойдёт» — JS позже. Проверка силы — «на» сервере. Скринридер «не» прочтёт символы в type=password. Тилите «показ/скрыть» — мини-переключатель доступен. Форма «входа» — «доверительная» зона.
Атрибут «aria-pressed»: кнопки-переключатели символы
aria-pressed="true|false" — «переключение»: избранное, переключатель режима. Скринридер объявит нажатое состояние. Используйте для кнопок, которые «включают/выключают»: "Полноэкранный режим", "избранное". Не путать: aria-checked — для checkbox/radio/switch ролей; aria-pressed — «кнопки». Кнопка «сама» должна показывать состояние (className, стиль). aria-pressed — «параллельный» сигнал доступности. Не «вешайте» на «обычную» submit — это «не» тумблер. Мини-практика: три переключателя-темы. Доступность + «исполнительность». Молодцы: детали важны.
Биография и «и»: практика «о себе» в микроразметке
Соберите блок «Об авторе» с микроразметкой Person: itemscope itemtype="…/Person", itemprop=name, url, jobTitle, email (mailto), image. «Сводка» в поиске. Валидатор Rich Results «покажет». Не «лжите» данными. Если данные «визуально тусклые» — чинит CSS. «Двойные» микроразметки (Organization + Person) — аккуратно. Скринридеры «молчат» oh words — это «для» машин. Проверьте: itemprop-значения «размечены» внутри видимого элемента. Дисциплина микроразметки — «подпись» данных. Двигайтесь размеренно: сегодня Person, завтра — Product.
Заключение всего урока: первые HTML-мили позади
Поздравляю: урок закрыт. Вы умеете: скелет, текст, списки, ссылки, медиа, таблицы, формы, семантику, доступность, микроразметку. Это уже «настоящий» фундамент. Повторите «через» день с нуля; соберите «свою» страницу. «Дальше» — CSS: цвета, шрифты, сетки, адаптив. Ваша мысль «разметки» окрепла: смотрите на сайты и «читаете» структуру. Практикуйте еженедельно. Вы — на пути. Следующая страница уже ждёт. Успехов и терпения!
Мини-итог: ваша первая страница уже реальность
Вы собрали первый настоящий HTML-документ: показали заголовки, абзацы, картинку, ссылки и даже форму. Путь начался не с «учебника», а с «действия». Проверьте свой файл в браузере и валидатором. Следующий шаг как всегда впереди: соединение страниц в маленький сайт. Структура крепнет с каждым уроком. Спрашивайте себя: «что я хочу видеть на экране?» — и размечайте это. Так рождается уверенность. Вы — уже HTML-автор.
Заповедник атрибута: правила маленькой таблицы
Не мучайте читателя «таблицей ради таблицы». Если данных мало — пара абзацев или dl лучше. Таблица оправдана, когда сравнение «по строкам и столбцам»: характеристики товара, расписание, итоги матча. И пустой th в углу — норма, поставьте его и проверьте. Таблица — не «художник», а «реестр». Не «добавляйте» пустых colspan ради красоты: расширяйте «по смыслу». Чувство меры — часть ремесла. «Меру» в таблицы — и читатель благодарен.
Без трюков, по-настоящему: стилизация у себя в форме
Определите стили формы «до» браузера: отступы между строками, выравнивание label. Заполните поля и понаблюдайте: браузер сам проверит email при отправке. Потом попробуйте формы автозаполнения — браузер предложит сохранённый адрес. Это нормальный «до-стилевой» интерфейс. Так выглядит ваша форма «чистой». Скоро CSS оденет её, но «скелет интеракции» уже работает. Почувствуйте: HTML — это общение без дизайна. Привыкайте и «любите».
Пауза-перезарядка: офлайн-задание на прогулке
Откройте телефонный сайт любого магазина и «вслух» назовите 5 semantic-структур: шапка, меню, карточка товара, корзина, подвал. Не открывая кода. Эта игра «глазами и словами» переносит знание в мир. Скоро вы будете «читать» любой UI автоматически. Отдых тоже практика, если правильная: наблюдайте, а не «тупите». Это «пассивная» тренировка восприятия. Сайты вокруг — ваши тренажёры. Продолжайте после передышки. Не вставайте от стола: мир HTML — рядом в телефоне.
Ещё раз про атрибуты: почему атрибут пишется внутри
Атрибуты — «пояснительные записки» на самом теге: <a href="…">. `href` — куда идём. Скобки-кавычки обязательны: одинарные и двойные равнозначны, но выберите одни и следуйте ему. «Логика»: тег — что; атрибуты — как и куда. Смысл атрибута почти всегда виден: width, height, src, alt. Не создавайте «своих» атрибутов без data-. Читаемость страницы — из этих мелочей. Сейчас это просто; позже — источник «конфигурации» элементов. Помните: и атрибуты валидируются.
Первое знакомство с главным правилом: валидность всего
Главное правило, которое тянется через весь урок: HTML должен быть валидным и осмысленным. Валидатор W3C — ваш экзаменатор. Честно прогнав свою страницу, вы увидите собственные ошибки: незакрытый тег, лишний div, пропущенный lang. Ошибки — не стыдно: стыдно их не исправлять. Сделайте правило привычкой: «сохранил → проверил → исправил». Так копится мастерство. Валидность — это не «галочка», а доверие браузера и доступность. Попрактикуйтесь — и это станет рефлексом. Ваш код заговорит красиво.
Один большой итог деталей: практические мелочи
«Мелочи» «помечают» страницу «ухоженной»: правильный alt, осознанный lang, «честный» title. Кодировка — «правильная»: UTF-8. «Невидимое» для глаз — «видимо» для машин. Дата — time, цитата — figure. Эти «деталочки» — «подпись» мастера. «Повторите» их в каждой странице — «шик» вырастет «сам». «Мелочи» «вместе» — «профессия».