How To Use Data Attributes In JavaScript, CSS + HTML
The smart way to store additional information on the DOM
This article is a short and quick guide to using data attributes in JavaScript— something I wish I knew more about when I was beginning my own JavaScript journey.
What are data attributes?
Data attributes are actually HTML attributes that allow you to create and assign bespoke data points to HTML elements. They are accessible via HMTL, CSS, and JavaScript, making them a powerful choice for storing bits of information that maybe aren’t so appropriate for class
lists or id
s. After all, we should aim to keep class
and id
attributes reserved for styling purposes, otherwise, things can get very messy and confusing quickly.
Data attributes in HTML
Identifying data attributes in HTML is pretty easy, just look for anything in the HTML element tags that has data-something
. The something
, in this case, can be anything you want under the sun although it is best practice to name it expressively so that you, and other programmers using your code, can easily tell what type of information is being stored in that data attribute. To create a data attribute in HTML, simply start the property with data-
and pick a name that makes sense for you. You will want to use the assignment operator, =
, to set the data attribute value to a string
. If your data attribute requires two or more words, just add a dash between each word. For example, If I wanted to create a data attribute called “trainer id”, I would write it as data-trainer-id
in the desired HTML element.
In the code below, we can see this very example hardcoded into the HTML. I decided to add data attributes to the different li
s in my unordered list so I could associate the trainer id of each pokemon. By doing this, I can easily retrieve information on what pokemon belongs to what trainer, and quickly apply JavaScript or CSS changes as needed.
The data attribute will not appear in your browser so there is no need to worry if our users will see it.
Creating data sets in JavaScript
While you can hardcode your data attributes in HTML, it is best practice to create them in JavaScript so that the values remain dynamic. Below is a screenshot of a data attribute being created as part of a button
element.
A quick breakdown of what is happening in the code above for more context:
- The function
renderPokemon()
is taking in adata
parameter, which is an array of objects in this case. - The function is then applying the
.forEach()
method to iterate over each object in thedata
array. - In each iteration, we are creating an
li
element and populating it with the element’snickname
andspecies
attributes, as well as creating abutton
that has a data attribute pointing to that element’sid
. In this case, the data attribute is calleddata-pokemon-id
.
**Phew*** ok, back to data attributes…
In this scenario, we are still hardcoding the HTML code for the data attribute but applying the value of that attribute dynamically. Doing this in our JavaScript file allows us more control, versatility, and usability over the data attributes. BUUUUT, we can do this better…
Using data attributes in JavaScript
We can actually use dot notation in JavaScript to create and assign data attributes, all it takes is a slight change in syntax. When using JavaScript, we now work with dataset
instead of data-
and we switch to camel case, thisIsCamelCase
, when creating a data attribute with more than one word.
In the code above, we kept it simple and assigned the trainerDiv
element a data attribute of id
. This is done by using dot notation, .dataset
, followed by the desired name for the attribute. If we wanted to use dot notation to create or assign a data attribute with more than one word, say “trainer id”, then it would look like this: trainerDiv.dataset.trainerId
. The result in HTML would look exactly like our first example where we hard coded the data attribute into the element tag.
Once my newLi
is added to the DOM, I can search for that node using traditional DOM traversal techniques, such as .querySelector()
…
Or, if we have the element already in hand, we can check it’s data attributes by using dot notation again!
Don’t worry about DOMStringMap
in the screenshot above, that is just the interface that is used for the HTML.dataset attribute (aka, we get .dataset
from the DOMStringMap
).
Data attributes in CSS
Finally, since data attributes are just plain HTML properties, we can use these data attributes in CSS too. For example, we could target the li
elements that have data-trainer-id = "8"
and data-trainer-id = "12"
to apply style changes depending on the trainer's id.
Conclusion
TLDR; data attributes are a great way to store additional data that does not fit/should not be in either id
or class
attribute of an HTML element. Data attributes can be created and assigned in HTML or JavaScript using the following syntax:
- HTML:
data-some-name = "value"
(use dashes) - JavaScript:
element.dataset.someName = "value"
(use .dataset and camelCase)
Data attributes can be accessed via dot notation or using DOM traversal techniques such as .querySelector()
:
element.dataset
element.querySelector('[data-some-name = "value"]')
withvalue
being the actual value you are looking for (e.g., 9, “fluffy”, etc.)
Data attributes can be used by CSS to apply style changes as well.