Открыть сервис

Атрибут data-

Атрибут data- — это глобальный HTML-атрибут, предназначенный для хранения пользовательских (нестандартных) данных в HTML-элементах. Атрибуты data-* позволяют веб-разработчикам добавлять к элементам произвольную информацию, которая не имеет стандартного семантического значения, но может быть использована в скриптах (JavaScript) или стилях (CSS) для реализации интерактивности, конфигурации или хранения состояния. Название атрибута всегда начинается с префикса data-, за которым следует произвольное имя, состоящее из строчных букв, цифр, дефисов, точек, двоеточий и символов подчёркивания.

История и стандартизация

До появления атрибутов data- веб-разработчики использовали для хранения пользовательских данных нестандартные атрибуты (например, myattr="value"), что нарушало спецификации HTML и могло приводить к проблемам с валидацией документа. В 2008 году в черновике спецификации HTML5, разрабатываемой Консорциумом Всемирной паутины (W3C), был впервые предложен механизм пользовательских атрибутов с префиксом data-. Окончательно атрибут data- был стандартизирован в спецификации HTML5, опубликованной W3C в 2014 году. С этого момента он стал частью стандарта и поддерживается всеми современными браузерами.

Синтаксис и правила именования

Атрибут data-* добавляется к любому HTML-элементу. Общий синтаксис:

``html <element data-имя="значение">...</element> ``

Правила именования:

  • Имя атрибута должно начинаться с префикса data-.
  • После префикса может следовать любое имя, состоящее из строчных букв латинского алфавита (a–z), цифр (0–9), дефисов (-), точек (.), двоеточий (:) и символов подчёркивания (_).
  • Имя не должно содержать заглавных букв. Если в JavaScript требуется обратиться к атрибуту с дефисами, используется camelCase-нотация (например, data-user-name становится dataset.userName).

Примеры допустимых имён:

  • data-id
  • data-user-name
  • data-config-version-2

Примеры недопустимых имён:

  • data- (имя не может быть пустым)
  • data-1name (имя не может начинаться с цифры)
  • data-Name (заглавные буквы не допускаются)

Доступ к данным через JavaScript

Для работы с атрибутами data-* в JavaScript используется свойство dataset объекта HTMLElement. Свойство dataset возвращает объект DOMStringMap, содержащий все пользовательские атрибуты элемента.

Механизм преобразования имени:

  • Дефисы в имени атрибута удаляются, а следующая за дефисом буква преобразуется в заглавную (camelCase).
  • Например, атрибут data-user-name в JavaScript доступен как element.dataset.userName.
  • Атрибут data-id доступен как element.dataset.id.

Пример использования:

``html <div id="product" data-product-id="12345" data-category="electronics" data-price="299.99">Товар</div> ``

```javascript const product = document.getElementById('product'); console.log(product.dataset.productId); // "12345" console.log(product.dataset.category); // "electronics" console.log(product.dataset.price); // "299.99"

// Изменение атрибута product.dataset.price = "249.99"; // После этого атрибут в HTML станет data-price="249.99"

// Удаление атрибута delete product.dataset.category; // Атрибут data-category будет удалён из HTML ```

Особенности:

  • Все значения атрибутов data-* в dataset хранятся в виде строк. Для работы с числами или булевыми значениями требуется явное преобразование.
  • Если атрибут не существует, обращение к соответствующему свойству dataset вернёт undefined.
  • Свойство dataset доступно только для чтения, но его свойства можно изменять и удалять.

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

Атрибуты data-* могут быть использованы в CSS-селекторах с помощью атрибутных селекторов. Это позволяет применять стили в зависимости от значений пользовательских данных.

Пример:

```css / Стили для элементов с data-status="active" / [data-status="active"] { background-color: green; color: white; }

/ Стили для элементов с data-status="inactive" / [data-status="inactive"] { background-color: gray; color: #ccc; }

/ Стили для элементов, у которых есть атрибут data-role / [data-role] { border: 1px solid blue; } ```

Также можно использовать функцию attr() в CSS для отображения значений атрибутов (например, в псевдоэлементах ::before и ::after), хотя поддержка этой функции ограничена и в основном используется для отображения текстовых данных.

Применение

Атрибуты data-* широко используются в веб-разработке для решения следующих задач:

Хранение конфигурационных данных

Атрибуты позволяют хранить параметры, необходимые для работы JavaScript-скриптов, непосредственно в HTML-разметке. Например, можно указать идентификатор записи в базе данных, URL для AJAX-запроса или настройки анимации.

