HTML
Общее
HTML5 Doctype
Указывайте в начале каждой HTML-страницы тип документа HTML5 Doctype, чтобы браузер работал в режиме соответствия стандартам. Это обеспечит единое отображение страниц в разных браузерах.
<!DOCTYPE html>
<html>
<head>
<!-- ... -->
</head>
<body>
<!-- ... -->
</body>
</html>
Lang
Для указания языка документа авторам рекомендуется прописывать атрибут языка в корневом элементе HTML. Это поможет инструментам синтеза речи определить какое произношение использовать, а инструментам перевода - какие правила.
<html lang="ru">
<!-- ... -->
</html>
Список кодов различных языков на Sitepoint.
Head
Favicon
Помимо стандартной фавиконки 16х16 есть большое множество иконок, которые используются на различных платформах, — вплоть до 512х512. Если иконки отличаются деталями, то необходимо отрисовать их вручную. Если же иконки отличаются только размером, возьмите самую большую иконку и сгенерируете все остальные, рекомендуемый инструмент — Real Favicon Generator:
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
<link rel="manifest" href="/manifest.json">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="theme-color" content="#ffffff">
Метатеги
IE каждой версии поддерживает работу «как предыдущая версия» и в зависимости от различных условий может автоматически отображать страницу как предыдущая версия. Метатегом можно заставить сайт отображаться в режиме последней версии.
<meta http-equiv="X-UA-Compatible" content="IE=Edge">Всегда явно объявляйте кодировку символов. При этом вы сможете избежать использования символьных сущностей в HTML-коде, если их кодировка совпадает с кодировкой документа (как правило, utf-8).
<meta charset="utf-8">
CSS
Для подключения CSS идеальный способ — использование Critical CSS, которые
подключаются через <style>. Это позволяет уменьшить время до отображения
контента. При невозможности использования просто подключайте link в head.
JS
Не подключайте скрипты в head, так как страница не отобразится, пока не
загрузятся скрипты. Скрипты в head можно подключать, если вы используете
атрибуты async \ defer.
Размещайте скрипты перед </body>, если на проекте есть поддержка старых
браузеров.
Body
Общее
Избегайте использования лишних элементов.
<!-- Недопустимо --> <span class="avatar"> <img src="avatars/csssr.png" alt="CSSSR"> </span> <!-- Правильно --> <img class="avatar" src="avatars/csssr.png" alt="CSSSR">Не указывайте значение логическому атрибуту.
<!-- Недопустимо --> <input type="checkbox" checked="true" /> <!-- Правильно --> <input type="checkbox" checked />
Ссылки
Не используйте
<a>для элементов, нажатие которых не приводит к смене URL.<!-- Недопустимо --> <a onclick="...">Открыть меню</a> <!-- Правильно --> <a href="/list.html">Список категорий</a>Для заглушек для
hrefу тех ссылок, адрес которых ещё неизвестен (но это будет именно ссылка, с переходом на другую страницу), используйтеhref="javascript:void(0);". Отличие отhref="#"в том, что нажатие на ссылку с#приводит к скроллу наверх страницы, что может быть неудобно.<!-- Недопустимо --> <a href="javascript:void(0);" onclick="...">Открыть меню</a> <!-- Допустимо --> <a href="#">Список категорий</a> <!-- Правильно --> <a href="javascript:void(0);">Список категорий</a>Используйте
<a>для всех элементов, которые могут куда-либо вести, даже если в макете этот элемент отрисован как обычный текст, так как в данном случае ссылка — логический элемент, а не визуальный.tel:+79876543210- для указания телефона. Номер должен начинаться с плюса и состоять только из чисел без спецсимволов типа пробелов, круглых скобок или дефиса;mailto:sales@csssr.com- для указания e-mail;skype:csssr.ru?chat- для указания Skype-контакта.
<!-- Недопустимо --> <span>+79876543210</span> <!-- Правильно --> <a href="tel:+79876543210">+79876543210</a>
Кнопки
Все интерактивные элементы, по которым происходит нажатие и которое не приводит к смене адреса, делайте через
<button>. Ни в коем случае не используйтеdiv,spanи другие неинтерактивные элементы.<!-- Недопустимо --> <div onclick="...">Открыть меню</div> <a onclick="...">Открыть меню</a> <!-- Правильно --> <button onclick="...">Открыть меню</button>Всегда явно указывайте атрибут
typeдля кнопки. По умолчанию он равенsubmit, поэтому если кнопка без типа окажется в форме, она по клику будет вызывать отправку формы.<!-- Недопустимо --> <button>Открыть меню</button> <button>Отправить форму</button> <!-- Правильно --> <button type="button">Открыть меню</button> <button type="submit">Отправить форму</button>Блокируйте кнопки через атрибут disabled и не блокируйте только через JS (проверка по какому-либо условию) или только через отдельный класс (
.button_state_disabled). При установке атрибутаdisabledкнопка становится неактивной для всех взаимодействий: по нажатию на неё не вызывается событие click, на неё нельзя навестиcь табом.<!-- Недопустимо --> <button class="button button_state_disabled">Открыть меню</button> <!-- Допустимо --> <button class="button button_state_disabled" disabled>Открыть меню</button> <!-- Правильно --> <button class="button" disabled>Открыть меню</button>
Картинки
Вставляйте контентные картинки через тег
<img>. Не меняйте его на другой элемент сbackground-imageдля использованияbackground-size. В случае, когда это необходимо, используйтеobject-fit+ полифил или деградацию для старых браузеров.<!-- Недопустимо --> <div style="background-image: url(...)"></div> <!-- Правильно --> <img src="..." />Картинка должна иметь атрибут
alt, который поясняет содержимое картинки. Он отображается, когда картинка не загрузилась.<!-- Недопустимо --> <img src="..." /> <!-- Правильно --> <img src="..." alt="..." />Если размер изображения заранее известен, то укажите его в атрибутах width и height. Это позволяет избежать скакания контента при загрузке картинки.
<!-- Допустимо --> <img src="..." /> <!-- Правильно --> <img src="..." width="800" height="600" />
Формы и элементы форм
Делайте все формы через тег
<form>. Даже в тех случаях, когда отправка формы обрабатывается через JS и не происходит перехода на другую страницу. Формы не должны представлять собой группу несвязанных полей + кнопку сtype='button', по клику на которую происходит отправка формы. JS должен обрабатывать именно сабмит формы, а не клик на кнопку, так как форма может сабмититься разными способами.<!-- Недопустимо --> <div> <input type="search" /> <button onclick="...">Искать</button> </div> <!-- Правильно --> <form onsubmit="..."> <input type="search" /> <button type="submit">Искать</button> </form>Создавайте все кастомные элементы формы поверх нативных соответствующих элементов и, если это возможно (например, чекбоксы \ радиокнопки), без использования JS. На мобильных устройствах используйте нативные элементы вместо кастомных выпадающих элементов (селектов, датапикеров). Нативные элементы должны быть доступны для спец. устройств (скрывать через visuallyhidden)
<!-- Недопустимо --> <div class="radio"> <div class="radio__input"></div> <div class="radio__label">Радиокнопка</div> </div> <!-- Правильно --> <label class="radio"> <input type="radio" /> <span class="radio__label">Радиокнопка</span> </label> <div class="radio"> <input type="radio" id="radio"/> <label for="radio" class="radio__label">Радиокнопка</label> </div>
Семантика и доступность
Старайтесь использовать элементы, которые отражают суть данного блока. Сведите к минимуму использование бессмысленных
divиspan. Хорошее описание семантики различных тегов можно найти на HTML5 Doctor.<!-- Недопустимо --> <div class="header"></div> <div class="main"></div> <div class="footer"></div> <!-- Правильно --> <header class="header"></header> <main class="main"></main> <footer class="footer"></footer>Ставьте на каждой странице заголовок
h1. Даже если дизайн не предполагает такого заголовка, всё равно поставьте его и скройте через visuallyhidden.<!-- Недопустимо --> <body> <div class="title">Каталог товаров</div> ... </body> <!-- Правильно --> <body> <h1 class="title">Каталог товаров</h1> ... </body> <body> <h1 class="visuallyhidden">Каталог товаров</h1> ... </body>Для всего контента, который не является текстом или может быть частично скрыт, оставляйте поясняющий текст:
- для
img—alt; - для кнопок, ссылок —
title, который описывает действие (например, «Сохранить»), а не визуальную составляющую («Дискета»); - для контента, который частично скрыт и не открывается (например, через
text-overflow) —title, чтобы была возможность прочитать полный текст.
<!-- Недопустимо --> <img src="..." /> <button> <span class="icon icon_save"></span> </button> <p> Длинный текст, который может быть частично скрыт и не виден пользователю </p> <!-- Правильно --> <img src="..." alt="..."/> <button title="Сохранить"> <span class="icon icon_save"></span> </button> <p title="..."> Длинный текст, который может быть частично скрыт и не виден пользователю </p>- для