Chapitre 6 sur 11

Tutoriel VueJS 3 – Liaison des classes et des styles

vérifié le 2 septembre 2026 · 4 min

Réponse rapide

:class accepte un objet dont les clés sont des noms de classes et les valeurs des conditions, :style accepte un objet de propriétés CSS écrites en camel case. Les attributs class statique et :class dynamique coexistent : Vue les fusionne.

À la fin de ce chapitre, vous saurez refléter l’état de l’application dans l’apparence, sans toucher au DOM.

class et style sont deux attributs particuliers : en plus des chaînes, v-bind y accepte des objets et des tableaux. C’est ce qui permet de refléter l’état de l’application dans l’apparence sans manipuler le DOM à la main.

Des pastilles de couleur

Remplaçons les mots « Bleu » et « Rouge » par des pastilles de la vraie couleur. Stockez d’abord un code hexadécimal plutôt qu’un nom :

src/App.vue
<script setup>
const variants = ref([
  { id: 2234, color: '#2563eb', image: '/images/t-shirt-bleu.svg' },
  { id: 2235, color: '#dc2626', image: '/images/t-shirt-rouge.svg' }
])
</script>

Puis liez la couleur de fond :

src/App.vue
<div class="variants-wrapper">
  <div
    v-for="variant in variants"
    :key="variant.id"
    class="color-circle"
    :style="{ backgroundColor: variant.color }"
    @mouseover="updateImage(variant.image)"
  ></div>
</div>

Deux pastilles rondes apparaissent, une bleue et une rouge, et le survol change toujours l’image.

Camel case ou kebab case

L’objet passé à :style est un objet JavaScript. Les noms de propriétés CSS s’y écrivent donc en camel case :

html
<div :style="{ backgroundColor: variant.color }"></div>

Écrire background-color sans guillemets serait interprété comme une soustraction. Le kebab case reste possible entre guillemets :

html
<div :style="{ 'background-color': variant.color }"></div>

Les deux formes produisent le même résultat. Choisissez-en une et tenez-vous-y.

Sortir le style du gabarit

Quand les propriétés se multiplient, le gabarit devient illisible. Déclarez l’objet dans le script :

src/App.vue
<script setup>
const styleTitre = ref({
  color: '#111827',
  fontSize: '28px',
  fontWeight: '700'
})
</script>

<template>
  <h1 :style="styleTitre">{{ product }}</h1>
</template>

Un tableau permet de combiner plusieurs objets, les derniers l’emportant sur les premiers :

html
<div :style="[styleBase, styleSurcharge]"></div>

Lier une classe

Passons au bouton. Quand le produit est en rupture, il doit être à la fois inactif et visiblement inactif.

Commencez par l’attribut disabled, lié comme au chapitre 2 :

src/App.vue
<button class="button" :disabled="!inStock" @click="addToCart">
  Ajouter au panier
</button>

Le bouton ne répond plus au clic, mais rien ne le montre. Ajoutez la classe grise, conditionnée de la même façon :

src/App.vue
<button
  class="button"
  :class="{ disabledButton: !inStock }"
  :disabled="!inStock"
  @click="addToCart"
>
  Ajouter au panier
</button>

Dans l’objet passé à :class, la clé est le nom de la classe et la valeur la condition. Quand !inStock est vrai, la classe disabledButton est ajoutée, sinon elle est retirée.

class et :class coexistent

Le bouton porte à la fois class="button" et :class="{ … }". Vue ne les met pas en concurrence : il les fusionne.

html
<!-- écrit dans le gabarit -->
<button class="button" :class="{ disabledButton: true }">

<!-- rendu dans la page -->
<button class="button disabledButton">

Gardez les classes fixes dans class et les classes conditionnelles dans :class.

Plusieurs classes conditionnelles

L’objet accepte autant d’entrées que nécessaire :

html
<div :class="{ actif: estActif, 'en-erreur': aUneErreur, masque: !visible }"></div>

Un nom de classe contenant un tiret doit être entre guillemets, pour la même raison que le kebab case des styles.

Choisir entre deux classes

L’objet ajoute ou retire une classe. Pour basculer entre deux classes, utilisez un ternaire dans un tableau :

html
<div :class="[inStock ? 'enStock' : 'enRupture']"></div>

Le tableau accepte aussi un mélange de chaînes et d’objets :

html
<div :class="['color-circle', { selectionne: index === selectedVariant }]"></div>

Où mettre le CSS

Un composant monofichier peut porter son propre style, isolé par l’attribut scoped :

src/App.vue
<style scoped>
.color-circle {
  width: 50px;
  height: 50px;
  border-radius: 50%;
  cursor: pointer;
}
</style>

Ces classes peuvent aussi être animées : c’est le sujet du chapitre sur les transitions.

Avec scoped, ces règles ne s’appliquent qu’aux éléments de ce composant : Vue ajoute un attribut unique aux balises et le reprend dans le sélecteur. C’est ce qui évite qu’une classe .button définie dans un composant en repeigne un autre.

En Options API

Rien ne change dans le gabarit. L’objet de style se déclarerait dans data(), ou mieux dans computed s’il dépend d’autre chose.

ExerciceAjoutez une classe selectionnee sur la pastille de couleur active, avec une bordure plus épaisse. Vous aurez besoin de l’index de la boucle et de la déclinaison sélectionnée.

Erreurs fréquentes

background-color sans guillemets Dans l’objet passé à :style, le tiret est lu comme une soustraction. Écrivez backgroundColor, ou 'background-color' entre guillemets.
Croire que :class écrase class Les deux attributs sont fusionnés. Gardez les classes fixes dans class et les conditionnelles dans :class.
Un nom de classe avec un tiret sans guillemets { en-erreur: vrai } est invalide en JavaScript : il faut { 'en-erreur': vrai }.
Newsletter

Les nouveaux tests, tutoriels et projets, par e-mail.

Tests reproductibles, code versionné, résultats datés. Jamais de spam.