Реализация интерактивности без дополнительных HTTP-запросов

С помощью data-* можно хранить состояние элемента (например, открыт/закрыт, активен/неактивен) и изменять его через JavaScript без обращения к серверу.

Создание пользовательских интерфейсов

Фреймворки и библиотеки (например, Bootstrap, jQuery UI) часто используют атрибуты data-* для конфигурации компонентов. Например, в Bootstrap атрибут data-bs-toggle="tooltip" активирует всплывающую подсказку.

Передача данных между HTML и JavaScript

Атрибуты data-* служат удобным мостом между статической разметкой и динамическим поведением. Например, можно передать в JavaScript информацию о товаре (цену, артикул, категорию) без использования скрытых полей форм или глобальных переменных.

Тестирование и автоматизация

В автоматизированных тестах (например, с использованием Selenium или Cypress) атрибуты data-* часто используются для однозначной идентификации элементов интерфейса, так как они не зависят от изменений классов или структуры DOM.

Примеры использования

Пример 1: Хранение идентификатора и действия при клике

``html <button data-action="delete" data-id="42">Удалить</button> ``

``javascript document.querySelector('button').addEventListener('click', function() { const action = this.dataset.action; // "delete" const id = this.dataset.id; // "42" // Выполнение действия }); ``

Пример 2: Конфигурация компонента

``html <div class="slider" data-speed="500" data-autoplay="true" data-interval="3000"> <!-- Слайды --> </div> ``

``javascript const slider = document.querySelector('.slider'); const config = { speed: parseInt(slider.dataset.speed), // 500 autoplay: slider.dataset.autoplay === 'true', // true interval: parseInt(slider.dataset.interval) // 3000 }; // Инициализация слайдера с конфигурацией ``

Пример 3: Стилизация на основе данных

``html <div data-status="success">Операция выполнена</div> <div data-status="error">Произошла ошибка</div> ``

``css [data-status="success"] { color: green; } [data-status="error"] { color: red; } ``

Ограничения и рекомендации

  • Тип данных: Все значения атрибутов data-* являются строками. Для хранения сложных структур данных (массивов, объектов) требуется сериализация (например, в JSON) и последующее парсинг.
  • Производительность: Чрезмерное использование атрибутов data-* может увеличить размер HTML-документа. Для хранения больших объёмов данных рекомендуется использовать JavaScript-объекты или хранилища (например, localStorage).
  • Семантика: Атрибуты data- не должны использоваться для хранения семантически значимой информации, которая должна быть доступна поисковым системам или вспомогательным технологиям (скринридерам). Для таких целей следует использовать стандартные атрибуты (например, alt, title, aria-).
  • Безопасность: Значения атрибутов data-* не следует использовать для хранения конфиденциальных данных (паролей, токенов), так как они доступны в DOM и могут быть прочитаны через инструменты разработчика.
  • Валидация: Использование атрибутов data-* не нарушает валидацию HTML5, так как они являются частью спецификации. Однако для поддержки старых браузеров (например, Internet Explorer 10 и ниже) может потребоваться полифилл для свойства dataset.

Сравнение с альтернативами

Метод хранения данныхПреимуществаНедостатки
Атрибуты data-*Простота, встроенная поддержка, доступность в CSSТолько строки, увеличение размера HTML
Скрытые поля формыПодходят для отправки на серверНеудобны для клиентской логики
JavaScript-объектыВысокая производительность, поддержка любых типовНе связаны с DOM, требуют отдельного управления
localStorage / sessionStorageХранение больших объёмов данных, постоянствоАсинхронный доступ, не связаны с конкретным элементом

Поддержка браузерами

Атрибуты data-* поддерживаются всеми современными браузерами, включая Google Chrome, Mozilla Firefox, Apple Safari, Microsoft Edge и Opera. Свойство dataset также поддерживается во всех современных браузерах. В Internet Explorer 10 и 11 поддержка dataset присутствует, но с некоторыми ограничениями (например, нельзя удалять атрибуты через delete).

Источники

  • Спецификация HTML5, раздел «Embedding custom non-visible data with the data-* attributes» (W3C).
  • MDN Web Docs: «Using data attributes» (Mozilla).
  • Спецификация DOM Living Standard, раздел «HTMLElement.dataset» (WHATWG).
  • Статья «HTML5 data-* Attributes» на сайте SitePoint.
  • Документация Bootstrap 5 по использованию атрибутов data-bs-*.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →