Атрибут id в HTML - как правильно использовать и не ломать верстку

08 декабря 2025
Автор

Олег Марков

Введение

Атрибут id в HTML кажется простым — указали строку, и элемент получил уникальный идентификатор. Но на практике вокруг него возникает много вопросов. От правильного использования id зависит работа стилей, скриптов, навигации по странице и даже доступность для пользователей с экранными читателями.

Смотрите, я покажу вам, как на самом деле работает id, какие у него строгие правила, где он необходим, а где лучше обойтись без него. Мы разберем типичные сценарии использования, частые ошибки и их последствия, а также свяжем id с CSS, JavaScript и якорными ссылками.


Что такое атрибут id в HTML

Краткое определение

Атрибут id — это способ дать HTML‑элементу уникальное имя внутри одной страницы (одного HTML‑документа). Это имя:

  • должно встречаться в документе только один раз;
  • чувствительно к регистру в JavaScript (в отличие от HTML‑тегов);
  • используется для:
    • однозначного выбора элемента в DOM;
    • связывания элемента с CSS‑стилями;
    • навигации по якорям в URL;
    • связи с формами и элементами доступности.

Простейший пример:

<h1 id="page-title">Атрибут id в HTML</h1>
<!-- Здесь мы задаем заголовку уникальный идентификатор page-title -->

Для чего вообще нужен id

Давайте разложим по задачам, чтобы вам было проще запомнить:

  1. Поиск элемента в JavaScript
    Вы можете быстро найти элемент по id, не перебирая весь DOM.

  2. Применение стиля к одному конкретному элементу
    В CSS селектор #id указывает стиль для одного элемента.

  3. Якорные ссылки и прокрутка к нужному месту страницы
    Можно перейти сразу к нужному блоку с помощью ссылки с решеткой в URL.

  4. Связь полей форм и подписей
    Например, label ссылается на input через for="id".

  5. Доступность и вспомогательные технологии
    Например, aria-labelledby и aria-describedby используют id для указания, какие элементы дают описание.


Синтаксис и правила использования id

Базовый синтаксис

Синтаксис очень простой:

<тег id="значение">...</тег>

Пример:

<p id="intro-text">Это вводный абзац.</p>
<!-- Здесь мы задаем абзацу уникальный идентификатор intro-text -->

Требование уникальности

Ключевое правило: каждое значение id в пределах одного HTML‑документа должно быть уникальным.

Нарушение правила:

<div id="item">Первый</div>
<div id="item">Второй</div> <!-- Ошибка - тот же id item используется второй раз -->

Чем это плохо:

  • в CSS селектор #item будет относиться сразу к обоим элементам;
  • в JavaScript document.getElementById('item') вернет только первый элемент;
  • навигация по якорю #item может вести к неожиданному элементу;
  • валидатор HTML покажет ошибку.

Как избежать:

  • продумывайте схему именования: header-logo, main-menu, footer-contacts;
  • не используйте id для повторяющихся элементов (кнопки в списке, карточки и т.д.) — для этого есть class.

Ограничения на значение id

В HTML5 допустимы почти любые строки, но есть ряд практических рекомендаций, которых лучше придерживаться.

Рекомендуемый стиль (безопасный и читаемый):

  • начинать с буквы;
  • использовать латиницу, цифры, дефисы и подчеркивания;
  • избегать пробелов.

Примеры хороших id:

<div id="main-header"></div>  <!-- латиница и дефис -->
<div id="user_profile"></div> <!-- латиница и подчеркивание -->
<div id="section1"></div>     <!-- цифра внутри, но не в начале -->

Пример проблемного id:

<div id="главный блок"></div>
<!-- Здесь в id есть пробел и кириллица - будут неудобства в CSS и JavaScript -->

Технически браузеры такое съедят, но:

  • селекторы в CSS станут неудобными;
  • селекторы в JavaScript через querySelector потребуют экранирования;
  • другие разработчики будут путаться.

Регистр символов

Хотя HTML‑имена тегов нечувствительны к регистру, значение idчувствительно для JavaScript и CSS‑селекторов.

<div id="Item"></div>
<div id="item"></div>
<!-- Формально два разных id - Item и item -->

Но так делать не стоит: можно легко запутаться и ошибиться при обращении.

Лучший подход — использовать единый стиль, например kebab-case:

<div id="main-block"></div>
<div id="side-panel"></div>
<!-- Все в нижнем регистре и с дефисами между словами -->

id и CSS: как использовать правильно

Селектор по id

В CSS селектор по id обозначается через #:

