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

HTML — фундамент вашего сайта, поэтому всегда нужно быть внимательным при его написании. Важно соблюдать иерархию, корректно закрывать теги, использовать подходящие ID, классы и атрибуты, и всегда валидировать свой код.

Lotus публикует перевод руководства, размещённый в репозитории html-best-practices.

Основное

Начните с DOCTYPE

DOCTYPE нужен для правильной интерпретации стандарта документа.

Плохо:

<html>
  …
</html>

Хорошо:

<!DOCTYPE html>
<html>
  ...
</html>

Не используйте наследственный или устаревший DOCTYPE

DOCTYPE больше не нужен для DTD.

Плохо:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">

Хорошо:

<!DOCTYPE html>

Не используйте декларацию XML

Подумайте лишний раз, так ли вам нужен XHTML.

Плохо:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE html>

Хорошо:

<!DOCTYPE html>

Пользуйтесь кодами спецсимволов как можно меньше

Если вы пишете HTML-документ в кодировке UTF–8, то почти все символы (включая эмодзи) можно писать напрямую.

Плохо:

<p><small>Copyright &copy; 2014 W3C<sup>&reg;</sup></small></p>

Хорошо:

<p><small>Copyright © 2014 W3C<sup>®</sup></small></p>

Избегайте &, <, >, " и в сочетании со спецсимволами

Избегайте эти символы, чтобы избежать багов.

Плохо:

<h1>The "&" character</h1>

Хорошо:

<h1>The &quot;&amp;&quot; character</h1>

Используйте цифровой код для управляющих или невидимых символов

Их легко перепутать с другими символами. К тому же спецификация не гарантирует, что они будут определены верно и в удобочитаемом виде.

Плохо:

<p>This book can read in 1 hour.</p>

Хорошо:

<p>This book can read in 1&#xA0;hour.</p>

Оставляйте пробелы по краям содержимого комментариев

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

Плохо:

<!--This section is non-normative-->

Хорошо:

<!-- This section is non-normative -->

Не пропускайте закрывающий тег

Одно из основополагающих правил.

Плохо:

<html>
  <body>
    ...

Хорошо:

<html>
  <body>
    ...
  </body>
</html>

Не используйте различные форматы одинарных тегов

Последовательность — ключ к читабельному коду.

Плохо:

<img alt="HTML Best Practices" src="/img/logo.png">
<hr />

Хорошо:

<img alt="HTML Best Practices" src="/img/logo.png">
<hr>

Не оставляйте пробелы вокруг тегов и значений атрибутов

Нет причин для этого.

Плохо:

<h1 class=" title " >HTML Best Practices</h1>

Хорошо:

<h1 class="title">HTML Best Practices</h1>

Не чередуйте разные регистры

Будьте последовательны.

Плохо:

<a HREF="#general">General</A>

Хорошо:

<a href="#general">General</a>

Тоже можно:

<A HREF="#general">General</A>

Не чередуйте разные стили кавычек

Будьте последовательны во всём.

Плохо:

<img alt="HTML Best Practices" src='/img/logo.jpg'>

Хорошо:

<img alt="HTML Best Practices" src="/img/logo.jpg">

Не разделяйте атрибуты двумя или более пробелами

Многих это может смутить.

Плохо:

<input   name="q"  type="search">

Хорошо:

<input name="q" type="search">

Пропускайте значения логических атрибутов

Плохо:

<audio autoplay="autoplay" src="/audio/theme.mp3">

Хорошо:

<audio autoplay src="/audio/theme.mp3">

Пропускайте пространства имён

SVG и MathML можно использовать в HTML5 напрямую.

Плохо:

<svg xmlns="http://www.w3.org/2000/svg">
  ...
</svg>

Хорошо:

<svg>
  ...
</svg>

Не используйте XML-атрибуты

Мы ведь пишем HTML-документ.

Плохо:

<span lang="ja" xml:lang="ja">...</span>

Хорошо:

<span lang="ja">...</span>

Не смешивайте data-*, микроформаты и атрибуты RDFa Lite с обычными атрибутами

Строка может быть чересчур сложной для чтения. Это простое правило улучшит читабельность подобных строк.

Плохо:

