Aller au contenu
Me contacter

Toutes les briques

Bac à sable

La carte qui se retourne

Une carte qui se retourne montre une question au recto et sa réponse au verso, mais une simple rotation CSS laisse la face cachée lisible par le lecteur d'écran. Ici, le details fermé cache le verso, et visibility: hidden retire le recto quand la carte est retournée.

Technique
details et summary
Navigateurs
Chrome 105+, Firefox 121+, Safari 15.4+
JavaScript
Aucun

Démo

Désactive JavaScript : la carte se retourne toujours.

Question

Quelle est la capitale de l'Australie ?

Indice

Ce n'est pas la ville la plus peuplée du pays.

Voir la réponse

Réponse

Canberra. Sydney et Melbourne voulaient toutes deux le titre : la capitale a été construite entre les deux.

Anatomie

  1. article Le conteneur de la carte, nommé par son titre.
  2. Recto La face visible au départ : l'étiquette, la question et l'indice.
  3. details Garde l'état ouvert ou fermé de la carte.
  4. summary Le bouton qui retourne la carte. Son libellé ne change pas : son état réduit ou développé dit quelle face est affichée.
  5. Verso Le contenu du details, affiché par-dessus le recto à l'ouverture.

Code HTML

HTML
<article class="card" aria-labelledby="card-title">
  <!-- Recto : la face visible au chargement -->
  <div class="card__front">
    <h3 id="card-title">Quelle est la capitale de l'Australie ?</h3>
    <p>Indice…</p>
  </div>
  <details class="card__details">
    <!-- Élément déclencheur : le bouton qui retourne la carte -->
    <summary>Voir la réponse</summary>
    <!-- Verso : caché, et absent pour le lecteur d'écran,
         tant que la carte n'est pas retournée -->
    <div class="card__back">
      <p>Réponse…</p>
    </div>
  </details>
</article>
CSS
/* Le verso recouvre le recto quand la carte est retournée */
.card {
  position: relative;
}

.card summary {
  position: absolute;
  left: 22px;
  bottom: 22px;
  z-index: 2;
}

.card__back {
  position: absolute;
  inset: 0;
}

/* Le recto masqué sort aussi de l'arbre d'accessibilité */
.card:has(details[open]) .card__front {
  visibility: hidden;
}

@media (prefers-reduced-motion: no-preference) {
  details[open] .card__back {
    animation: flip 0.35s ease-out;
  }

  @keyframes flip {
    from {
      transform: perspective(900px) rotateY(-80deg);
      opacity: 0.4;
    }

    to {
      transform: none;
      opacity: 1;
    }
  }
}

Usages

Recommandé pour

  • Présenter une question et sa réponse, un problème et sa solution, ou un avant et un après, quand chaque face se comprend seule.
  • Des textes courts, de longueur proche sur les 2 faces.

Déconseillé pour

  • Retourner la carte au survol : impossible au clavier comme au tactile.
  • Cacher une face avec opacity: 0 ou une rotation seule. Elle reste lue par le lecteur d'écran et atteignable au clavier.
  • Rendre toute la carte cliquable : le summary doit rester le seul déclencheur.
  • Une date limite cachée au verso : qui ne retourne pas la carte passe à côté.

Accessibilité

Rôles et attributs ARIA

La carte ne porte qu'un attribut ARIA, aria-labelledby. Le bouton et la face masquée viennent du HTML et du CSS.

AttributÉlémentDescription
aria-labelledby="card-title"articlePointe vers le titre de la carte : le lecteur d'écran reçoit un article nommé « Quelle est la capitale de l'Australie ? ».
id="card-title"h3La cible d'aria-labelledby. Masqué avec le recto quand la carte est retournée, le titre continue de nommer la carte.
Rôle bouton (implicite)summaryLe navigateur l'expose comme un bouton, avec son état réduit ou développé. VoiceOver l'annonce « triangle d'affichage ». Aucun aria-expanded à ajouter.
opendetailsPosé par le navigateur quand on retourne la carte, retiré quand on la remet sur le recto. Sans open, le verso n'est ni lu ni atteignable.
visibility: hiddendiv class="card__front"Carte retournée, le recto sort de l'arbre d'accessibilité : le lecteur d'écran ne le lit plus.

Navigation au clavier

ToucheAction
TabAtteint le bouton « Voir la réponse »
Entrée ou EspaceRetourne la carte, ou la remet sur le recto. Le focus reste sur le bouton
Tab sur la carte retournéeQuitte la carte : le verso ne contient ni lien ni bouton

Ordre de tabulation

  1. Le bouton « Voir la réponse ». C'est le seul arrêt : le recto et le verso se lisent avec les flèches du lecteur d'écran.

Avec un lecteur d'écran

Exemple sur Chrome avec VoiceOver. Les mots changent d'un lecteur d'écran à l'autre.

ActionAnnonce
Tab sur le bouton« Voir la réponse, réduit, triangle d'affichage »
Entrée« Voir la réponse, développé »
Flèche suivante (VO + →)« Réponse », puis le texte du verso

Critères RGAA concernés

Critère 10.7 : Dans chaque page web, pour chaque élément recevant le focus, la prise de focus est-elle visible ?
Le focus reste visible sur le bouton, quelle que soit la face affichée.
Critère 10.8 : Pour chaque page web, les contenus cachés ont-ils vocation à être ignorés par les technologies d’assistance ?
La face cachée est ignorée par les technologies d'assistance. Le verso devient lisible quand on active le bouton, placé juste avant lui dans le code.

Autres références

Au-delà de l'APG

NouveautéApportNavigateursDans la démo
details nameUne seule carte retournée à la fois, sans script : retourner une carte referme les autres.Chrome 120+, Firefox 130+, Safari 17.2+Variation
::details-contentAnime en CSS l'arrivée du verso, sans @keyframes sur un bloc enfant.Chrome 131+, Firefox 143+, Safari 18.4+Non

Variations

Libellé qui suit la face

« Voir la réponse » devient « Revenir à la question » à l'ouverture, avec 2 span affichés tour à tour en CSS. Plus parlant pour qui voit l'écran, mais le lecteur d'écran annonce alors « Revenir au problème, développé », 2 informations qui se contredisent à l'oreille.

Question

Quelle est la capitale de l'Australie ?

Indice

Ce n'est pas la ville la plus peuplée du pays.

Voir la réponseRevenir à la question

Réponse

Canberra. Sydney et Melbourne voulaient toutes deux le titre : la capitale a été construite entre les deux.

Code
<!-- HTML -->
<summary>
  <span class="when-closed">Voir la réponse</span>
  <span class="when-open">Revenir à la question</span>
</summary>

/* CSS */
.when-open,
details[open] .when-closed {
  display: none;
}

details[open] .when-open {
  display: inline;
}

Une carte ouverte à la fois

Dans une grille de cartes, le même attribut name sur chaque details referme la carte précédente quand on en retourne une autre. Tous les navigateurs le gèrent depuis septembre 2024 (Firefox 130).

Question

Quelle est la capitale de l'Australie ?

Indice

Ce n'est pas la ville la plus peuplée du pays.

Voir la réponse

Réponse

Canberra. Sydney et Melbourne voulaient toutes deux le titre : la capitale a été construite entre les deux.

Question

Combien de cœurs a une pieuvre ?

Indice

Plus d'un.

Voir la réponse

Réponse

Trois : deux envoient le sang vers les branchies, le troisième vers le reste du corps.

Code
<details name="cards">…</details>
<details name="cards">…</details>