<h1 id="main-title">Заголовок страницы</h1>
/* Здесь мы применяем стиль только к элементу с id main-title */
#main-title {
  font-size: 32px;   /* Увеличиваем размер шрифта */
  color: #333333;    /* Задаем цвет текста */
}

Как видите, этот стиль не повлияет ни на один другой h1 на странице.

Специфичность селекторов

id имеет очень высокую специфичность:

  • селектор по тегу: div — самая низкая;
  • селектор по классу: .block — выше;
  • селектор по id: #block — еще выше;
  • инлайн‑стиль через style="" — выше всего.

Пример:

<p id="note" class="text">Текст заметки</p>
.text {
  color: blue;       /* Стиль по классу */
}

#note {
  color: red;        /* Стиль по id */
}

В результате текст будет красным, потому что:

  • селектор #note более специфичен, чем .text.

Из‑за этого часто советуют:

  • не злоупотреблять id в CSS;
  • стили по возможности строить на классах;
  • id использовать больше для JavaScript и якорей.

Когда id в CSS оправдан

Использовать селектор по id в CSS имеет смысл, если:

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

Примеры:

<header id="page-header">...</header>
<main id="main-content">...</main>
<footer id="page-footer">...</footer>
#page-header {
  background-color: #f6f6f6;    /* Фон шапки */
}

#main-content {
  max-width: 1200px;           /* Ограничение ширины контента */
  margin: 0 auto;              /* Центровка по горизонтали */
}

#page-footer {
  font-size: 14px;             /* Размер шрифта для подвала */
}

Но если у вас повторяющиеся блоки, например карточки товара, используйте class, а не id.


id и JavaScript

Поиск элемента по id

Классический способ получить элемент по id:

<button id="send-btn">Отправить</button>
<p id="status-text">Статус пока пустой</p>
// Здесь мы получаем элемент кнопки по ее id
const sendButton = document.getElementById('send-btn');

// Здесь мы получаем абзац для вывода статуса
const statusText = document.getElementById('status-text');

// Добавляем обработчик события клика по кнопке
sendButton.addEventListener('click', function () {
  // Меняем текст в статусе при клике
  statusText.textContent = 'Форма отправлена';
});

Особенность getElementById:

  • всегда возвращает первый элемент с таким id (по стандарту id должен быть уникальным, но если вы нарушите правило — получите не то, что ожидаете);
  • если элемента с таким id нет — вернет null.

Поэтому перед работой с элементом можно проверять:

// Здесь мы проверяем, что элемент существует на странице
const box = document.getElementById('box');

if (box) {
  // Здесь мы меняем содержимое только если элемент найден
  box.textContent = 'Элемент найден и обновлен';
}

Использование querySelector с id

Вы можете использовать более универсальный метод querySelector, который принимает CSS‑селектор:

<div id="info-panel">Информация...</div>
// Здесь мы ищем элемент через CSS-селектор по id
const panel = document.querySelector('#info-panel');

// Проверяем, что элемент найден
if (panel) {
  // Меняем стиль через JavaScript
  panel.style.backgroundColor = '#efefef';
}

Разница между getElementById и querySelector:

  • getElementById('id') — проще, быстрее и точнее, если вам нужен именно id;
  • querySelector('#id') — единый интерфейс для любых селекторов, можно комбинировать.

id как удобная точка входа

На практике id часто используют как якорь, от которого вы «цепляетесь» скриптами к DOM.

Например, вы можете вешать обработчики только на основной контейнер:

<div id="todo-app">
  <button id="add-task">Добавить задачу</button>
  <ul id="task-list"></ul>
</div>
// Здесь мы получаем корневой контейнер приложения
const app = document.getElementById('todo-app');

// Получаем кнопку добавления и список задач
const addTaskBtn = document.getElementById('add-task');
const taskList = document.getElementById('task-list');

addTaskBtn.addEventListener('click', function () {
  // Здесь мы создаем новый элемент списка
  const li = document.createElement('li');
  li.textContent = 'Новая задача';
  // Добавляем новый элемент в список
  taskList.appendChild(li);
});

Как работает переход по якорю

Если у элемента есть id, вы можете перейти к нему с помощью ссылки вида #id.

Пример:

<h2 id="details">Детальная информация</h2>
<p>...</p>

<a href="#details">Перейти к детальной информации</a>
<!-- Здесь ссылка при клике прокрутит страницу к заголовку с id details -->

Браузер:

  • находит элемент с соответствующим id;
  • прокручивает страницу так, чтобы этот элемент стал виден.

Ссылки на другую страницу с якорем

Тот же принцип работает и между страницами:

