Ошибки в коде — это несоответствия правилам и синтаксису языка HTML, использование некорректных или недопустимых тегов, атрибутов или значений. Ошибки приводят к неправильному отображению элементов, снижению производительности и доступности сайта.
Что нужно, чтобы писать код правильно и не допускать ошибок? Знать самые распространённые ошибки и не совершать их.
Вложенный тег закрывается позже родительского
<section>
<p>Пример текста на сайте.</section>
</p>
В этом примере элемент <p>
закрывается после <section>
, хотя является вложенным. Это может привести к проблемам в отображении элементов. Такая ошибка повторяется из-за невнимательности и некорректной структуры HTML-документа. Если вы будете следить за вложенностью, то не ошибётесь, где должен закрываться вложенный тег, а где — его родитель.
Правильный способ вложения этих элементов:
<section>
<p>Пример текста на сайте.</p>
</section>
Пример корректного написания кода, где видна вложенность и шансов совершить ошибку меньше:
<ul class="user-menu">
<li>
<a href="#">Закладки</a>
</li>
<li>
<a href="#">Корзина</a>
</li>
<li>
<a href="#">Оформить заказ</a>
</li>
</ul>
Нет закрывающего тега
<section class="advantages">
<h2>Что выделяет нас среди конкурентов?</h2>
<ul class="advantages-list">
<li>Используем только природные материалы</li>
<li>Ежедневные отчёты о ходе работ</li>
<li>Сами соберём мебель для вас</li>
<li>Бесплатное гарантийное обслуживание в течение 10 лет</li>
</section>
В примере у списка отсутствует закрывающий тег — </ul>
. В этом случае список и все его элементы отразятся некорректно. Будьте внимательны, такие мелкие ошибки могут принести много неприятностей.
Правильный вариант:
<section class="advantages">
<h2>Что выделяет нас среди конкурентов?</h2>
<ul class="advantages-list">
<li>Используем только природные материалы</li>
<li>Ежедневные отчёты о ходе работ</li>
<li>Сами соберём мебель для вас</li>
<li>Бесплатное гарантийное обслуживание в течение 10 лет</li>
</ul>
</section>
Повторяются идентификаторы
<form action="https://echo.htmlacademy.ru" method="post">
<table>
<tr>
<td>
<label for="login-field">Ваш логин</label>
</td>
<td>
<input type="text" id="login-field" name="login">
</td>
</tr>
...
<form action="https://echo.htmlacademy.ru" method="post">
<table>
<tr>
<td>
<label for="login-field">Ваш пароль</label>
</td>
<td>
<input type="text" id="login-field" name="password">
</td>
</tr>
Тег id
— это идентификатор, который связывает определённое поле ввода input
с текстом подписи. В каждой форме должен быть свой уникальный id
, чтобы формой можно было пользоваться и отправлять данные на сервер.
У пароля из примера выше должен быть свой уникальный id
:
<form action="https://echo.htmlacademy.ru" method="post">
<table>
<tr>
<td>
<label for="password-field">Ваш пароль</label>
</td>
<td>
<input type="text" id="password-field" name="password">
</td>
</tr>
Неправильное использование семантических тегов
<section class="products">
<h2>Курс для фронтендеров</h2>
…
<div>Купить курс</div>
</section>
Здесь <div>
ошибочно используется вместо кнопки <button>
.
Тег <div>
— это универсальный контейнер без собственного значения. Он используется, когда нужно разметить некрупный элемент вёрстки или отдельный фрагмент с текстом. Его использование не создаст кнопку, которая может открыть другую страницу или форму для записи.
Кнопка <button>
отвечает за выполнение определённой функции: добавить в корзину, купить, отправить, проголосовать и другие.
<section class="products">
<h2>Курс для фронтендеров</h2>
…
<button class="button">
Купить курс
</button>
</section>
👉🏼 Правило для определения <div>
:
Если перед вами раздел, которому сложно найти определение, получается что-то наподобие «новости и фотогалерея» или «правая колонка» — можно разметить как <div>
.
Семантические теги <header>
, <main>
, <footer>
предназначены для выделения основных структурных блоков на странице сайта, а теги <nav>
, <section>
, <article>
, <aside>
— для разметки крупных смысловых разделов. Все теги должны быть использованы в соответствии со своим назначением.
Отсутствие атрибута alt для изображений img
<img src="image/logo.png" width="200" height="100">
Атрибут alt
задаёт альтернативный текст, описывающий картинку для пользователей, у которых изображение очень долго загружается или вообще недоступно. Также alt
помогает сайтам оставаться доступными, например, для категории пользователей, которая не имеет возможности видеть картинки.
<img src="image/logo.png" alt="Логотип" width="200" height="100">
6 простых правил хорошего alt-текста
Определение уровня заголовка по размеру текста на макете
<main>
<h1>Мы — молодая креативная компания</h1>
<section class="products">
<h2>Обувь и аксессуары</h2>
…
</section>
<section class="about">
<h2>Мы надёжные партнёры и поставщики</h2>
…
</section>
<section class="companies">
<h2>Уже много лет мы сотрудничаем с самыми крупными производителями</h2>
…
</section>
</main>
Не весь крупный текст — заголовки. Основная роль заголовка — резюмирующая, он сжато передаёт содержание последующего текста. Прочитав заголовок, пользователь должен легко понять, чему посвящён раздел. Также не все заголовки видимые на странице сайта, они могут быть прописаны в разметке и скрыты, так как их задача — помогать структурировать страницу.
<main>
<h1>Интернет магазин «Фактура»</h1>
<section class="products">
<h2>Товары</h2>
…
</section>
<section class="about">
<h2>О нас</h2>
…
</section>
<section class="companies">
<h2>Производители</h2>
…
</section>
</main>
Также неверно обозначать заголовок не специальными тегами h1-h6
, а использовать выделение текста тегами <b>
или <strong>
.
Включать в main то, что повторяется на других страницах
Это может быть навигация, копирайты и так далее.
<body>
<h1>Интернет магазин «Фактура»</h1>
<main>
<nav class="user-nav">
<ul class="user-menu">
<li>
<a href="https://htmlacademy.ru/blog">Меню</a>
</li>
<li>
<a href="https://htmlacademy.ru/blog">Корзина</a>
</li>
<li>
<a href="https://htmlacademy.ru/blog">Оформить заказ</a>
</li>
</ul>
</nav>
<section class="about">
<h2>О нас</h2>
…
</section>
</main>
<footer class="main-footer">
<!-- Подвал сайта -->
</footer>
</body>
Тег <main>
выделяет основное содержание страницы, которое не повторяется на других страницах. И на странице используется один тег <main>
. Если навигация одинаковая на всех страницах сайта, то лучше размещать её в <header>
.
Неверное обозначение комментариев
Если комментарий неправильно разметить, то он будет виден на странице.
<-- Это комментарий -->
Комментарии начинаются последовательностью <!--
, например:
<!-- Это комментарий -->
Не использовать <li>
для элементов списка
<ul class="user-menu">
<div>
<a href="https://htmlacademy.ru">Закладки</a>
</div>
<div>
<a href="https://htmlacademy.ru">Корзина</a>
</div>
<div>
<a href="https://htmlacademy.ru">Оформить заказ</a>
</div>
</ul>
Непосредственно в теге <ul>
могут находиться только теги <li>
, которые обозначают элементы или пункты списка. Пунктов может быть неограниченное количество, но не менее одного.
<ul class="user-menu">
<li>
<a href="https://htmlacademy.ru">Закладки</a>
</li>
<li>
<a href="https://htmlacademy.ru">Корзина</a>
</li>
<li>
<a href="https://htmlacademy.ru">Оформить заказ</a>
</li>
</ul>