---
# System prepended metadata

title: HTML best practices

---

# HTML best practices

## Семантика

1. Объединять блоки не по их визуальному расположению, а по их смыслу.

    Объединяем блоки вот так:
    ![](https://i.imgur.com/kmlAD8q.png)
    А не вот так:
    ![](https://i.imgur.com/3iIzVK3.png)


2.  Все элементы с текстом, контент которых формируется динамически, проверяем на то, чтобы они не ломались при большем количестве текста, чем на макете.

5. Использовать `<table>` только для реальных таблиц.

    Если перед таблицей есть её текстовое описание, сделать это внутри тега `<table>` через `<caption>`.
    
    Если у таблицы первая строка идет заголовком, то использовать `<thead>` и вложенные `<th>` для этого и использовать "scope" для этих ячеек.
    
    Пример:
    
```
    <table>
      <caption>
        First two U.S. presidents
      </caption>
      <thead>
        <tr>
          <th scope="col">Name</th>
          <th scope="col">Took office</th>
          <th scope="col">Party</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>George Washington</td>
          <td>April 30, 1789</td>
          <td>n/a</td>
        </tr>
        <tr>
          <td>John Adams</td>
          <td>March 4, 1797</td>
          <td>Federalist</td>
        </tr>
      </tbody>
    </table>
```

6. Не использовать `<br>` нигде, кроме случаев, когда соблюдены все требования:

    * Newlines are semantically meaningful.
    * Indentation is not semantically meaningful (otherwise you should use a `<pre>`).
    * There exists no other semantically appropriate tag, like a paragraph or header tag.

7. Использовать семантические теги.
    [Блок-схема](http://html5doctor.com/downloads/h5d-sectioning-flowchart.pdf) для выбора семантических тегов.
    
## Теги
    
2. Структура тегов в первую очередь должна идти от содержания, а не от дизайна.
    ![](https://i.imgur.com/RgI8ala.png) — например, такой элемент можно оформить как четыре идущих подряд элемента: иконка сообщений, бадж с цифрой 10, иконка аватара и имя пользователя. Но тут надо явно объединить с помощью `<div>` два блока, чтобы семантически они были отдельными — блок с информацией по сообщению и блок про пользователя.  

6. У каждой страницы должны быть теги `title` и мета теги `keywords`, `description` (на содержимое спросить контент у менеджера)
9. атрибуты должны именоваться `lower-case-hyphenated` (имена только маленькими буквами и через дефис) и, если значение строковое и показывает какое-то имя, то тоже должно быть `lower-case-hyphenated`. Кастомные атрибуты стараться начинать с data- (это стандартная практика, рекомендованная для HTML5).

    Пример: 
    
    `<a href="/" data-index="33" data-page-name="main-page">Home</a>`
    
10. Не использовать id, кроме случаев, когда они семантически востребованы.

    Когда гарантируется их уникальность, например, на уровне базы данных и когда вам нужно:

    * сделать рабочую навигацию в рамках одной страницы (например, как на Википедии или на этом сайте сборника best-practices.
    * связать `<label>` и `<input/>`, которые находятся в совершенно разных ветках дерева DOM (вообще, лучше всегда просто `<input/>` внутрь `<label>` ставить, и тогда никакие айдишники не нужны).
11. Все теги идут только с классами — никаких пустых `<div>`, `<section>`
12. Избегать по максимуму инлайновые стили и on* attributes in html
14. Не использовать ссылки с пустым или невалидным `href` (никаких `<a href="#">`) — тогда лучше использовать ссылку-заглушку на несуществующий урл, который явно говорит, что ссылка не проставлена.

    Если вы верстаете проект, в котором есть страницы, которых нет в дизайне (допустим, они потом при интеграции с сервером динамически создаваться будут), то лучше ставьте адрес, который явно говорит, что это ссылка-заглушка. Причем все ссылки-заглушки должны в рамках проекта иметь один адрес, например `<a href="/mock-address/change-me"></a>`.
    
    Для SPA иногда приходится динамически js-ом генерить такие ссылки (как минимум в angular, там для этого даже отдельный атрибут ng-href), которые бы поддерживали динамическую генерацию на основе чистого клиентского раутинга.
    
    Не надо никаких `<a href="#">` или `<a href="javascript:someFunc(1)">`.
    
    Плюс не надо сюда сохранять урлы до методов API на сервере, надеясь, что JS-ом вы сможете потом обработать клик, отправить ajax запрос на сервер по этому урлу и сами обработать ответ. Этого не произойдет, если юзер откроет ссылку в новой вкладке через контекстное меню или клик колесом мыши, например. Все урлы, указанные в href, должны открывать читаемый для человека контент, который целиком зависит только от сервера. Оригинал последнего абзаца.


15. Ссылки на чужие сайты должны содержать атрибут `target="_blank"`, чтобы открываться в новом окне. Все ссылки с `target="_blank"` должны так же содержать атрибут `rel="noopener noreferrer"`. and consider `nofollow`

19. Спрашивать у дизайнеров, какие элементы делать autofocus на какой странице.

23. Классические инлайн теги должны быть только inline или inline-block, и в них не должно быть ничего, кроме простого текста и других таких же инлайновых тегов.

    Исключения: `<a>` — иногда ссылку надо сделать блочным элементом, но лучше использовать inline-block.

24. Для телефонов, емайл-адресов и скайп никнеймов нужно использовать `<a>` c соответствующим адресом.
      ```
      <a href="tel: +74951234567">+7 (495) 123-45-67</a>
    <a href="mailto: example@mail.ru">example@mail.ru</a>
    <a href="skype: someskype?call">someskype</a>
    ```
    
25. Отображать примеры кода через тег `<code>`.

## Подключаемые файлы

1. Все картинки, шрифты и т. д. должны иметь уникальное название в рамках проекта. Если в проекте нет индивидуальных соглашений, то они должны именоваться в стиле lower-case-hyphenated.
5. Все фотографии и картинки, где нет прозрачности, делать в webp.
7. use srcsets

## accessibility

18. Все интерактивные элементы, для которых дизайнером задуман нетривиальный порядок полей, должны иметь атрибут `tabindex`, плюс всегда кнопка сабмита в `tabindex` должна быть последней (соответственно, если есть визуально поля под кнопкой, у них должен быть `tabindex` и он должен быть меньше, чем у кнопки).

## basic
21. Если у поля есть четкое назначение, то использовать соответствующий тип (email, number, color и т. д.).
