Ce qui est inclus
Un carrousel d’images posées sur la jante d’une roue géante, dans deux fichiers : une feuille de style et un script. Aucune dépendance, aucune étape de build, aucune requête externe — polices et images sont dans le dossier du composant.
La carte du haut grandit, se soulève et prend la parole ; les
autres s’inclinent, rapetissent et s’effacent à mesure qu’elles
descendent l’arc. Tout cela dérive d’un seul nombre,
--wcar-index, qui vaut la carte sélectionnée. Comme
ce nombre est déclaré avec @property, l’animer d’une
carte à la suivante fait tourner la roue entière, redimensionne,
réordonne les plans et déplace le texte — d’un seul mouvement,
puisque tout en descend.
Fonctionnalités
-
Marche sans JavaScript — chaque carte est le
<label>d’un bouton radio. Cliquer une carte la sélectionne, les flèches du clavier parcourent le groupe, et la roue tourne : c’est le CSS qui lit la sélection avec:has(). - Clavier complet — le groupe de boutons radio apporte son parcours natif ; l’anneau de focus est peint sur la carte, pas sur le contrôle. Le focus suit les flèches de navigation quand la légende change.
- Tirer, faire tourner, relâcher — la roue se saisit partout : sur le fond, sur une carte, sur le texte. Au-delà de cinq pixels la pression devient un glissement ; en deçà, elle reste un clic qui sélectionne. La roue se pose ensuite sur la carte la plus proche avec la courbe d’un ressort, échantillonnée sur l’original.
- Le compte se lit dans le balisage — deux cartes ou douze, l’arc se répartit tout seul. Rien à déclarer, rien à recalculer.
-
Une variable pour l’échelle — rayon, cartes,
texte, points et soulèvement dérivent de
--wcar-font-size; l’arc, lui, continue de suivre la largeur de son conteneur. - Ruptures sur le conteneur — l’arc s’ouvre moins et les cartes prennent plus de place dans une colonne étroite, même si la fenêtre, elle, est large.
Le poser dans une page
Deux fichiers à charger, puis une carte par image :
<link rel="stylesheet" href="arc-carousel.css">
<script src="arc-carousel.js" defer></script>
<section class="arc-carousel" data-arc-carousel aria-label="Ambiances">
<div class="arc-carousel__stage">
<div class="arc-carousel__halo"></div>
<div class="arc-carousel__track" role="radiogroup"
aria-label="Choisir une image">
<div class="arc-carousel__item">
<label class="arc-carousel__card">
<input class="arc-carousel__radio" type="radio"
name="roue" checked>
<img class="arc-carousel__image" src="medias/salon.webp" alt="">
<span class="arc-carousel__veil"></span>
<span class="arc-carousel__name">Minimalisme doux</span>
</label>
<div class="arc-carousel__caption">
<div class="arc-carousel__panel">
<div class="arc-carousel__headline">
<button class="arc-carousel__arrow" type="button"
data-wcar-prev aria-label="Précédente">…</button>
<p class="arc-carousel__title">Minimalisme doux</p>
<button class="arc-carousel__arrow" type="button"
data-wcar-next aria-label="Image suivante">…</button>
</div>
<p class="arc-carousel__text">Des espaces réduits et choisis.</p>
<a class="arc-carousel__cta" href="#">Explorer</a>
</div>
</div>
</div>
<!-- … les autres cartes … -->
</div>
<div class="arc-carousel__dots" aria-hidden="true">
<span class="arc-carousel__dot"></span>
</div>
<span class="arc-carousel__probe" aria-hidden="true"></span>
<p class="arc-carousel__status" role="status" aria-live="polite"></p>
</div>
</section>
Un seul checked dans le groupe, un name
différent par carrousel de la page, et c’est tout : le composant
compte les cartes lui-même.
Ce qu’il faut savoir
-
La roue occupe la hauteur qu’on lui donne.
Par défaut
100svh; la position du bloc de texte se calcule avec cette hauteur, donc la changer déplace le texte, jamais l’arc. C’est--wcar-height. -
La moitié de la roue est hors du cadre. C’est le
dessin : les cartes des extrémités sortent par les côtés. Le
cadre est en
overflow: clip— il ne peut donc pas défiler, et un focus reçu par une carte hors champ ne décale pas la mise en page. - Sans script, les deux flèches disparaissent. Elles demanderaient « la carte d’après », ce qu’une feuille de style ne sait pas exprimer. Tout le reste — sélection au clic, parcours au clavier, rotation, légendes — continue de fonctionner.
-
Aucun style ni script en ligne. Le composant
respecte la politique de sécurité stricte du site, et n’utilise
jamais
innerHTML. Le script écrit sa position parstyle.setProperty(), que la politique autorise. - Le dessin vient d’ailleurs. Les proportions reprennent celles d’un composant Framer publié, relevées au navigateur sur le site en ligne à cinq largeurs. Le code, lui, est original : l’original est un carrousel React qui recalcule dix positions à chaque image, celui-ci est une feuille de style qui dérive tout d’un nombre.
Prends-le, ouvre-le, casse-le.
Ce composant est gratuit. La bibliothèque complète — les templates et les autres composants — est incluse dans l’abonnement, avec la formation.
Accès immédiat · Sans engagement · Annulation en 1 clic