Олег Марков
Атрибут id в HTML - как правильно использовать и не ломать верстку
Введение
Атрибут 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
Давайте разложим по задачам, чтобы вам было проще запомнить:
Поиск элемента в JavaScript
Вы можете быстро найти элемент поid, не перебирая весь DOM.Применение стиля к одному конкретному элементу
В CSS селектор#idуказывает стиль для одного элемента.Якорные ссылки и прокрутка к нужному месту страницы
Можно перейти сразу к нужному блоку с помощью ссылки с решеткой в URL.Связь полей форм и подписей
Например,labelссылается наinputчерезfor="id".Доступность и вспомогательные технологии
Например,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 и якорные ссылки (anchor links)
Как работает переход по якорю
Если у элемента есть 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-case—main-header,user-profile-page;snake_case—main_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 и т.д.) можно:
- Открыть вкладку Elements (или Аналог).
- Использовать поиск по
id:- нажать Ctrl+F / Cmd+F;
- ввести
id="имя"и посмотреть, сколько совпадений;
- Если совпадений больше одного — у вас конфликт.
Заключение
Атрибут id в HTML — это не просто способ «как‑то назвать элемент», а важный механизм, который связывает:
- структуру страницы (HTML),
- внешний вид (CSS),
- логику (JavaScript),
- и доступность (ARIA, screen readers).
Основные моменты, которые вам стоит запомнить:
- значение
idдолжно быть уникальным в пределах документа; - используйте
idдля:- якорей и навигации по странице;
- точек входа для JavaScript;
- связей
label–inputи 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, действуйте так:
- Найдите повторяющиеся шаблоны (циклы, частичные шаблоны).
- Передавайте в шаблон индекс или идентификатор из базы.
- Стройте
idна основе этого индекса (напримерitem-{{id}}). - Прогоните HTML через валидатор или напишите тест, который ищет дублирующиеся
idв сгенерированной странице.
Так вы перенесете контроль уникальности id в код генерации и избежите скрытых ошибок на клиенте.
Постройте личный план изучения Html до уровня Middle — бесплатно!
Html — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Все гайды по Html
Лучшие курсы по теме

HTML и CSS
Антон Ларичев
TypeScript с нуля
Антон Ларичев