<!-- Страница index.html -->
<a href="about.html#team">О нашей команде</a>
<!-- Здесь мы указываем страницу и якорь через решетку -->

<!-- Страница about.html -->
<h2 id="team">Наша команда</h2>

При переходе браузер:

  • загружает about.html;
  • находит элемент с id="team";
  • скроллит к нему.

Якоря и фиксированное меню

Часто возникает ситуация: у вас есть фиксированное меню сверху, и при переходе по якорю заголовок оказывается скрытым под шапкой.

Смотрите, я покажу вам один из подходов, как это можно поправить через CSS:

<h2 id="contacts" class="anchor-title">Контакты</h2>
.anchor-title {
  scroll-margin-top: 80px; /* Здесь мы задаем отступ при прокрутке к якорю */
}

Комментарии:

  • scroll-margin-top добавляет отступ сверху при автоматической прокрутке к элементу;
  • число 80 — это примерная высота шапки.

Так вы сохраняете нормальные id, но корректируете поведение прокрутки.


id и формы: label, ошибки и доступность

Связь label и input через id

Полезный и часто применяемый сценарий — связать подпись к полю (label) через for с id поля.

<label for="email-input">Электронная почта</label>
<input id="email-input" type="email" name="email">

Что происходит:

  • значение for="email-input" в label ссылается на id="email-input" у input;
  • клик по тексту «Электронная почта» активирует поле ввода;
  • экранные читатели корректно связывают текст подписи с полем.

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

Поля ошибок и aria-describedby

Для вывода сообщений об ошибках и подсказок также удобно использовать id.

<label for="username">Имя пользователя</label>
<input id="username" name="username" aria-describedby="username-help">

<p id="username-help">Имя может содержать только латинские буквы и цифры.</p>

Комментарии:

  • атрибут aria-describedby принимает значение id элемента, который описывает поле;
  • вспомогательные технологии (например, экранные читалки) прочитают текст подсказки при фокусе на поле.

id и доступность (ARIA атрибуты)

aria-labelledby

Атрибут aria-labelledby позволяет указать элемент (через его id), который служит заголовком или основной подписью.

<h2 id="dialog-title">Подтверждение удаления</h2>
<div id="dialog" role="dialog" aria-labelledby="dialog-title">
  <p>Вы уверены, что хотите удалить этот файл</p>
</div>

Здесь:

  • id="dialog-title" задает уникальный идентификатор заголовка диалога;
  • aria-labelledby="dialog-title" указывает, что этот заголовок относится к диалогу;
  • скринридеры прочитают заголовок вместе с содержимым диалога.

aria-describedby

Работает похожим образом, но для описания:

<p id="password-hint">Минимум 8 символов одна цифра и одна буква.</p>

<input id="password" type="password" aria-describedby="password-hint">

Экранный читатель:

  • прочитает поле пароля;
  • затем добавит текст подсказки из элемента с id="password-hint".

Типичные ошибки при работе с id

Дублирование id

Самая частая ошибка:

<div id="product-card">Товар 1</div>
<div id="product-card">Товар 2</div> <!-- Дублирование id -->

Чем это грозит:

  • сложнее дебажить CSS;
  • JavaScript находит только первый элемент;
  • валидация HTML показывает ошибки;
  • сложнее масштабировать и поддерживать.

Решение — использовать классы для повторяющихся элементов:

<div class="product-card">Товар 1</div>
<div class="product-card">Товар 2</div>

Если вам нужно добавить событие или особое поведение — используйте data- атрибуты или делегирование событий, а не id.

Использование id там, где нужен class

Еще одна мягкая, но вредная ошибка — привычка везде ставить id, даже если элемент не уникален по смыслу.

Например, для всех кнопок:

<button id="btn">Купить</button>
<button id="btn">Купить</button> <!-- Опять дублирование -->

Правильнее:

<button class="buy-button">Купить</button>
<button class="buy-button">Купить</button>

А если вам нужно что‑то особенное только для одной конкретной кнопки, тогда да — уместен id.

Слишком «общие» или бессмысленные id

Плохие варианты:

<div id="block1"></div>
<div id="block2"></div>
<div id="asd"></div>

Через месяц будет непонятно, что за block1 и чем он отличается от block2.

Лучше:

<div id="hero-section"></div>
<div id="features"></div>
<div id="pricing"></div>

Здесь уже по имени можно понять смысл элемента.


Практические рекомендации по именованию id

Выберите единый стиль

Для проекта полезно договориться о стиле именования:

  • kebab-casemain-header, user-profile-page;
  • snake_casemain_header, user_profile_page (реже в HTML).

