HTML *
* О нём мало говорят
HTML
Первое, что видит браузер
Содержит информацию о ресурсах
Парсится различными инструментами
Декларативный
109
<a> <abbr>
<address> <area> <article>
<aside> <audio> <b> <base>
<bdi> <bdo> <blockquote> <body>
<br> <button> <canvas> <caption>
<cite> <code> <col> <colgroup>
<data> <datalist> <dd> <del>
<details> <dfn> <dialog> <div>
<dl> <dt> <em> <embed>
<fieldset> <figcaption> <figure>
<footer> <form> <h1-h6> <head>
<header> <hgroup> <hr> <html>
<i> <iframe> <img> <input>
<ins> <kbd> <label> <legend>
<li> <link> <main> <map>
<mark> <math> <menu> <meta>
<meter> <nav> <noscript>
<object> <ol> <optgroup>
<option> <output> <p> <picture>
<pre> <progress> <q> <rp>
<rt> <ruby> <s> <samp>
<script> <search> <section>
<select> <slot> <small> <source>
<span> <strong> <style> <sub>
<summary> <sup> <svg> <table>
<tbody> <td> <template>
<textarea> <tfoot> <th> <thead>
<time> <title> <tr> <track>
<u> <ul> <var> <video>
<wbr>
Elements
01. Семантичная вёрстка
Ориентиры (<header>, <main>, <aside>, <footer>, ...)
Дерево заголовков (<h1>-<h6>)
Группировка (<section>, <blockquote>, <table>, <pre>, ...)
Подписи (<table> + <caption>, <figure> + <figcaption>, <fieldset> + <legend>)
Семантика текста (<strong>, <i>, <code>, <dfn>, <kbd>, ...)
Зачем: скринридеры, режим чтения, браузерные расширения, улучшение поисковой выдачи, SEO
Семантика для циников, Вадим Макеев
02. lang
<html lang="ru"><!-- Основной язык контента — русский -->
<head><!-- ... --></head>
<body>
<p>Контент на русском языке. <i lang="en">English content</i>.</p>
<p lang="en">English content...</p>
<p lang="de">Deutscher Inhalt...</p>
</body>
</html>
Зачем: переводчики, скринридеры, региональная выдача.
03. translate
translate="" или translate="yes" — переводить, по умолчанию
translate="no" — не переводить
<p>Code sample:</p>
<pre translate="no">
<!-- code -->
</pre>
<p>Some <i translate="no">non-translatable term</i> in text.</p>
<p>Some foreign word "<i lang="de" translate="yes">Fremdwort</i>" in text.</p>
Зачем: контроль автоматического перевода.
04. hidden
<div class="notification" hidden>
<!-- ... -->
</div>
Зачем: не требуется пользовательский CSS, предотвращение сдвигов макета (CLS).
05. alt
<img src="cat.jpg" alt="Бело-рыжый кот сидит на подоконнике.">
<p>
<img src="phone.svg" alt="Телефон:"> +123 456 78 90
</p>
<a href="/">
<img src="logo.svg" alt="Главная">
</a>
<img src="decorative.png" alt="">
<figure>
<img src="chart.svg" alt="График популяции зубров в Беларуси.">
<figcaption>На графике показана динамика популяции ...</figcaption>
</figure>
Зачем: скринридеры, поиск по картинкам, fallback.
Images Tutorial | Web Accessibility Initiative
06. <source>
<picture>
<source srcset="img-1920.webp 1920w, img-1024.webp 1024w, img-768.webp 768w, img-576.webp 576w" sizes="(min-width: 900px) 50vw, 100wv" type="image/webp">
<img src="img.jpg" srcset="img-1920.jpg 1920w, img-1024.jpg 1024w, img-768.jpg 768w, img-576.jpg 576w" sizes="(min-width: 900px) 50vw, 100wv" alt="">
</picture>
<video controls width="600" height="400">
<source src="video.hevc.mp4" type="video/mp4; codecs=hevc,mp4a.40.2">
<source src="video.av1.mp4" type="video/mp4; codecs=av01.0.05M.08,opus">
<source src="video.h264.mp4" type="video/mp4; codecs=avc1.4D401E,mp4a.40.2">
</video>
Зачем: адаптивность, ретина, art direction, уменьшение трафика.
Audio and Video
Пример <picture> и <source>
07. width и height
<picture>
<source srcset="image-desktop.jpg" width="1920" height="1080" media="(min-width: 1200px)">
<source srcset="image-tablet.jpg" width="800" height="600" media="(min-width: 900px)">
<source srcset="image-mobile.jpg" width="320" height="640"> alt="Описание картинки">
</picture>
<video src="movie.mp4" controls width="1920" height="1080"></video>
<iframe src="https://youtube.com/embed/video_id" width="560" height="315" frameborder="0" allowfullscreen></iframe>
Зачем: предотвращение сдвигов макета (CLS).
Cumulative Layout Shift (CLS)
08. Субтитры
<video src="video.mp4" controls width="1920" height="1080">
<track src="subtitles.vtt" kind="subtitles" srclang="en" label="English">
</video>
WEBVTT
00:00:00.000 -> 00:00:05.000
Welcome to our video tutorial on HTML5 video!
00:00:05.000 -> 00:00:10.000
In this tutorial, we will show you how to use the HTML5 video tag.
Зачем: текстовая альтернатива.
Web Video Text Tracks Format (WebVTT)
Пример субтитров
09. loading
<picture>
<source srcset="image-desktop.jpg" width="1920" height="1080" media="(min-width: 1200px)">
<source srcset="image-tablet.jpg" width="800" height="600" media="(min-width: 900px)">
<source srcset="image-mobile.jpg" width="320" height="640">
<img src="image-desktop.jpg" loading="lazy" width="1920" height="1080" alt="Описание картинки">
</picture>
<iframe src="https://youtube.com/embed/video_id" loading="lazy" width="560" height="315" frameborder="0" allowfullscreen></iframe>
Зачем: уменьшение трафика.
Audio and Video
Пример работы loading="lazy"
10. Используйте ссылки!
<nav>
<a href="/">Главная</a>
<a href="/catalog">Каталог</a>
<a href="/about">О компании</a>
</nav>
<nav>
<p>Содержание:</p>
<a href="#section1">Раздел 1</a>
<a href="#section2">Раздел 2</a>
</nav>
Зачем: режимы открытия, копирование, сохранение, доступность, состояния
Тег a, Никита Дубко
11. download
<a href="cat.jpg" download>
<img src="cat.jpg" alt="Бело-рыжый кот сидит на подоконнике.">
</a>
<a href="https://cdn.com/pricelist_april.pdf" download>Скачать прайслист</a>
<a href="https://cdn.com/aQBdyAE6TgxgAt.pdf" download="Прайслист за апрель">
Скачать прайслист
</a>
Зачем: человекочитаемое название, не требуется JS.
12. Внешние ссылки
<a href="https://example.com/" target="_blank" rel="noreferrer noopener">
Сайт партнёра
<span class="visually-hidden"> откроется в новой вкладке</span>
</a>
<a href="https://twitter.com/" target="_blank" rel="noreferrer noopener">
<span class="visually-hidden">Мы в Twitter, откроется в новой вкладке</span>
<svg aria-hidden="true"><!— ... —></svg>
</a>
Зачем: сохранение вкладки, повышение безопасности.
13. Схемы
<p>Контакты:</p>
Email: <a href="mailto:example@email.com">example@email.com</a>
Телефон: <a href="tel:+1234567890">+123 456-78-90</a>
Запись по СМС: <a href="sms:+1234567891">+123 456-78-91</a>
Факс: <a href="fax:+1234567892">+123 456-78-92</a>
Адрес: <a href="geo:53.902284,27.561831">Минск, ул. Уличная, д. 1</a>
<a href="sms:+1234567890?body=Добрый день! Хочу записаться на приём во вторник.&subject=Запись на приём">Записаться на вторник по СМС</a>
<a href="mailto:example@email.com?to=example2@email.com&subject=Отзыв&body=Добрый день! Хочу оставить отзыв:">Оставить отзыв</a>
Зачем: нативные приложения, быстрые действия.
14. Deep links
<a href="tg://msg?user_id=alexnozer">Мой Telegram</a>
<a href="tg://join?invite=<invite_link>">Наш чат в Telegram</a>
Забирай наш крутой <a href="tg://addstickers?set=<stickers>">стикерпак</a>!
Также есть для других соц сетей.
Зачем: нативные приложения, PWA, быстрые действия.
Telegram Deep links
15. Используйте <form>!
<form action="https://example.com/add_to_cart" method="post">
<!-- поля формы -->
</form>
Зачем: автодополнение, встроенная валидация, сохранение данных, прогрессивное улучшение.
16. <label> и placeholder
<form action="https://example.com/profile_edit" method="post">
<label for="name">Имя</label>
<input type="text" name="name" id="name" placeholder="Алексей">
<label for="email">Email</label>
<input type="text" name="email" id="email" placeholder="example@email.com">
<label for="phone">Телефон</label>
<input type="text" name="phone" id="phone" placeholder="+375441234567">
<!-- остальные поля -->
<button type="submit">Сохранить</button>
</form>
Зачем: скринридеры, переход к полю, понятность, автодополнение.
17. autocomplete
<form action="https://example.com/profile_edit" method="post">
<label for="name">Имя</label>
<input type="text" name="name" id="name" autocomplete="name">
<label for="email">Email</label>
<input type="text" name="email" id="email" autocomplete="email">
<label for="phone">Телефон</label>
<input type="text" name="phone" id="phone" autocomplete="tel mobile">
<!-- остальные поля -->
<button type="submit">Сохранить</button>
</form>
Зачем: автодополнение, сохранение данных.
001. Как работает автозаполнение в браузерах
18. Валидация и novalidate
<form action="https://example.com/profile_edit" method="post" novalidate>
<label for="name">Имя</label>
<input type="text" name="name" id="name" pattern="[а-яА-Я'\-.]+">
<label for="email">Email</label>
<input type="text" name="email" id="email" minlenght="5" required>
<label for="phone">Телефон</label>
<input type="text" name="phone" id="phone" pattern="\+375(29|44|25)\d{7}">
<!-- остальные поля -->
<button type="submit">Сохранить</button>
</form>
Зачем: прогрессивное улучшение.
19. inputmode
<form action="https://example.com/profile_edit" method="post">
<label for="name">Имя</label>
<input type="text" name="name" id="name" inputmode="text">
<label for="email">Email</label>
<input type="text" name="email" id="email" inputmode="email">
<label for="phone">Телефон</label>
<input type="text" name="phone" id="phone" inputmode="tel">
<!-- остальные поля -->
<button type="submit">Сохранить</button>
</form>
Зачем: виртуальные клавиатуры.
20. autocapitalize
off или none— стандартное поведение
on или sentences — Lorem ipsum. Dolor sit
words — Lorem Ipsum Dolor Sit
characters — LOREM IPSUM DOLOR SIT
<input type="text" name="name" id="name" autocapitalize="words">
Зачем: удобство ввода.
21. spellcheck
<form action="https://example.com/login" method="post">
<label for="username">Логин</label>
<input type="text" name="username" id="username" spellcheck="false">
<label for="password">Пароль</label>
<input type="password" name="password" id="password">
<button type="submit">Войти</button>
</form>
Зачем: предотвращение автокоррекции.
Пример spellcheck
spellcheck="false":
spellcheck="true":
22. viewport
<head>
<!-- ... -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ... -->
</head>
Зачем: адаптивность, зум на мобильных устройствах.
Viewport meta tag
23. Цветовые схемы
<head>
<!-- ... -->
<meta name="color-scheme" content="dark light">
<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#1c1c1e" media="(prefers-color-scheme: dark)">
<link rel="stylesheet" href="base.css">
<link rel="stylesheet" href="light.css" media="(prefers-color-scheme: light)">
<link rel="stylesheet" href="dark.css" media="(prefers-color-scheme: dark)">
<!-- ... -->
</head>
Зачем: адаптивность, пользовательские предпочтения.
Пример theme-color
24. Open Graph
<meta property="og:title" content="Заголовок статьи">
<meta property="og:description" content="Описание статьи">
<meta property="og:type" content="article">
<meta property="og:url" content="http://example.com/article">
<meta property="og:image" content="http://example.com/cover.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="article:published_time" content="2022-03-01T08:00:00+08:00">
<meta property="article:modified_time" content="2022-03-02T08:00:00+08:00">
<meta property="article:author" content="http://example.com/author">
<meta property="article:tag" content="Тег">
<meta property="article:section" content="Раздел блога">
Зачем: шаринг, улучшение сниппета в поиске.
The Open Graph protocol
25. Микроразметка
<article itemscope itemtype="http://schema.org/Article">
<img src="https://example.com/cover.jpg" itemprop="image" alt="">
<h2 itemprop="headline">Заголовок статьи</h2>
<p itemprop="description">Короткое описание</p>
<div itemprop="author" itemscope itemtype="http://schema.org/Person">
<p itemprop="givenName">Имя</p>
<link rel="author" itemprop="url" href="https://example.com/author">
</div>
<time itemprop="datePublished" datetime="2023-04-07">7 апреля 2023</p>
<meta itemprop="dateModified" content="2023-04-09">
<a href="https://example.com/article" itemprop="url">Читать</a>
</article>
Schema.org
25. Микроразметка
<script type="application/json+ld">
{
"@context": "https://schema.org",
"@type": "Article",
"image": "https://example.com/cover.jpg",
"headline": "Заголовок статьи",
"description": "Короткое описание",
"datePublished": "2023-04-07",
"url": "https://example.com/article",
"author": { ... }
}
</script>
Зачем: улучшение сниппета в поиске, другие устройства, SEO.
JSON for Linking Data
Вопросы