Skip to content

Latest commit

 

History

History
318 lines (196 loc) · 20.5 KB

README.md

File metadata and controls

318 lines (196 loc) · 20.5 KB

HTML

  1. Семантика
  2. Теги
  3. Подключаемые файлы

Семантика

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

    Объединяем блоки вот так:
    хороший пример

    А не вот так:
    плохой пример.
    Как минимум, это очень легко позволит потом добавить новый элемент, когда надо будет по требованию заказчика сделать лист из 4 элементов, а не трех, как здесь. Плюс второй подход очень неудобен, если контент генерируется динамически. Так что если вы создаете верстку, которую потом будут прикручивать к бэкенду заказчики, и сделаете такую верстку, проклятия от их программистов и порча всей нашей кармы обеспечены.

  • 1.2 Если есть что-то похожее на список, проверяем, как будет выглядеть при большем количестве элементов.

    список

    Если непонятно, что будет при 4-х элементах, как в этом случае, обязательно спросить, а не принимать решение самостоятельно

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

    В имена подставляем знаменитое Константин Константинопольский.
    В идеале моменты, которые будет трудно масштабировать текстом, находить еще на стадии знакомства с макетом и задавать вопросы дизайнеру.

  • 1.4 Не вставлять блочные элементы внутрь инлайновых.

    Никаких <span><div></div></span>.

  • 1.5 Использовать h1..h6 только для заголовков, причем h1 должен встречаться в одной странице всего один раз.

  • 1.6 Использовать <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>

  • 1.7 Не использовать <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.

  • 1.8 Использовать семантические теги.

    Почему их нужно использовать, узнать можно здесь и здесь.
    Блок-схема для выбора семантических тегов.