<img alt="HTML Best Practices" data-height="31" data-width="88" itemprop="image" src="/img/logo.png">

Хорошо:

<img alt="HTML Best Practices" src="/img/logo.png" data-width="88" data-height="31" itemprop="image">

Отдавайте предпочтение скрытой семантике ARIA

Некоторые элементы имеют скрытый атрибут ARIA. Их задавать не надо.

Плохо:

<nav role="navigation">
  ...
</nav>

<hr role="separator">

Хорошо:

<nav>
  ...
</nav>

<hr>

Корневой элемент

Добавьте атрибут lang

lang поможет перевести HTML-документ.

Плохо:

<html>

Хорошо:

<html lang="en-US">

Делайте атрибут lang как можно короче

Японский используют только в Японии, поэтому код страны не обязателен.

Плохо:

<html lang="ja-JP">

Хорошо:

<html lang="ja">

По возможности избегайте data-*

Подходящий атрибут поможет браузеру правильно распознать данные.

Плохо:

<span data-language="french">chemises</span>
...
<strong data-type="warning">Do not wash!</strong>

Хорошо:

<span title="French"><span lang="fr-FR">chemises</span></span>
...
<strong class="warning">Do not wash!</strong>

Мета-данные документа

Добавляйте элемент title

Значением элемента title пользуются различные приложения помимо браузера.

Плохо:

<head>
  <meta charset="UTF-8">
</head>

Хорошо:

<head>
  <meta charset="UTF-8">
  <title>HTML Best Practices</title>
</head>

Не используйте элемент base

Абсолютный пуль или URL надёжнее и для разработчиков и для пользователей.

Плохо:

<head>
  ...
  <base href="/blog/">
  <link href="hello-world" rel="canonical">
  ...
</head>

Хорошо:

<head>
  ...
  <link href="/blog/hello-world" rel="canonical">
  ...
</head>

Указывайте MIME-тип для подключаемых ресурсов

Это подскажет приложению, как следует интерпретировать ресурс.

Плохо:

<link href="/pdf" rel="alternate">
<link href="/feed" rel="alternate">
<link href="/css/screen.css" rel="stylesheet">

Хорошо:

<link href="/pdf" rel="alternate" type="application/pdf">
<link href="/feed" rel="alternate" type="application/rss+xml">
<link href="/css/screen.css" rel="stylesheet">

Не давайте ссылку на favicon.ico

Почти все браузеры берут /favicon.ico автоматически и асинхронно.

Плохо:

<link href="/favicon.ico" rel="icon" type="image/vnd.microsoft.icon">

Хорошо:

<!-- Разместите `favicon.ico` в корневой директории. -->

Добавляйте атрибут title к дополнительным таблицам стилей

Удобочитаемая метка поможет людям выбрать подходящую таблицу стилей.

Плохо:

<link href="/css/screen.css" rel="stylesheet">
<link href="/css/high-contrast.css" rel="alternate stylesheet">

Хорошо:

<link href="/css/screen.css" rel="stylesheet">
<link href="/css/high-contrast.css" rel="alternate stylesheet" title="High contrast">

Используйте элемент link для URL

Значение атрибута href может быть распознано как ссылка.

Плохо:

<section itemscope itemtype="http://schema.org/BlogPosting">
  <meta content="https://example.com/blog/hello" itemprop="url">
  ...
</section>

Хорошо:

<section itemscope itemtype="http://schema.org/BlogPosting">
  <link href="/blog/hello" itemprop="url">
  ...
</section>

Указывайте кодировку символов

Не во всех браузерах по умолчанию выставлено UTF–8.

Плохо:

<head>
  <title>HTML Best Practices</title>
</head>

Хорошо:

<head>
  <meta charset="UTF-8">
  <title>HTML Best Practices</title>
</head>

Не используйте устаревший способ указывания кодировки

HTTP-заголовки должны быть указаны сервером.

Плохо:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Хорошо:

<meta charset="UTF-8">

Указывайте кодировку символов в начале документа

Спецификация требует указывать кодировку в первых 1024 байтах.

Плохо:

<head>
  <meta content="width=device-width" name="viewport">
  <meta charset="UTF-8">
  ...
</head>

Хорошо:

