logo oujood
🔍

Récupérer et manipuler les valeurs CSS en JavaScript avec getComputedStyle()

Tutoriel complet 2026 : accédez aux styles calculés, styles inline et variables CSS depuis JavaScript — avec exemples commentés, conversions d'unités et bonnes pratiques E-E-A-T.

OUJOOD.COM

Introduction : pourquoi accéder aux propriétés CSS depuis JavaScript ?

La lecture dynamique des styles CSS via JavaScript est indispensable pour créer des interfaces réactives, des animations pilotées par les données et des composants adaptatifs. Que vous développiez un slider animé, un système de thème sombre/clair ou une mise en page responsive pilotée par JS, vous aurez besoin d'interroger les propriétés CSS en temps réel. Ce guide couvre les deux méthodes natives du navigateur — window.getComputedStyle() et element.style — ainsi que la lecture des variables CSS personnalisées (custom properties), la conversion d'unités et les patterns avancés utilisés en production en 2026.

Les deux approches pour lire les styles CSS en JavaScript

Le navigateur expose deux interfaces complémentaires. getComputedStyle() retourne la valeur calculée et résolue de toute propriété CSS, qu'elle provienne d'une feuille de style externe, d'une règle <style> interne ou d'un style inline — c'est la méthode de référence pour lire n'importe quelle propriété appliquée. element.style, en revanche, n'expose que les déclarations posées directement sur l'attribut style="…" de la balise : utile pour écrire ou lire un style inline, mais aveugle aux règles CSS externes.

  • getComputedStyle(element) — lecture complète, toutes sources confondues, en lecture seule
  • element.style — lecture/écriture des styles inline uniquement

Méthode 1 : getComputedStyle() — lire tous les styles calculés

window.getComputedStyle(element) retourne un objet CSSStyleDeclaration figé au moment de l'appel. Chaque propriété y est exprimée dans son unité résolue par le navigateur (généralement en px pour les dimensions, en rgb() pour les couleurs). C'est la technique recommandée pour récupérer dynamiquement la valeur CSS d'un élément quelle que soit son origine.

  📋 Copier le code

// Sélectionner l'élément cible dans le DOM
const element = document.querySelector('#mon-element');
// Obtenir l'objet CSSStyleDeclaration avec tous les styles calculés
const styles = window.getComputedStyle(element);
// Lecture via getPropertyValue — fonctionne avec les noms kebab-case CSS
const couleur = styles.getPropertyValue('background-color');
// Lecture via notation pointée — utiliser le camelCase équivalent
const couleurAlt = styles.backgroundColor;
console.log(couleur); // ex : "rgb(255, 255, 255)"

Exemple pratique : lire la couleur d'arrière-plan calculée

L'exemple suivant illustre comment récupérer la couleur de fond réelle d'un élément, même si elle est définie dans un fichier CSS externe. Le navigateur résout toujours la couleur en valeur rgb() ou rgba() — jamais en hexadécimal — via getComputedStyle.

  📋 Copier le code

// Cibler l'élément par son identifiant
const boite = document.getElementById('boite-hero');
// getComputedStyle lit toutes les règles CSS appliquées, cascade incluse
const styles = window.getComputedStyle(boite);
// backgroundColor est toujours retourné au format rgb() dans les navigateurs modernes
const bgColor = styles.backgroundColor;
console.log('Couleur de fond calculée :', bgColor);
// Résultat typique : "rgb(30, 30, 46)" même si le CSS définissait "#1e1e2e"

Lire les styles d'un pseudo-élément (::before, ::after)

getComputedStyle() accepte un second argument optionnel pour cibler un pseudo-élément CSS — fonctionnalité souvent ignorée mais très utile pour déboguer des icônes générées via CSS.

  📋 Copier le code

