HTML: 25 фич, которые сделают ваш сайт удобнее

Алексей Назаренко, MinskCSS, апрель 2023

HTML: 25 фич, которые сделают ваш сайт удобнее

Алексей Назаренко, SpurIT

Алексей Назаренко

Работаю в SpurIT

Twitter, Telegram, Email

HTML *

* О нём мало говорят

UX *

* Это важно

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. Семантичная вёрстка

Зачем: скринридеры, режим чтения, браузерные расширения, улучшение поисковой выдачи, 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

<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>

Зачем: контроль автоматического перевода.

Пример ненужного перевода блока с JavaScript-кодом на сайте Medium в статье про веб-компоненты. Introduction to Web Components

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)

Пример 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, Никита Дубко
Hyperlink

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>

Зачем: автодополнение, встроенная валидация, сохранение данных, прогрессивное улучшение.

Пример <form> на Shopify

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>

Зачем: виртуальные клавиатуры.

Пример inputmode

Inputmode Sandbox

20. autocapitalize

<input type="text" name="name" id="name" autocapitalize="words">

Зачем: удобство ввода.

Пример autocapitalize

autocapitalize Text Input Sample

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

Метаданные

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

Пример color-scheme

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

Итог

Вопросы

Спасибо за внимание!

Слайды: html-ux-minskcss.netlify.app
Twitter: @alex_nozer
Telegram: @alexnozer

Алексей Назаренко, SpurIT