Чаще выбирают kebab-case, потому что он хорошо сочетается с CSS‑селекторами и общим стилем веба.

Делайте id говорящими

Хорошие примеры:

  • main-nav — основная навигация;
  • site-logo — логотип сайта;
  • login-form — форма логина;
  • contact-section — блок с контактами.

Плохие:

  • a1, b2 — совершенно не понятно по смыслу;
  • red-block — привязка к цвету, который может поменяться, но id останется.

Старайтесь описывать роль или смысл элемента, а не его внешний вид.

Избегайте технических деталей в id

Например:

<div id="col-3-left-float"></div>

Через время верстка изменится, и элемент уже не будет «col-3-left-float», но id останется. Поэтому лучше:

<div id="sidebar"></div>

Примеры типичных сценариев использования id

Навигация по странице для одностраничного лендинга

Давайте разберемся на примере классического лендинга с меню, которое ведет по секциям.

<nav>
  <ul>
    <li><a href="#about">О компании</a></li>
    <li><a href="#services">Услуги</a></li>
    <li><a href="#contacts">Контакты</a></li>
  </ul>
</nav>

<section id="about">
  <h2>О компании</h2>
  <p>...</p>
</section>

<section id="services">
  <h2>Услуги</h2>
  <p>...</p>
</section>

<section id="contacts">
  <h2>Контакты</h2>
  <p>...</p>
</section>

Обратите внимание:

  • id висят именно на секциях, к которым вы хотите прокручивать;
  • ссылки в меню используют href="#id-секции".

При клике браузер плавно (или резко, в зависимости от стилей и скриптов) прокрутит к нужному блоку.

Простой модальное окно на основе id и JavaScript

Теперь вы увидите, как id помогает связать кнопку и модальное окно.

<button id="open-modal">Открыть окно</button>

<div id="modal" class="hidden">
  <div class="modal-content">
    <button id="close-modal">Закрыть</button>
    <p>Содержимое модального окна</p>
  </div>
</div>
.hidden {
  display: none; /* Здесь мы скрываем элемент */
}

/* Простейшие стили модального окна */
#modal {
  position: fixed;       /* Фиксируем относительно окна браузера */
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.5); /* Полупрозрачный фон */
}
// Получаем элементы по их id
const openBtn = document.getElementById('open-modal');
const closeBtn = document.getElementById('close-modal');
const modal = document.getElementById('modal');

// Обработчик открытия модального окна
openBtn.addEventListener('click', function () {
  // Убираем класс hidden чтобы показать модальное окно
  modal.classList.remove('hidden');
});

// Обработчик закрытия модального окна
closeBtn.addEventListener('click', function () {
  // Добавляем класс hidden чтобы скрыть модальное окно
  modal.classList.add('hidden');
});

Здесь id дают нам удобные точки входа на три ключевых элемента: кнопка открытия, кнопка закрытия и само окно.


Когда лучше использовать class вместо id

Повторяющиеся элементы

Карточки товаров, элементы списка, одинаковые кнопки — все это про классы, а не про id.

Плохо:

<div id="card">Товар 1</div>
<div id="card">Товар 2</div>

Хорошо:

<div class="card">Товар 1</div>
<div class="card">Товар 2</div>

Если для конкретной карточки вам нужно отдельное поведение, вы можете добавить id только этой карточке:

<div class="card" id="featured-product">Особый товар</div>
<div class="card">Обычный товар</div>

Когда вы не уверены, что элемент останется единственным

Например, разработчик думает, что «эта кнопка тут одна навсегда», и задает ей id. Потом приходит новое требование дизайна, и таких кнопок становится три.

Лучше:

  • начинать с class;
  • добавлять id, только если элемент действительно логически уникален.

Как проверить, нет ли конфликтов id

Использование валидатора HTML

Вы можете использовать любой HTML‑валидатор (например, W3C Validator), чтобы проверить:

  • есть ли дублирующиеся id;
  • правильно ли они заданы.

Валидатор укажет строки, где id повторяется.

Быстрый поиск через DevTools

В инструментах разработчика (Chrome DevTools, Firefox DevTools и т.д.) можно:

  1. Открыть вкладку Elements (или Аналог).
  2. Использовать поиск по id:
    • нажать Ctrl+F / Cmd+F;
    • ввести id="имя" и посмотреть, сколько совпадений;
  3. Если совпадений больше одного — у вас конфликт.

Заключение