// Lire les styles calculés du pseudo-élément ::before
const element = document.querySelector('.icone-fleche');
const stylesAvant = window.getComputedStyle(element, '::before');
// Récupérer le contenu CSS généré (valeur de la propriété content)
const contenu = stylesAvant.getPropertyValue('content');
console.log('Contenu ::before :', contenu); // ex : "\"→\""

Méthode 2 : element.style — lire et écrire les styles inline

element.style donne accès au style attribute inline de l'élément, en lecture et en écriture. C'est la méthode utilisée pour appliquer dynamiquement une propriété CSS via JavaScript. Attention : si la propriété n'est pas définie en inline, element.style.propriete retourne une chaîne vide — même si la règle existe dans une feuille de style.

  📋 Copier le code

// Lire un style inline existant (défini dans style="width:300px")
const element = document.querySelector('#barre-progres');
const largeurInline = element.style.width;
console.log(largeurInline); // "300px" si défini en inline, "" sinon
// Écrire un style inline — camelCase obligatoire pour les propriétés composées
element.style.backgroundColor = '#3498db';
element.style.transition = 'width 0.4s ease-in-out';
// Supprimer un style inline pour laisser la feuille CSS reprendre le contrôle
element.style.removeProperty('background-color');

Quand utiliser element.style plutôt que getComputedStyle ?

Utilisez element.style pour écrire des propriétés CSS dynamiques (animations, thèmes, positionnements calculés en JS). Utilisez getComputedStyle() pour lire la valeur réelle appliquée. Combiner les deux — lire avec getComputedStyle, puis écrire avec element.style — est le pattern standard pour les animations JavaScript sans bibliothèque externe.

Conversion des valeurs CSS en nombres : parseInt et parseFloat

getComputedStyle() retourne toujours des chaînes de caractères avec unité ("16px", "1.5rem", "0.8"). Pour effectuer des calculs mathématiques, il faut extraire la partie numérique avec parseInt() ou parseFloat(). Ces fonctions ignorent automatiquement le suffixe d'unité.

parseInt() : pour les valeurs entières (px, z-index, colonnes)

  📋 Copier le code

// Récupérer la largeur calculée d'un élément en pixels
const carte = document.querySelector('.carte-produit');
const styles = window.getComputedStyle(carte);
// styles.width retourne "320px" — parseInt retire "px" et retourne 320
const largeur = parseInt(styles.width, 10); // toujours préciser la base 10
const zIndex = parseInt(styles.zIndex, 10);
console.log(`Largeur: ${largeur}px, z-index: ${zIndex}`);

parseFloat() : pour les valeurs décimales (opacity, font-size, line-height)

  📋 Copier le code

// Lire l'opacité actuelle pour créer un effet de fondu progressif
const overlay = document.querySelector('.overlay-modal');
const styles = window.getComputedStyle(overlay);
// styles.opacity retourne "0.75" — parseFloat préserve les décimales
const opacite = parseFloat(styles.opacity); // 0.75
const taillePolice = parseFloat(styles.fontSize); // ex : 16.0 (en px)
const hauteurLigne = parseFloat(styles.lineHeight); // ex : 24.0 (en px)
console.log(`Opacité: ${opacite}, Font: ${taillePolice}px, Line-height: ${hauteurLigne}px`);

Extraire valeur et unité séparément

Dans certains cas, notamment pour les conversions entre unités CSS (px → rem, em → px), vous devez connaître à la fois la valeur numérique et l'unité. La fonction utilitaire suivante utilise une expression régulière pour séparer les deux.

  📋 Copier le code

/**
 * Extrait la valeur numérique et l'unité d'une chaîne CSS.
 * @param {string} cssValue - ex : "1.5rem", "300px", "75%"
 * @returns {{ value: number, unit: string } | null}
 */