<head>
  <meta charset="UTF-8">
  <meta content="width=device-width" name="viewport">
  ...
</head>

Используйте UTF–8

С UTF–8 можно добавлять эмодзи.

Плохо:

<meta charset="Shift_JIS">

Хорошо:

<meta charset="UTF-8">

Пропускайте атрибут type для CSS

В HTML5 для script значением по умолчанию атрибута type является text/css.

Плохо:

<style type="text/css">
  ...
</style>

Хорошо:

<style>
  ...
</style>

Не комментируйте содержимое элемента style

Эти танцы с бубном нужны были для старых браузеров.

Плохо:

<style>
<!--
  ...
  -->
</style>

Хорошо:

<style>
  ...
</style>

Не смешивайте теги для CSS и JavaScript

Иногда script блокирует формирование DOM.

Плохо:

<script src="/js/jquery.min.js"></script>
<link href="/css/screen.css" rel="stylesheet">
<script src="/js/main.js"></script>

Хорошо:

<link href="/css/screen.css" rel="stylesheet">
<script src="/js/jquery.min.js"></script>
<script src="/js/main.js"></script>

Тоже можно:

<script src="/js/jquery.min.js"></script>
<script src="/js/main.js"></script>
<link href="/css/screen.css" rel="stylesheet">

Секции

Добавляйте элемент body

Иначе поведение браузера может быть непредсказуемым.

Плохо:

<html>
  <head>
    ...
  </head>
  ...
</html>

Хорошо:

<html>
  <head>
    ...
  </head>
  <body>
    ...
  </body>
</html>

Забудьте об элементе hgroup

Спецификация W3C удаляет этот элемент.

Плохо:

<hgroup>
  <h1>HTML Best Practices</h1>
  <h2>For writing maintainable and scalable HTML documents.</h2>
</hgroup>

Хорошо:

<h1>HTML Best Practices</h1>
<p>For writing maintainable and scalable HTML documents.</p>

Используйте элемент address только для контактной информации

address предназначен для email-адресов, аккаунтов в социальных сетях, телефонных номеров или всего, что служит средством связи.

Плохо:

<address>No rights reserved.</address>

Хорошо:

<address>Contact: <a href="https://twitter.com/hail2u_">Kyo Nagashima</a></address>

Группирование контента

Не начинайте элемент pre с новой строки

Первый переход на новую строку игнорируется браузерами. Второй и последующие уже будут рендериться.

Плохо:

<pre>
&lt;!DOCTYPE html&gt;
</pre>

Хорошо:

<pre>&lt;!DOCTYPE html&gt;
</pre>

Используйте подходящие элементы внутри blockquote

Элемент blockquote должен содержать цитату, а не набор букв.

Плохо:

<blockquote>For writing maintainable and scalable HTML documents.</blockquote>

Хорошо:

<blockquote>
  <p>For writing maintainable and scalable HTML documents.</p>
</blockquote>

Не добавляйте подпись внутрь элемента blockquote

blockquote должен содержать только цитату.

Плохо:

<blockquote>
  <p>For writing maintainable and scalable HTML documents.</p>

  <p>— HTML Best Practices</p>
</blockquote>

Хорошо:

<blockquote>
  <p>For writing maintainable and scalable HTML documents.</p>
</blockquote>

<p>— HTML Best Practices</p>

Тоже можно (рекомендовано WHATWG):

<figure>
  <blockquote>
    <p>For writing maintainable and scalable HTML documents.</p>
  </blockquote>

  <figcaption>— HTML Best Practices</figcaption>
</figure>

И так тоже можно (рекомендовано W3C):

<blockquote>
  <p>For writing maintainable and scalable HTML documents.</p>

  <footer>— HTML Best Practices</footer>
</blockquote>

Один пункт списка на строку

Длииииииииииииииииииииинные строки сложно читаааааааааааааааааааать.

Плохо:

<ul>
  <li>General</li><li>The root Element</li><li>Sections</li>...
</ul>

Хорошо:

<ul>
  <li>General</li>
  <li>The root Element</li>
  <li>Sections</li>
  ...
</ul>

Используйте атрибут type для элемента ol

Иногда маркер списка определяется ближайшим содержимым. Если вы установите маркер атрибутом type, вас это не коснётся.

Плохо:

<head>
  <style>
    .toc {
      list-style-type: upper-roman;
    }
  </style>
</head>
<body>
  <ol class="toc">
    <li>General</li>
    <li>The root Element</li>
    <li>Sections</li>
    ...
  </ol>
</body>

Хорошо:

<body>
  <ol type="I">
    <li>General</li>
    <li>The root Element</li>
    <li>Sections</li>
    ...
  </ol>
</body>

Не используйте dl для диалога

Использование элемента dl ограничивается ассоциативным списком в HTML5.

Плохо:

<dl>
  <dt>Costello</dt>
  <dd>Look, you gotta first baseman?</dd>
  <dt>Abbott</dt>
  <dd>Certainly.</dd>
  <dt>Costello</dt>
  <dd>Who’s playing first?</dd>
  <dt>Abbott</dt>
  <dd>That’s right.</dd>
  <dt>Costello becomes exasperated.</dd>
  <dt>Costello</dt>
  <dd>When you pay off the first baseman every month, who gets the money?</dd>
  <dt>Abbott</dt>
  <dd>Every dollar of it.</dd>
</dl>

Хорошо:

<p>Costello: Look, you gotta first baseman?</p>
<p>Abbott: Certainly.</p>
<p>Costello: Who’s playing first?</p>
<p>Abbott: That’s right.</p>
<p>Costello becomes exasperated.</p>
<p>Costello: When you pay off the first baseman every month, who gets the money?</p>
<p>Abbott: Every dollar of it.</p>

Располагайте figcaption первым или последним дочерним элементом в figure

Спецификация (версии WHATWG) запрещает размещать figcation в середине элемента figure.

Плохо:

<figure>
  <img alt="Front cover of the “HTML Best Practices” book" src="/img/front-cover.png">
  <figcaption>“HTML Best Practices” Cover Art</figcaption>
  <img alt="Back cover of the “HTML Best Practices” book" src="/img/back-cover.png">
</figure>

Хорошо:

<figure>
  <img alt="Front cover of the “HTML Best Practices” book" src="/img/front-cover.png">
  <img alt="Back cover of the “HTML Best Practices” book" src="/img/back-cover.png">
  <figcaption>“HTML Best Practices” Cover Art</figcaption>
</figure>

Используйте элемент main

main можно использовать как «обёртку» контента.

Плохо:

<div id="content">
  ...
</div>

Хорошо:

<main>
  ...
</main>

Применяйте div в последнюю очередь

Старайтесь использовать более подходящие теги.

Плохо:

<div class="chapter">
  ...
</div>

Хорошо:

<section>
  ...
</section>

Текстовая семантика

Не разделяйте одну ссылку на несколько, если её можно сгруппировать

Элемент a может содержать внутри почти все элементы (за исключением интерактивных (например, формы) или самого элемента a).

Плохо:

<h1><a href="https://whatwg.org/">WHATWG</a></h1>

<p><a href="https://whatwg.org/">A community maintaining and evolving HTML since 2004.</a></p>

Хорошо:

<a href="https://whatwg.org/">
  <h1>WHATWG</h1>

  <p>A community maintaining and evolving HTML since 2004.</p>
</a>

Используйте атрибут download для загрузки файла

Это заставит браузер сразу скачивать файл, а не открывать.

Плохо:

<a href="/downloads/offline.zip">offline version</a>

Хорошо:

<a download href="/downloads/offline.zip">offline version</a>

Используйте атрибуты rel, hreflang и type при необходимости

Это подскажет браузерам, как обращаться с подключёнными ресурсами.

Плохо:

<a href="/ja/pdf">Japanese PDF version</a>

Хорошо:

<a href="/ja/pdf" hreflang="ja" rel="alternate" type="application/pdf">Japanese PDF version</a>

Используйте понятный текст ссылки

Текст ссылки должен быть меткой ресурса.

Плохо:

<p><a href="/pdf" rel="alternate" type="application/pdf">Click here</a> to view PDF version.</p>

Хорошо:

<p><a href="/pdf" rel="alternate" type="application/pdf">PDF version</a> is also available.</p>

Не используйте элемент em для предупреждений и предостережений

Важную информацию желательно выделять тегом strong.

Плохо:

<em>Caution!</em>

Хорошо:

<strong>Caution!</strong>

Пользуйтесь элементами s, i, b и u как можно реже

Семантика этих элементов не слишком понятна для людей.

Плохо:

<i class="icon-search"></i>

Хорошо:

<span class="icon-search" aria-hidden="true"></span>

Не вставляйте кавычки в элемент q

Кавычки добавит браузер.

Плохо:

<q>“For writing maintainable and scalable HTML documents”</q>

Хорошо:

<q>For writing maintainable and scalable HTML documents</q>

Тоже можно:

“For writing maintainable and scalable HTML documents”

Добавляйте атрибут title в элемент abbr

Другого способа раскрыть его нет.

Плохо:

<abbr>HBP</abbr>

Хорошо:

<abbr title="HTML Best Practices">HBP</abbr>

Добавляйте пробелы к элементу ruby

ruby поддерживается пока не всеми браузерами.

Плохо:

<ruby>HTML<rt>えいちてぃーえむえる</ruby>

Хорошо:

<ruby>HTML<rp> (</rp><rt>えいちてぃーえむえる</rt><rp>) </rp></ruby>

Добавляйте атрибут datetime к элементу time, который не является машиночитаемым

Значение datetime доступно для скриптов.

Плохо:

<time>Dec 19, 2014</time>

Хорошо:

<time datetime="2014-12-19">Dec 19, 2014</time>

Указывайте код языка атрибутом class с префиксом language-

Это не совсем формально, но в спецификации упоминается такой способ.

Плохо:

<code>&lt;!DOCTYPE html&gt;</code>

Хорошо:

<code class="language-html">&lt;!DOCTYPE html&gt;</code>

Держите элемент kbd как можно проще

Вложенные элементы сложно воспринимать людям.

Плохо:

<kbd><kbd>Ctrl</kbd>+<kbd>F5</kbd></kbd>

Хорошо:

<kbd>Ctrl+F5</kbd>

Применяйте span в последнюю очередь

Старайтесь использовать более подходящие теги.

Плохо:

HTML <span class="best">Best</span> Practices

Хорошо:

HTML <em>Best</em> Practices

Переходите на новую строку после элемента br

Плохо:

<p>HTML<br>Best<br>Practices</p>

Хорошо:

<p>HTML<br>
Best<br>
Practices</p>

Используйте br только там, где это уместно

Элемент br не столько для разрыва строки, сколько для разрыва строки внутри контента.

Плохо:

<p><label>Rule name: <input name="rule-name" type="text"></label><br>
<label>Rule description:<br>
<textarea name="rule-description"></textarea></label></p>

Хорошо:

<p><label>Rule name: <input name="rule-name" type="text"></label></p>
<p><label>Rule description:<br>
<textarea name="rule-description"></textarea></label></p>

Правки

ins и del не должны пересекаться с другими элементами.

Плохо:

<p>For writing maintainable and scalable HTML documents.<del> And for mental stability.</p>

<p>Don’t trust!</p></del>

Хорошо:

<p>For writing maintainable and scalable HTML documents.<del> And for mental stability.</del></p>

<del><p>Don’t trust!</p></del>

Встроенный контент

Добавляйте на всякий случай img для элемента picture

Поддержка элемента picture ещё недостаточно хороша.

Плохо:

<picture>
  <source srcset="/img/logo.webp" type="image/webp">
  <source srcset="/img/logo.hdp" type="image/vnd.ms-photo">
  <source srcset="/img/logo.jp2" type="image/jp2">
  <source srcset="/img/logo.jpg" type="image/jpg">
</picture>

Хорошо:

<picture>
  <source srcset="/img/logo.webp" type="image/webp">
  <source srcset="/img/logo.hdp" type="image/vnd.ms-photo">
  <source srcset="/img/logo.jp2" type="image/jp2">
  <img src="/img/logo.jpg">
</picture>

Добавляйте атрибут alt к элементу img, когда это необходимо

alt помогает людям с ограниченными возможностями и тем, у кого отключена загрузка изображений.

Плохо:

<img src="/img/logo.png">

Хорошо:

<img alt="HTML Best Practices" src="/img/logo.png">

Оставляйте атрибут alt пустым, если это возможно

Если изображение играет дополняющую роль, рядом с ним должен быть равноценный текст.

Плохо:

<img alt="Question mark icon" src="/img/icon/help.png"> Help

Хорошо:

<img alt="" src="/img/icon/help.png"> Help

Пропускайте атрибут alt, где это уместно

Иногда вы не можете знать, какой текст подойдёт для атрибута alt.

Плохо:

<img alt="CAPTCHA" src="captcha.cgi?id=82174">

Хорошо:

<img src="captcha.cgi?id=82174" title="CAPTCHA">
(Если вы не видите изображение, вы можете использовать <a href="?audio">audio</a> вместо него)

Оставляйте элемент iframe пустым

Есть ряд ограничений по его содержимому. Пустой iframe всегда безопасен.

Плохо:

<iframe src="/ads/default.html">
  <p>If your browser support inline frame, ads are displayed here.</p>
</iframe>

Хорошо:

<iframe src="/ads/default.html"></iframe>

Добавляйте разметку в содержимое элемента map

Это нужно для экранных дикторов.

Плохо:

<map name="toc">
  <a href="#general">General</a>
  <area alt="General" coords="0, 0, 40, 40" href="#General"> |
  <a href="#the_root_element">The root element</a>
  <area alt="The root element" coords="50, 0, 90, 40" href="#the_root_element"> |
  <a href="#sections">Sections</a>
  <area alt="Sections" coords="100, 0, 140, 40" href="#sections">
</map>

Хорошо:

<map name="toc">
  <p>
    <a href="#general">General</a>
    <area alt="General" coords="0, 0, 40, 40" href="#General"> |
    <a href="#the_root_element">The root element</a>
    <area alt="The root element" coords="50, 0, 90, 40" href="#the_root_element"> |
    <a href="#sections">Sections</a>
    <area alt="Sections" coords="100, 0, 140, 40" href="#sections">
  </p>
</map>

Добавляйте резервный контент для элементов audio и video

Резервный контент нужен для новых элементов в HTML5.

Плохо:

<video>
  <source src="/mov/theme.mp4" type="video/mp4">
  <source src="/mov/theme.ogv" type="video/ogg">
  ...
</video>

Хорошо:

<video>
  <source src="/mov/theme.mp4" type="video/mp4">
  <source src="/mov/theme.ogv" type="video/ogg">
  ...
  <iframe src="//www.youtube.com/embed/..." allowfullscreen></iframe>
</video>

Табличные данные

Одна ячейка на строку

Длинные строки сложно просматривать.

Плохо:

<tr>
  <td>General</td><td>The root Element</td><td>Sections</td>
</tr>

Хорошо:

<tr>
  <td>General</td>
  <td>The root Element</td>
  <td>Sections</td>
</tr>

Используйте элемент th для ячеек-заголовков

Плохо:

<table>
  <thead>
    <tr>
      <td><strong>Element</strong></td>
      <td><strong>Empty</strong></td>
      <td><strong>Tag omission</strong></td>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong><code>pre</code></strong></td>
      <td>No</td>
      <td>Neither tag is omissible</td>
    </tr>
    <tr>
      <td><strong><code>img</code></strong></td>
      <td>Yes</td>
      <td>No end tag</td>
    </tr>
  </tbody>
</table>

Хорошо:

<table>
  <thead>
    <tr>
      <th>Element</th>
      <th>Empty</th>
      <th>Tag omission</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th><code>pre</code></th>
      <td>No</td>
      <td>Neither tag is omissible</td>
    </tr>
    <tr>
      <th><code>img</code></th>
      <td>Yes</td>
      <td>No end tag</td>
    </tr>
  </tbody>
</table>

Формы

Подписи к формам оборачивайте элементом label

label помогает выделять элементы формы.

Плохо:

<p>Query: <input name="q" type="text"></p>

Хорошо:

<p><label>Query: <input name="q" type="text"></label></p>

Пропускайте атрибут for там, где это возможно

Элемент label может быть «обёрткой» некоторых элементов формы.

Плохо:

<label for="q">Query: </label><input id="q" name="q" type="text">

