Data-атрибуты

Это — атрибуты, которые можно применять для удобного хранения в стандартных HTML-элементах различной полезной информации. Эта информация, в частности, может применяться в JavaScript и CSS.

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

Главная возможность то, что по data атрибуту можно работать как по наличию этого атрибута, так и по значению этого атрибута и вытаскивать значения из этого атрибута.

Синтаксис

Возможность создавать собственные HTML-атрибуты и записывать в них данные может оказаться крайне полезной. Это, как вы понимаете, возможно благодаря атрибутам data-имя . Именно для этого такие атрибуты и предназначены.

Эти атрибуты, именно из-за того, что они всегда начинаются с префикса data-, часто называют атрибутами data-* или data-атрибутами. При формировании имён этих атрибутов сначала идёт слово data, потом — тире (-), а потом — оставшаяся часть имени, устроенная так, как нужно разработчику.

Этим атрибутам необязательно назначать значения
<div data-foo></div>

...но они могут содержать значения
<div data-size="large"></div>

Тут мы имеем дело с HTML, поэтому надо экранировать HTML-код, который, возможно, решено будет записать в атрибут
<li data-prefix="Careful with HTML in here."><li>

Если надо - можно создавать длинные имена атрибутов
<aside data-some-long-attribute-name><aside>

Чего не стоит делать с атрибутами data-*

В таких атрибутах не стоит хранить содержимое, которое должно быть доступно ассистивным технологиям. Если некие данные должны быть видимы на странице, или должны быть доступны средствам для чтения с экрана, их недостаточно просто поместить в атрибут data-*. Такие данные должны появиться и в обычной HTML-разметке.

Эти данные не выводятся на странице, они недоступны ассистивным технологиям
<div> data-name="Chris Coyier"></div>

CSS и data-*

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

Выбор элементов, у которых имеется указанный атрибут
[data-size] { }

Выбор элемента, атрибут которого имеет заданное значение
[data-state="open"],
[aria-expanded="true"] { }

Селектор "начинается с", использование которого приведёт к выбору элементов, атрибут которых содержит "3", а так же - что угодно другое, начинающееся с 3 - вроде "3.14"
[data-version^="3"] { }

Селектор "содержит" указывает на то, что заданная строка должна содержаться где-то в значении свойства
[data-company*="google"] { }

CSS позволяет извлекать значения атрибутов data-* и выводить их на странице.

 
                             
<div data-emoji="111">  
[data-emoji]::before {
content: attr(data-emoji); Возвращает 111 margin-right: 5px;
}

JavaScript и data-*

К значениям атрибутов data-* можно обращаться, как и к значениям других атрибутов, пользуясь методом getAtribute для чтения данных, и методом setAttribute для записи.

Чтение значения атрибута
let value = el.getAttribute("data-state");

Запись значения атрибута.
В data-state записывается значение "collapsed"
el.setAttribute("data-state", "collapsed");

Идея тут заключается в том, чтобы, пользуясь атрибутами data-*, размещать в HTML-коде данные, к которым можно обращаться из JavaScript для выполнения неких действий.

Распространённый вариант реализации этого сценария направлен на организацию работы с базами данных. Предположим, у нас имеется кнопка Like:

< button data-id="435432343">Like< /button>

У этой кнопки может быть обработчик нажатия, выполняющий AJAX-запрос к серверу. Обработчик, если пользователь лайкнет что-то с помощью кнопки, увеличивает количество лайков в серверной базе данных. Обработчик знает о том, какую именно запись надо обновить, так как берёт сведения об этом из атрибута data-*.