function extraireCSSValeurUnite(cssValue) {
  // Regex : capture les chiffres (avec décimale et signe) puis les caractères restants
  const match = cssValue.match(/^(-?\d*\.?\d+)(\D+)$/);
  if (!match) return null;
  return { value: parseFloat(match[1]), unit: match[2].trim() };
}
// Utilisation pratique
const styles = window.getComputedStyle(document.documentElement);
const fs = styles.fontSize; // ex : "18px"
const resultat = extraireCSSValeurUnite(fs);
// → { value: 18, unit: "px" }
console.log(`${resultat.value} ${resultat.unit}`);

Lire et modifier les variables CSS (custom properties) depuis JavaScript

Les variables CSS (custom properties) — déclarées avec la syntaxe --nom-variable — sont massivement adoptées en 2026 pour les systèmes de design tokens, les thèmes dynamiques et les animations paramétrables. JavaScript peut les lire via getPropertyValue() et les modifier via setProperty().

  📋 Copier le code

// Lire une variable CSS définie sur :root ou un élément
const root = document.documentElement;
const styles = window.getComputedStyle(root);
// getPropertyValue avec le double tiret est obligatoire pour les custom properties
const couleurPrimaire = styles.getPropertyValue('--couleur-primaire').trim();
console.log('Couleur primaire :', couleurPrimaire); // ex : "#6366f1"
// Modifier une variable CSS globalement (s'applique à tout le document)
root.style.setProperty('--couleur-primaire', '#10b981');
// Modifier une variable sur un élément spécifique (portée locale)
const carte = document.querySelector('.carte-theme');
carte.style.setProperty('--rayon-bordure', '16px');
// Supprimer une variable CSS personnalisée
root.style.removeProperty('--couleur-primaire');

Basculer un thème sombre/clair avec les variables CSS

Un cas d'usage courant en 2026 : switcher entre thème clair et sombre en ne modifiant qu'une seule variable CSS, ce qui propage le changement à toute l'interface.

  📋 Copier le code

// Basculer entre thème clair et thème sombre via data-attribute + variables CSS
function toggleTheme() {
  const root = document.documentElement;
  const themeActuel = root.dataset.theme || 'clair';
  // On change uniquement un attribut data — les variables CSS sont gérées en CSS
  root.dataset.theme = themeActuel === 'clair' ? 'sombre' : 'clair';
  // Persister le choix dans localStorage pour les visites suivantes
  localStorage.setItem('theme-preference', root.dataset.theme);
}
// Au chargement, restaurer la préférence utilisateur
const prefSauvegardee = localStorage.getItem('theme-preference');
if (prefSauvegardee) document.documentElement.dataset.theme = prefSauvegardee;

Compatibilité navigateurs et nuances cross-browser

getComputedStyle() est supporté par tous les navigateurs modernes (Chrome, Firefox, Safari, Edge) depuis de nombreuses années. En 2026, quelques comportements méritent néanmoins d'être connus pour éviter des bugs subtils :

  • Format des couleurs : tous les navigateurs modernes retournent rgb() ou rgba() — jamais l'hexadécimal. Planifiez vos comparaisons en conséquence.
  • Valeurs en shorthand : évitez de lire les propriétés raccourcies comme margin ou padding directement — préférez margin-top, padding-left, etc. qui sont fiables cross-browser.
  • Propriétés non définies : getComputedStyle retourne la valeur calculée par défaut du navigateur, jamais une chaîne vide (contrairement à element.style).
  • Préfixes vendeurs : en 2026, les préfixes -webkit- sont encore requis pour quelques propriétés Safari. Testez avec CSS.supports() pour une détection propre.

Cas d'usage avancés

Animation JavaScript fluide basée sur la largeur actuelle

Ce pattern lit la largeur CSS calculée avant de lancer une animation, ce qui permet de partir de la taille réelle de l'élément sans valeur codée en dur.

  📋 Copier le code

/**
 * Anime la largeur d'un élément de sa valeur actuelle vers une cible.
 * @param {string} id        - Identifiant de l'élément DOM
 * @param {number} cible     - Largeur cible en pixels
 * @param {number} dureeMs   - Durée de l'animation en millisecondes
 */
function animerLargeur(id, cible, dureeMs = 400) {
  const el = document.getElementById(id);
  // Lire la largeur réelle, quelle que soit la source CSS
  const depart = parseInt(window.getComputedStyle(el).width, 10);
  const delta = cible - depart;
  const debut = performance.now();
  // Utiliser requestAnimationFrame pour des animations 60fps
  function tick(maintenant) {
    const progression = Math.min((maintenant - debut) / dureeMs, 1);
    // Easing easeInOut pour un mouvement naturel
    const ease = progression < 0.5
      ? 2 * progression * progression
      : 1 - Math.pow(-2 * progression + 2, 2) / 2;
    el.style.width = (depart + delta * ease) + 'px';
    if (progression < 1) requestAnimationFrame(tick);
  }
  requestAnimationFrame(tick);
}
// Exemple : élargir la barre de progression à 500px en 600ms
animerLargeur('barre-progres', 500, 600);

Vérifier si un élément est visible dans le DOM

La combinaison de plusieurs propriétés CSS permet de détecter la visibilité effective d'un élément, en tenant compte de display, visibility et opacity.

  📋 Copier le code

/**
 * Vérifie si un élément est visible pour l'utilisateur.
 * Combine display, visibility et opacity pour une détection robuste.
 * @param {string} id - Identifiant de l'élément
 * @returns {boolean}
 */
function estVisible(id) {
  const el = document.getElementById(id);
  if (!el) return false;
  const s = window.getComputedStyle(el);
  return s.display !== 'none'
    && s.visibility !== 'hidden'
    && s.visibility !== 'collapse'
    && parseFloat(s.opacity) > 0;
}
// Utilisation conditionnelle
if (estVisible('panneau-notifications')) {
  console.log('Le panneau est visible — on peut l\'animer.');
}

Détecter le point de rupture CSS actif (breakpoint responsive)

En 2026, une technique populaire consiste à lire la valeur d'une variable CSS pour détecter le breakpoint responsive actif — évitant de dupliquer les media queries en JavaScript.

  📋 Copier le code

/* Dans votre CSS :
   :root { --breakpoint: "mobile"; }
   @media (min-width: 768px) { :root { --breakpoint: "tablet"; } }
   @media (min-width: 1024px) { :root { --breakpoint: "desktop"; } }
*/
function breakpointActif() {
  const valeur = window.getComputedStyle(document.documentElement)
    .getPropertyValue('--breakpoint')
    .trim()
    .replace(/['"]/g, ''); // Certains navigateurs incluent les guillemets
  return valeur; // "mobile" | "tablet" | "desktop"
}
console.log('Breakpoint actif :', breakpointActif());
// Mettre à jour au redimensionnement avec debounce
window.addEventListener('resize', () => {
  clearTimeout(window._bpTimer);
  window._bpTimer = setTimeout(() => {
    console.log('Nouveau breakpoint :', breakpointActif());
  }, 150);
});

Conclusion et bonnes pratiques 2026

Pour récupérer les valeurs CSS en JavaScript de façon fiable, retenez ces règles essentielles : utilisez toujours getComputedStyle() pour lire les valeurs réelles (cascade incluse), et element.style pour écrire des styles inline dynamiques. Précisez toujours la base 10 dans parseInt(valeur, 10) pour éviter les bugs sur les valeurs commençant par 0. Pour les variables CSS custom properties, getPropertyValue('--nom') suivi de .trim() garantit un résultat propre cross-browser. Enfin, privilégiez requestAnimationFrame aux setInterval pour toute animation pilotée par JavaScript afin d'assurer des animations 60fps fluides sans layout thrashing.

Pour aller encore plus loin, explorez ResizeObserver pour réagir aux changements de taille sans polling, IntersectionObserver pour détecter l'entrée en viewport, et l'API CSS.registerProperty() (Houdini) pour des transitions sur custom properties avec typage fort.


Par carabde | Mis à jour le 19 février 2026