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.
// 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.
// 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.
// 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.
// 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)
// 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)
// 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.
/** * 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().
// 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.
// 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()ourgba()— jamais l'hexadécimal. Planifiez vos comparaisons en conséquence. - Valeurs en shorthand : évitez de lire les propriétés raccourcies comme
marginoupaddingdirectement — préférezmargin-top,padding-left, etc. qui sont fiables cross-browser. - Propriétés non définies :
getComputedStyleretourne 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 avecCSS.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.
/** * 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.
/** * 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.
/* 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.
| - | Accueil | - |
Par carabde | Mis à jour le 19 février 2026