Avancé15 min de lecture

Attributs de Données Personnalisés

Apprends à utiliser les attributs data-* pour stocker des informations personnalisées sur les éléments HTML et y accéder avec l'API dataset de JavaScript.

Que Sont les Attributs data-* ?

HTML te permet d'ajouter des attributs personnalisés à n'importe quel élément en les préfixant avec data-. On les appelle attributs de données et ils fournissent un moyen standard d'intégrer des informations supplémentaires dans ton balisage.

html
<button data-action="delete" data-item-id="42">Delete</button>

Les attributs de données :

  • Sont complètement ignorés par le moteur de rendu du navigateur.
  • N'affectent pas la sémantique ou l'accessibilité (sauf si lus par JavaScript).
  • Sont du HTML valide — le pattern data-* fait partie de la spécification.
  • Peuvent stocker n'importe quelle valeur de type chaîne de caractères.

Conventions de Nommage

Les noms d'attributs de données doivent suivre ces règles :

  1. Commencer par data-.
  2. Contenir uniquement des lettres minuscules, des chiffres, des tirets, des points, des deux-points et des underscores.
  3. Pas de lettres majuscules.

Patterns de nommage courants

AttributUsage
data-idIdentifiant de l'élément
data-typeCatégorie/type de l'élément
data-statusÉtat actuel (active, disabled, etc.)
data-tooltipTexte de l'infobulle
data-sort-keyValeur de tri
data-configConfiguration (chaîne JSON)

Garde les noms descriptifs mais concis. Utilise des tirets pour séparer les mots : data-user-role, pas data-userrole.

L'API dataset

JavaScript fournit la propriété dataset sur chaque élément pour lire et écrire les attributs de données. Les noms avec tirets sont convertis en camelCase :

html
<div id="user" data-user-name="Alice" data-role="admin" data-login-count="5"></div>
js
const el = document.getElementById('user');

// Lecture
console.log(el.dataset.userName);   // "Alice"
console.log(el.dataset.role);        // "admin"
console.log(el.dataset.loginCount);  // "5" (toujours une chaîne)

// Écriture
el.dataset.status = 'online';  // ajoute data-status="online"

// Suppression
delete el.dataset.role;  // supprime l'attribut data-role

Note que les valeurs de dataset sont toujours des chaînes de caractères. Parse-les avec parseInt(), JSON.parse(), etc. selon les besoins.

Cas d'Usage et Limitations

Bons cas d'usage

  • Gestion d'état de l'interface : data-active="true", data-tab="settings"
  • Hooks JavaScript : data-action="save" pour la délégation d'événements
  • Ciblage CSS : [data-theme="dark"] { ... }
  • Filtrage/tri : data-price="29.99", data-category="books"

Quand NE PAS utiliser les attributs de données

  • Informations d'accessibilité — Utilise les attributs ARIA (aria-label, aria-expanded, etc.) à la place.
  • Hooks de style uniquement — Préfère les classes CSS. Les attributs de données doivent porter des données, pas juste servir de hooks de style.
  • Grandes quantités de données — Pour des données complexes, stocke-les dans des objets JavaScript et référence les éléments par ID.
  • Données sensibles — Les attributs de données sont visibles dans le DOM. Ne stocke jamais de mots de passe, tokens ou informations personnelles.

Exemple Pratique

html
<!-- Product cards with data attributes -->
<div class="product-list">
  <div class="card" data-product-id="101" data-category="electronics" data-price="299.99">
    <h3>Wireless Headphones</h3>
    <p>Price: $299.99</p>
    <button data-action="add-to-cart" data-product-id="101">Add to Cart</button>
  </div>

  <div class="card" data-product-id="102" data-category="books" data-price="19.99">
    <h3>HTML & CSS Guide</h3>
    <p>Price: $19.99</p>
    <button data-action="add-to-cart" data-product-id="102">Add to Cart</button>
  </div>
</div>

<!-- CSS can target data attributes -->
<style>
  [data-category="electronics"] { border-left: 3px solid #3498db; }
  [data-category="books"] { border-left: 3px solid #2ecc71; }
</style>

Comment accèdes-tu à l'attribut `data-user-name` en JavaScript ?

Prêt à pratiquer ?

Crée ton compte gratuit pour accéder à l'éditeur de code interactif, lancer les défis et suivre ta progression.