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.
Bac à sable
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.
Désactive JavaScript : la carte se retourne toujours.
Question
Indice
Ce n'est pas la ville la plus peuplée du pays.
Réponse
Canberra. Sydney et Melbourne voulaient toutes deux le titre : la capitale a été construite entre les deux.
article Le conteneur de la carte, nommé par son titre.details Garde l'état ouvert ou fermé de la carte.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.details, affiché par-dessus le recto à l'ouverture.<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>/* 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;
}
}
}opacity: 0 ou une rotation seule. Elle reste lue par le lecteur d'écran et atteignable au clavier.summary doit rester le seul déclencheur.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ément | Description |
|---|---|---|
aria-labelledby="card-title" | article | Pointe 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" | h3 | La 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) | summary | Le navigateur l'expose comme un bouton, avec son état réduit ou développé. VoiceOver l'annonce « triangle d'affichage ». Aucun aria-expanded à ajouter. |
open | details | Posé 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: hidden | div class="card__front" | Carte retournée, le recto sort de l'arbre d'accessibilité : le lecteur d'écran ne le lit plus. |
| Touche | Action |
|---|---|
| Tab | Atteint le bouton « Voir la réponse » |
| Entrée ou Espace | Retourne la carte, ou la remet sur le recto. Le focus reste sur le bouton |
| Tab sur la carte retournée | Quitte la carte : le verso ne contient ni lien ni bouton |
Exemple sur Chrome avec VoiceOver. Les mots changent d'un lecteur d'écran à l'autre.
| Action | Annonce |
|---|---|
| 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 |
| Nouveauté | Apport | Navigateurs | Dans la démo |
|---|---|---|---|
details name | Une seule carte retournée à la fois, sans script : retourner une carte referme les autres. | Chrome 120+, Firefox 130+, Safari 17.2+ | Variation |
::details-content | Anime en CSS l'arrivée du verso, sans @keyframes sur un bloc enfant. | Chrome 131+, Firefox 143+, Safari 18.4+ | Non |
« 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
Indice
Ce n'est pas la ville la plus peuplée du pays.
Réponse
Canberra. Sydney et Melbourne voulaient toutes deux le titre : la capitale a été construite entre les deux.
<!-- 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;
}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
Indice
Ce n'est pas la ville la plus peuplée du pays.
Réponse
Canberra. Sydney et Melbourne voulaient toutes deux le titre : la capitale a été construite entre les deux.
Question
Indice
Plus d'un.
Réponse
Trois : deux envoient le sang vers les branchies, le troisième vers le reste du corps.
<details name="cards">…</details>
<details name="cards">…</details>