Хорошо:

<label>Query: <input name="q" type="text"></label>

Используйте подходящие атрибуты type для input

У браузеров есть небольшие фичи для разных типов input.

Плохо:

<label>Search keyword: <input name="q" type="text"></label>

Хорошо:

<label>Search keyword: <input name="q" type="search"></label>

Добавляйте атрибут value для input type="submit"

Метка по умолчанию не стандартизирована среди браузеров и языков.

Плохо:

<input type="submit">

Хорошо:

<input type="submit" value="Search">

Добавляйте атрибут title к элементу input, когда есть атрибут pattern

Если текст input не совпадает с атрибутом pattern, значение атрибута title будет отображаться как подсказка.

Плохо:

<input name="security-code" pattern="[0-9]{3}" type="text">

Хорошо:

<input name="security-code" pattern="[0-9]{3}" title="A security code is a number in three figures." type="text">

Не используйте атрибут placholder для меток

Для меток служит элемент label, а placeholder служит для небольших подсказок.

Плохо:

<input name="email" placeholder="Email" type="text">

Хорошо:

<label>Email: <input name="email" placeholder="john.doe@example.com" type="text"></label>

Один option на строку

Длинные строки сложно просматривать.

Плохо:

<datalist id="toc">
  <option label="General"><option label="The root element"><option label="Sections">
</datalist>

Хорошо:

<datalist id="toc">
  <option label="General">
  <option label="The root element">
  <option label="Sections">
</datalist>

Добавляйте атрибут max для элемента progress

Так проще заполнить атрибут value.

Плохо:

<progress value="0.5"> 50%</progress>

Хорошо:

<progress max="100" value="50"> 50%</progress>

Добавляйте атрибуты min и max для элемента meter

Так проще заполнить атрибут value.

Плохо:

<meter value="0.5"> 512GB used (1024GB total)</meter>

Хорошо:

<meter min="0" max="1024" value="512"> 512GB used (1024GB total)</meter>

Размещайте legend как первый дочерний элемент fieldset

Так в спецификациях.

Плохо:

<fieldset>
  <p><label>Is this section is useful?: <input name="usefulness-general" type="checkbox"></label></p>
  ...
  <legend>About "General"</legend>
</fieldset>

Хорошо:

<fieldset>
  <legend>About "General"</legend>
  <p><label>Is this section is useful?: <input name="usefulness-general" type="checkbox"></label></p>
  ...
</fieldset>

Скрипты

Пропускайте атрибут type для элемента script

В HTML5 значением по умолчания и так является text/javascript.

Плохо:

<script type="text/javascript">
  ...
</script>

Хорошо:

<script>
  ...
</script>

Не оборачивайте в комментарии содержимое элемента script

Эти танцы с бубном нужны были для старых браузеров.

Плохо:

<script>
/*<![CDATA[*/
  ...
/*]]>*/
</script>

Тоже плохо:

<script>
<!--
  ...
// -->
</script>

Хорошо:

<script>
  ...
</script>

Не вставляйте файл скрипта изнутри элемента script

Атрибут async — самый простой и производительный способ асинхронной загрузки.

Плохо:

<script>
  var script = document.createElement("script");
  script.async = true;
  script.src = "//example.com/widget.js";
  document.getElementsByTagName("head")[0].appendChild(script);
</script>

Хорошо:

<script async defer src="//example.com/widget.js"></script>

Другое

Соблюдайте отступы

Отступы важны для читабельности

Плохо:

<html>
    <head>
      ...
    </head>
  <body>
    ...
  </body>
</html>

Хорошо:

<html>
  <head>
    ...
  </head>
  <body>
    ...
  </body>
</html>

Используйте абсолютные пути для внутренних ссылок

Абсолютные пути работают лучше на localhost без интернет-подключения.

Плохо:

<link rel="apple-touch-icon" href="http://you.example.com/apple-touch-icon-precomposed.png">
...
<p>You can find more at <a href="//you.example.com/contact.html">contact page</a>.</p>

Хорошо:

<link rel="apple-touch-icon" href="/apple-touch-icon-precomposed.png">
...
<p>You can find more at <a href="/contact.html">contact page</a>.</p>

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *