nmk

Лекція №2 (2 години). HTML5: Семантика та структура документа.

План лекції

  1. Анатомія документа та базовий синтаксис
  2. Глобальні елементи та форматування тексту
  3. Семантичний HTML5: Чому він такий важливий?
  4. Доступність (Web Accessibility / a11y)

Перелік умовних скорочень

Вступ

Гіпертекстова розмітка — це абсолютна основа будь-якої веб-сторінки. Навіть найтехнологічніші та найскладніші веб-додатки (написані на React, Vue чи Angular) зрештою компілюються (або рендеряться) у звичайний HTML. Жодна стилізація (CSS) чи інтерактивність (JavaScript) не матиме сенсу без правильного фундаменту.

Історично склалося так, що HTML створювався науковцями для обміну документами, а не для створення складних візуальних інтерфейсів. Звідси походить його фокус на “структурі” (заголовки, параграфи, списки). Однак, сучасний інтернет вимагає від розмітки набагато більшого: сторінки повинні бути доступними для скрінрідерів (якими користуються люди з вадами зору), зрозумілими для пошукових роботів (SEO-оптимізація) та легкими для підтримки самими розробниками. Саме для вирішення цих завдань у специфікації HTML5 з’явилась семантична розмітка.

У цій лекції ми детально розберемо анатомію HTML-документа, синтаксис, атрибути, принципи побудови правильного макету за допомогою семантичних тегів та основи веб-доступності (Web Accessibility, a11y).


1. Анатомія документа та базовий синтаксис

Браузер (Google Chrome, Firefox, Safari) отримує від сервера не красиву сторінку, а просто довгий рядок тексту. Щоби перетворити цей текст на структуру, зрозумілу як для програми, так і для людини, використовується синтаксис тегів.

1.1 Теги, Елементи та Атрибути

HTML-теги — це слова (чи букви), взяті в кутові дужки (< та >). Вони діють як контейнери, що “обгортають” певний контент. Існує три основні складові будь-якого елемента:

  1. Відкриваючий тег: Вказує, де починається елемент (напр., <p>).
  2. Вміст (Content): Текст або інші теги всередині.
  3. Закриваючий тег: Вказує, де елемент закінчується (напр., </p>). Має косу риску /.

HTML-елемент — це сукупність цих трьох частин: відкриваючого тегу, контенту та закриваючого тегу. Наприклад: <h1>Вітаємо на сайті!</h1>

Існують також самозакриваючі теги (або “порожні елементи”), які не можуть містити тексту всередині себе. Наприклад, зображення (<img>), розрив рядка (<br>), горизонтальна лінія (<hr>) або поле вводу (<input>).

Атрибути — це додаткова інформація про елемент, яка вказується тільки у відкриваючому тезі. Вони завжди йдуть парами “ім’я=значення” (значення обов’язково в подвійних або одинарних лапках). Приклад: <a href="https://example.com" target="_blank" class="nav-link">Натисни мене</a>

1.2 Структура HTML5 документа (Boilerplate)

Жодна веб-сторінка не обходиться без базового каркасу (Boilerplate):

<!DOCTYPE html>
<html lang="uk">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Моя перша сторінка</title>
  </head>
  <body>
    <!-- Видимий контент знаходиться тут -->
  </body>
</html>

Давайте розберемо кожен рядок:


2. Глобальні елементи та форматування тексту

Існує десятки базових тегів, які використовуються для форматування тексту. Вони були в HTML ще з версій 2.0 та 3.0:

2.1 Заголовки (Headings)

Від <h1> до <h6>. Вони формують зміст сторінки.

2.2 Текстові елементи та списки

Блокові та Рядкові елементи (Block-level vs Inline):

До появи HTML5 і CSS Flexbox/Grid, ключовим “цеглинкою” верстки був тег <div> (Division) — порожній блоковий контейнер. Сайти розроблені у 2000-2010 роках часто страждали на проблему Div-soup (“Суп з дівів”), коли вся сторінка складалася зі структури типу <div><div><div><p>Текст</p></div></div></div>, що ускладнювало її читання як розробнику, так і ботам.


3. Семантичний HTML5: Чому він такий важливий?

В епоху HTML5 (стандарт затверджено у 2014 році) розробникам дали нові теги, які на вигляд (для браузера) працюють абсолютно ідентично тегу <div>, але мають “сенс” або “семантику”.

Семантичний код — це розмітка, яка передає смислове значення свого вмісту машинам (пошуковим роботам, браузерам, допоміжним програмам).

Розглянемо приклад:

3.1 Ключові Семантичні Теги HTML5

Ось основні елементи структурування (Landmark roles):

3.2 Семантичний акцент у тексті

3.3 Чому це вигідно бізнесу?

Робити “Семантично” часто складніше, ніж просто накидати стопку “дівів”. Але у реальному e-commerce чи медіа проектах це приносить гроші:


4. Доступність (Web Accessibility / a11y)

Web Accessibility (часто скорочують як a11y — “a” + 11 літер до + “y”) — це практика створення 웹і-сайтів і додатків, якими можуть користуватись люди з обмеженими можливостями (зір, моторика рук, слух, когнітивні розлади). Веб Консорціум (W3C) розробив стандарт WCAG (Web Content Accessibility Guidelines). Багато державних та банківських сайтів у Європі та США на законодавчому рівні (Акт ADA) зобов’язані відповідати цьому стандарту (як мінімум рівню AA), інакше їх оштрафують на мільйони доларів.

Основні принципи a11y, які веб-розробники зобов’язані вбудовувати у свою роботу ще на стадії написання HTML-каркасу:

  1. Навігація з Клавіатури: Дехто не користується мишкою з фізіологічних причин. Увесь інтерактивний сайт має управлятись клавішею Tab (перемикання фокусу), Space/Enter (взаємодія) та стрілками.
    • Семантичні теги <button> (кнопка) або <a> (посилання) автоматично ловлять фокус з клавіатури, на відміну від кастомної <div class="btn">.
    • Атрибут tabindex:
      • tabindex="0" — додає елемент у чергу вкладки (фокусу) за замовчуванням.
      • tabindex="-1" — прибирає елемент з фокуса при натисканні клавіші Tab, але дозволяє сфокусувати на ньому через JS функцію focus().
      • tabindex="1" (та інші додатні значення) — анти-патерн, що ламає природну чергу фокусування сторінки. Його варто уникати!
  2. Атрибути WAI-ARIA: (Web Accessibility Initiative - Accessible Rich Internet Applications). Іноді стандартних тегів замало (наприклад, реалізація “Табів”, “Модального вікна” або власного “Select”). Для цього використовуються атрибути aria-*, що пояснюють скрінрідерам, як працює ваш кастомний JS компонент:
    • aria-hidden="true" — ховає елемент тільки від скрінрідера (наприклад, суто декоративну SVG іконку).
    • aria-expanded="true" — повідомляє, що випадаюче меню (Акордеон) наразі відкрито.
    • aria-label="Закрити модальне вікно" — надає ім’я кнопці <button>X</button>, коли візуальна іконка “X” нічого не означає на слух.
    • role="dialog" — перетворює <div> на “Модальне вікно” в “очах” допоміжних систем.
  3. Контраст кольорів: Для людей із порушеннями зору чи дальтонізмом контент повинен мати достатній контраст із фоном (за WCAG мінімум 4.5:1 для нормального тексту). Використовуйте плагіни у Chrome, або перевіряйте контраст у Figma (до того як писати код!).

Висновки

Правильна HTML5 архітектура — не привід для творчості, а дотримання строгих стандартів “будівництва”. Використовуючи правильні семантичні теги (<header>, <main>, <article>, <nav>) замість безликих контейнерів, ви:

  1. Робите структуру коду легшою для підтримання (краща читабельність).
  2. Істотно допомагаєте “SEO-рушіям”, підвищуючи рейтинг у видачі Google (безкоштовний маркетинг).
  3. Забезпечуєте інклюзивність (Accessibility), даючи можливість користуватись вашим ресурсом мільйонам людей з інвалідністю за допомогою допоміжних технологій. Тести a11y, і використання атрибутів alt, aria-label — це база сучасного вебу та стандартів W3C.

Джерела

  1. MDN Web Docs: Semantics in HTML (https://developer.mozilla.org/en-US/docs/Glossary/Semantics)
  2. Шпаргалка з WAI-ARIA від W3C (https://www.w3.org/WAI/ARIA/apg/)
  3. Вступ до Accessibility на MDN (https://developer.mozilla.org/en-US/docs/Learn/Accessibility/What_is_accessibility)

Запитання для самоперевірки

  1. Що таке теги в HTML? В чому різниця між тегом та елементом?
  2. Яким є головне призначення мета-тегу <meta name="viewport"...> (у розділі <head>) і що трапиться з мобільним відображенням додання цього тегу?
  3. В чому принципова відмінність “Блокових” (block) і “Рядкових” (inline) елементів? Наведіть приклади.
  4. Поясніть на прикладах, у яких випадках використовують семантичні теги <article> замість <section>, і де саме логічно розміщувати <aside>?
  5. Для чого призначений атрибут alt у тегу <img>? Які дві проблеми він допомагає вирішити? Назвіть вийняток, у якому alt можна лишити зовсім пустим (alt="").
  6. Що таке Web Accessibility (a11y) і як працюють інструменти “skrіnreder’и” (екранні читалки)?
  7. Яка роль атрибута tabindex і чому використання tabindex="1" чи інших позитивних чисел вважається поганою практикою (анти-патерном) в UI/UX дизайні?
  8. Поясніть роботу і застосування атрибутів aria-hidden та aria-label для кастомних JS віджетів (наприклад, звичайних кнопок-іконок).