Теги

  • 2.1 Все теги должны работать даже без CSS и JS.

    Все тексты, видимые сначала при открытии страницы так же должны быть доступны, формы должны сабмититься, ссылки должны переходить (а ссылки, по которым вообще не должно быть перехода и для которых принято ставить href="#", вообще не использовать, это будет далее).

  • 2.2 Структура тегов в первую очередь должна идти от содержания, а не от дизайна

    пример — например, такой элемент можно оформить как четыре идущих подряд элемента: иконка сообщений, бадж с цифрой 10, иконка аватара и имя пользователя. Но тут надо явно объединить с помощью <div> два блока, чтобы семантически они были отдельными — блок с информацией по сообщению и блок про пользователя. Для css потом, возможно, придется писать лишние стили, но верстка будет более осмысленной и не привязанной лишний раз к дизайну.

  • 2.3 Начинаем новый .html файл с <!DOCTYPE html>, как следует по HTML5 стандарту, если этот файл не предназначен для расширения другими файлами через какой-нибудь шаблонизатор.

  • 2.4 Перед <!DOCTYPE html> не должно быть никаких символов, включая пробелы и переносы строк.

  • 2.5 Внутри <head> первым тегом должно идти <meta charset="utf-8">.

  • 2.6 У каждой страницы должны быть теги title и мета теги keywords, description (на содержимое спросить контент у менеджера).

  • 2.7 В head добавлять <meta name="viewport" content="initial-scale=1.0, width=device-width"> — на мобильных браузерах можно избежать горизонтального скролла и масштабировать контент на всю ширину экрана.

  • 2.8 Не использовать самозакрывающиеся теги, если они не поддерживают другого режима.

    Нельзя:

    <div />
    <span />

    Можно:

    <link />
    <img />
    <input />

  • 2.9 Все атрибуты должны быть внутри двойных кавычек

    Нельзя:

    <img width=200 />
    <div class=block>
      <a href='/some/url'></a>
    </div>

    Можно:

    <img width="200" />
    <div class="block">
      <a href="/some/url"></a>
    </div>

    Плюс, если в проекте нет других соглашений, атрибуты должны именоваться lower-case-hyphenated (имена только маленькими буквами и через дефис) и, если значение строковое и показывает какое-то имя, то тоже должно быть lower-case-hyphenated. Кастомные атрибуты стараться начинать с data- (это стандартная практика, рекомендованная для HTML5).

    Пример: <a href="/" data-index="33" data-page-name="main-page">Home</a>

  • 2.10 Не использовать id, кроме случаев, когда они семантически востребованы.

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

    • сделать рабочую навигацию в рамках одной страницы (например, как на Википедии или на этом сайте сборника best-practices.
    • связать <label> и <input />, которые находятся в совершенно разных ветках дерева DOM (вообще, лучше всегда просто <input /> внутрь <label> ставить, и тогда никакие айдишники не нужны).

  • 2.11 Все теги идут только с классами — никаких пустых <div>, <section> и т. д. Но можно для инлайновых элементов, если есть четкое понимание зачем. Это очень сильно мешает новым людям входить в проект и вам через некоторое время разобраться в собственной верстке.

  • 2.12 Избегать по максимуму инлайновые стили и обработчики событий в html (то есть никаких <div onclick="func()">).

  • 2.13 Все изображения должны содержать alt.

  • 2.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, должны открывать читаемый для человека контент, который целиком зависит только от сервера. Оригинал последнего абзаца.

  • 2.15 Ссылки на чужие сайты должны содержать атрибут target="_blank", чтобы открываться в новом окне.

  • 2.16 Все ссылки с target="_blank" должны так же содержать атрибут rel="noopener noreferrer".

    Это связано с уязвимостью, в соответствии с которой сайт, который вы открыли, получит доступ к сайту, с которого перешли через window.opener, причем это работает даже кроссдоменно.

  • 2.17 Все инпуты, селекты и другие интерактивные элементы форм должны располагаться внутри тега <form>.

    <form>
      <label>
        First name:
        <input type="text" name="first-name" value="John" />
      </label>
      <label>
        Last name:
        <input type="text" name="last-name" value="Doe" />
      </label>
      <button type="submit">Submit</button>
    </form>

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

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

  • 2.20 Никогда не допускать вложенные формы <form>.

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

  • 2.22 Каждый тег, в котором может лежать текст, должен быть проверен на большое количество символов.

    Все заголовки и все теги с текстовыми описаниями.
    Все инпуты проверять, чтобы при заполнении текст не прижимался вплотную к правой границе:
    image

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

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

  • 2.24 Для телефонов, емайл-адресов и скайп никнеймов нужно использовать <a> c соответствующим адресом.

    <a href="tel: +74951234567">+7 (495) 123-45-67</a>
    <a href="mailto: [email protected]">[email protected]</a>
    <a href="skype: someskype?call">someskype</a>

  • 2.25 Отображать примеры кода через тег <code>.

    Иногда на некоторых проектах нужно прямо на сайте показывать пользователям примеры кода (например, здесь в туториале Реакта целая куча примеров кода) — эти примеры должны быть написаны моноширинными шрифтами и отличаться от обычного текста — по умолчанию достаточно обрамить код в тeг <code>.

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

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

  • 3.2 В проекте обязательно должен быть favicon.ico, подключаемый на всех страницах.

    Как это сделать, используя webpack, очень хорошо написано в этой статье.

  • 3.3 В сафари своя версия favicon, ее тоже обязательно надо настраивать.

    То есть нужна svg для контура иконки, и нужен цвет для иконки при наведении. Статья.

  • 3.4 Прогонять картинки через kraken.io или использовать свои CLI-утилиты для этого.

  • 3.5 Все фотографии и картинки, где нет прозрачности, делать в jpg.

  • 3.6 При нарезке картинок из фотошопа поставить DPI равным 72dpi, а саму картинку сохранить через "Save for Web".

  • 3.7 Максимальная ширина картинки — 1920 пикселей. Если в макетах она больше, пропорционально ужимайте.

    На самом деле, это правило спорно (как минимум для ретина дисплеев я не уверен), но следуйте ему, пока дизайнер не скажет другого.