Атрибут id в HTML — это не просто способ «как‑то назвать элемент», а важный механизм, который связывает:

  • структуру страницы (HTML),
  • внешний вид (CSS),
  • логику (JavaScript),
  • и доступность (ARIA, screen readers).

Основные моменты, которые вам стоит запомнить:

  • значение id должно быть уникальным в пределах документа;
  • используйте id для:
    • якорей и навигации по странице;
    • точек входа для JavaScript;
    • связей labelinput и ARIA‑атрибутов;
  • для повторяющихся элементов и оформления в CSS лучше использовать class;
  • выбирайте понятные, описательные имена id и придерживайтесь единого стиля;
  • избегайте избыточного использования id в CSS, чтобы не усложнять специфичность.

Если вы будете относиться к id как к точкам связки между слоями приложения, а не как к «еще одному атрибуту», ваш HTML станет более предсказуемым, поддерживаемым и удобным для дальнейшего развития.


Частозадаваемые технические вопросы по теме статьи и ответы на них

Как программно изменить id элемента через JavaScript

Можно обратиться к свойству id у DOM‑элемента:

// Здесь мы получаем элемент с id old-id
const elem = document.getElementById('old-id');

// Проверяем что элемент найден
if (elem) {
  // Меняем его id на новый
  elem.id = 'new-id';
}

Важно убедиться, что new-id еще не используется в документе, иначе получите дублирование.


Можно ли динамически создавать элементы с уникальными id

Да, но заботу об уникальности нужно взять на себя. Простой подход — использовать счетчик:

// Здесь мы заводим счетчик для генерации id
let counter = 0;

function createItem() {
  // Формируем уникальный id на основе счетчика
  const id = 'item-' + counter++;
  const div = document.createElement('div');
  div.id = id;          // Присваиваем id
  div.textContent = 'Элемент ' + id;
  document.body.appendChild(div); // Добавляем элемент на страницу
}

Так вы гарантируете, что каждый новый элемент получит уникальный id.


Как удалить id у элемента если он больше не нужен

Можно просто обнулить атрибут:

// Здесь мы получаем элемент по id
const elem = document.getElementById('temp-block');

// Если элемент найден удаляем атрибут id
if (elem) {
  elem.removeAttribute('id');
}

После этого элемент перестанет находиться по старому id и не будет участвовать в селекторе #temp-block.


Как найти все элементы у которых есть атрибут id

Если нужно получить список всех элементов с любым id, можно использовать атрибутный селектор:

// Здесь мы получаем NodeList всех элементов у которых есть id
const allWithId = document.querySelectorAll('[id]');

// Перебираем найденные элементы
allWithId.forEach(function (el) {
  // Выводим текущий id в консоль
  console.log(el.id);
});

Это удобно для отладки и анализа структуры документа.


Что делать если сервер генерирует дублирующиеся id в шаблонах

Если у вас серверная генерация HTML и появляются дубликаты id, действуйте так:

  1. Найдите повторяющиеся шаблоны (циклы, частичные шаблоны).
  2. Передавайте в шаблон индекс или идентификатор из базы.
  3. Стройте id на основе этого индекса (например item-{{id}}).
  4. Прогоните HTML через валидатор или напишите тест, который ищет дублирующиеся id в сгенерированной странице.

Так вы перенесете контроль уникальности id в код генерации и избежите скрытых ошибок на клиенте.

Стрелочка влевоАтрибут style в HTML - как он работает и когда его использоватьСкрытый элемент в HTML - атрибут hidden и его практическое применениеСтрелочка вправо

Постройте личный план изучения Html до уровня Middle — бесплатно!

Html — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Все гайды по Html

Тег section в HTML - семантическая разметка структуры страницыТег main в HTML - подробное руководство по использованиюТег nav в HTML - полное руководство по семантической навигацииТег header в HTML - полное практическое руководствоТег footer в HTML - назначение семантика и практические примерыТег figure в HTML - как правильно оформлять иллюстрации и подписиТег figcaption в HTML - подробное руководство с примерамиТег aside в HTML - назначение правильная семантика и примерыТег article в HTML - семантика и практическое использование
Выпадающий список HTML select - полное руководство для разработчиковАтрибут method в HTML - как правильно отправлять данные формыЗаголовок группы HTML legend - как правильно использовать и оформлятьОпция списка HTML option - как работает и как правильно использоватьТекстовая область HTML textarea - практическое руководствоТег input в HTML - типы атрибуты валидация и примерыТег формы form в HTMLГруппа полей HTML fieldsetАтрибут action в HTML - как правильно задавать адрес отправки формы
Открыть базу знаний

Лучшие курсы по теме

изображение курса

HTML и CSS

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий