Conjugaison · CE2
Le dé des pronoms
Conjugue finir au présent avec le pronom de la face avant.
Ta réponse :
Tourne le dé avec la souris, le doigt ou les flèches.
Un cube CSS de 100 px aux six faces translucides colorées et étiquetées, posé de trois quarts, qui se tourne vers le pointeur dès qu'il entre dans sa zone, puis revient à sa pose à la sortie. Il s'oriente aussi au doigt et aux flèches du clavier ; les faces cachées se devinent à travers les autres. 1,8 Ko de JavaScript, un cube par copie, et plus d'inclinaison qui suit le pointeur si l'utilisateur réduit les animations.
Mis à jour le
Cet effet est gratuit — la catégorie 3D en contient 50 au total, dont 8 gratuits. Effect.Labs regroupe 840 effets vanilla. Découvrir la catégorie →
Conjugaison · CE2
Conjugue finir au présent avec le pronom de la face avant.
Ta réponse :
Tourne le dé avec la souris, le doigt ou les flèches.
Déménagement n° 2027-118 · camion 2
Atelier de taille · lexique
Lit de pose : la face posée sur le mortier.Lit d'attente : reçoit la pierre du dessus.Parement : celle qu'on voit sur le mur.
La racine .fx-0001-root fait 250 px de haut, fond rgb(26, 26, 36). Elle centre .cube-container, un carré de 100 px qui sert à la fois de caméra (perspective: 600px) et de zone d'écoute du pointeur. Dedans, .cube garde ses six faces en 3D (transform-style: preserve-3d) et repose en rotateX(-20deg) rotateY(-30deg) : de trois quarts, on voit la face avant, la face droite et le dessus. Chaque .cube-face de 100 px est repoussée de 50 px dans sa direction (translateZ(50px) après une rotation de 90 ou 180°) et a sa couleur à 80 % : indigo devant, violet derrière, magenta à droite, cyan à gauche, vert dessus, rose dessous. L'envers reste visible : à travers les faces de devant, on lit en miroir celles de derrière.
Le script cherche chaque .fx-0001-root de la page et donne à chacun son propre cube. Sur pointermove et pointerdown (souris, doigt ou stylet), il mesure l'écart du pointeur au centre de la zone et en tire deux angles : rotateX(-y / 5) et rotateY(x / 5). Le cube se tourne donc vers le pointeur, d'un degré tous les 5 px : ±10° au plus dans la zone de 100 px, ±36° si vous agrandissez la zone à 360 px comme dans les exemples. La transition de 0,1 s (ease-out) adoucit les mouvements, et le saut d'entrée : en arrivant dans une petite zone, le cube passe de sa pose de trois quarts à un angle proche de la face. Sur pointerleave, il revient de trois quarts. La zone porte touch-action: none : sur un écran tactile, glisser le doigt dessus oriente le cube au lieu de faire défiler la page, puis il revient en place quand le doigt se lève.
Au clavier, la zone est atteignable par Tab (tabindex="0", contour de 2 px #a5b4fc et arêtes éclaircies au focus) : les flèches tournent le cube par crans de 15°, sans limite, donc toutes les faces sont accessibles ; Échap ou la perte du focus le remettent de trois quarts. Mesuré dans Chromium 151 et Firefox 153 : pointeur à 40 px à droite et 30 px au-dessus du centre → rotateX(6deg) rotateY(8deg) ; droite, droite, haut → rotateX(-5deg) rotateY(0deg) ; glisser du doigt (Chromium, évènements tactiles) → le cube suit, page immobile ; deux copies sur une page → seule celle qu'on survole bouge ; 0 erreur. Le WebKit de Playwright aplatit toute 3D CSS : le rendu sur un vrai Safari n'a pas été vérifié.
prefers-reduced-motion: reduce, le script ne fait plus suivre le pointeur et le CSS retire la transition (bloc limité à .fx-0001-root) : le cube reste de trois quarts quand on le survole. Les flèches du clavier le tournent toujours, à la demande et par crans, sans animation. Mesuré dans Chromium et Firefox : le cube garde sa pose quand le pointeur passe dessus, et 0 % des pixels changent en 0,8 s.aria-label) annonce l'usage des flèches : réécrivez-le dans la langue de votre page, comme dans les exemples.touch-action: none sur une zone de 100 px n'empêche pas de faire défiler la page ailleurs. Si vous agrandissez beaucoup la zone, passez-la en touch-action: pan-y (comme dans les exemples) : le défilement vertical reste possible et le glissé horizontal tourne le cube.CSS (transform 3D, preserve-3d, perspective, touch-action) + 1,8 Ko de JavaScript (évènements pointer, keydown, matchMedia), aucune dépendance. Mesuré dans Chromium 151 et Firefox 153 : même cube (0,57 % d'écart sur l'image fixe), orientation à la souris et au clavier, deux copies indépendantes, 0 erreur ; glissé du doigt mesuré dans Chromium. Le WebKit de Playwright 26.5 aplatit toute 3D CSS : le vrai Safari n'a pas été vérifié.
Sans JavaScript, le cube reste immobile dans sa pose de trois quarts, ses trois faces visibles. Sans preserve-3d, les six faces s'empilent à plat et seule la dernière (le dessous, rose) reste lisible.
Copiez les trois blocs dans votre page. Aucune dépendance.
<div class="fx-0001-root">
<div class="demo-3d">
<div class="cube-container" tabindex="0" role="group" aria-label="3D cube: point at it, or use the arrow keys">
<div class="cube">
<div class="cube-face front">Front</div>
<div class="cube-face back">Back</div>
<div class="cube-face right">Right</div>
<div class="cube-face left">Left</div>
<div class="cube-face top">Top</div>
<div class="cube-face bottom">Bottom</div>
</div>
</div>
</div>
</div>
.fx-0001-root,
.fx-0001-root *,
.fx-0001-root *::before,
.fx-0001-root *::after {
box-sizing: border-box
}
.fx-0001-root {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 250px;
overflow: hidden;
position: relative;
background: rgb(26, 26, 36);
color: rgb(255, 255, 255);
font-family: sans-serif;
}
.demo-3d {
width: 280px;
height: 200px;
display: flex;
align-items: center;
justify-content: center;
position: relative;
}
.cube-container {
width: 100px;
height: 100px;
perspective: 600px;
/* Le doigt oriente le cube au lieu de faire défiler la page (zone de 100 px). */
touch-action: none;
outline: none;
}
.cube-container:focus-visible {
outline: 2px solid #a5b4fc;
outline-offset: 22px;
border-radius: 6px;
}
.cube-container:focus-visible .cube-face {
border-color: rgba(255, 255, 255, 0.9);
}
.cube {
width: 100%;
height: 100%;
position: relative;
transform-style: preserve-3d;
transform: rotateX(-20deg) rotateY(-30deg);
transition: transform 0.1s ease-out;
}
.cube-face {
position: absolute;
width: 100px;
height: 100px;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
font-size: 14px;
border: 2px solid rgba(255, 255, 255, 0.3);
backface-visibility: visible;
}
.cube-face.front {
background: rgba(99, 102, 241, 0.8);
transform: translateZ(50px);
}
.cube-face.back {
background: rgba(139, 92, 246, 0.8);
transform: rotateY(180deg) translateZ(50px);
}
.cube-face.right {
background: rgba(217, 70, 239, 0.8);
transform: rotateY(90deg) translateZ(50px);
}
.cube-face.left {
background: rgba(6, 182, 212, 0.8);
transform: rotateY(-90deg) translateZ(50px);
}
.cube-face.top {
background: rgba(16, 185, 129, 0.8);
transform: rotateX(90deg) translateZ(50px);
}
.cube-face.bottom {
background: rgba(244, 63, 94, 0.8);
transform: rotateX(-90deg) translateZ(50px);
}
/* Mouvement réduit : le cube ne suit plus le pointeur et reste de trois quarts ;
les flèches du clavier le tournent encore, par crans de 15°, sans transition. */
@media (prefers-reduced-motion: reduce) {
.fx-0001-root .cube { transition: none }
}
(function() {
// Rotating Cube : le cube se tourne vers le pointeur (souris ou doigt) et revient de trois quarts à la sortie.
// Au clavier (Tab), les flèches le tournent par crans de 15° ; Échap le remet de trois quarts.
// Un cube par .fx-0001-root : plusieurs copies peuvent vivre sur la même page.
var reduce = window.matchMedia('(prefers-reduced-motion: reduce)');
var REST_X = -20, REST_Y = -30;
document.querySelectorAll('.fx-0001-root').forEach(function(root) {
var cube = root.querySelector('.cube');
var zone = root.querySelector('.cube-container');
if (!cube || !zone) return;
var keyX = REST_X, keyY = REST_Y;
function turn(x, y) {
cube.style.transform = 'rotateX(' + x + 'deg) rotateY(' + y + 'deg)';
}
function rest() {
keyX = REST_X;
keyY = REST_Y;
turn(REST_X, REST_Y);
}
function follow(e) {
if (reduce.matches) return; // mouvement réduit : pas d'inclinaison qui suit le pointeur
var rect = zone.getBoundingClientRect();
var x = e.clientX - rect.left - rect.width / 2;
var y = e.clientY - rect.top - rect.height / 2;
turn(-y / 5, x / 5);
}
zone.addEventListener('pointermove', follow);
zone.addEventListener('pointerdown', follow);
zone.addEventListener('pointerleave', rest);
zone.addEventListener('keydown', function(e) {
if (e.key === 'Escape') { rest(); return; }
var step = { ArrowUp: [15, 0], ArrowDown: [-15, 0], ArrowLeft: [0, -15], ArrowRight: [0, 15] }[e.key];
if (!step) return;
e.preventDefault(); // les flèches tournent le cube, elles ne font pas défiler la page
keyX += step[0];
keyY += step[1];
turn(keyX, keyY);
});
zone.addEventListener('blur', rest);
});
})();
Options passées à l'API ou attributs data-* :
| Option / propriété | Défaut | Effet |
|---|---|---|
Taille de la zone d'écoute (CSS — width / height de .cube-container) |
100 px, la taille du cube | L'inclinaison vaut l'écart au centre divisé par 5 : une zone de 100 px donne ±10°, une zone de 300 px ±30°. Pour agrandir la zone sans grossir le cube, centrez .cube dedans (display: flex, et une taille fixe pour .cube), comme dans les exemples. |
Sensibilité (JS — -y / 5 et x / 5 dans follow) |
1° tous les 5 px | / 3 rend le cube plus vif (±17° dans 100 px) ; / 8 plus posé. Pour borner l'angle, entourez-le de Math.max(-30, Math.min(30, …)). |
Pose de repos (JS — REST_X, REST_Y ; CSS — transform de .cube) |
-20°, -30° | Changez les deux ensemble : le CSS donne la pose avant le script, le script celle du retour. -35 / 45 montre davantage le dessus ; 0 / 0 présente la face avant à plat. |
Pas du clavier (JS — les 15 de la table step) |
15° par appui | 90 fait passer d'une face à la suivante à chaque appui, pratique pour un dé à lire face par face. |
Taille du cube (CSS — 100px des faces, translateZ(50px)) |
100 px | Le recul vaut la moitié du côté : 120 px de côté, translateZ(60px) dans les six règles de faces. |
Faces (HTML et CSS — texte et background de chaque .cube-face) |
six couleurs à 80 %, étiquettes Front à Bottom | Sous 0,6 d'opacité, la face opposée se lit nettement à travers ; à 1, le cube devient plein et les faces cachées disparaissent. |
Parce que la zone qui écoute le pointeur ne fait que 100 px, la taille du cube : à 1° tous les 5 px, l'inclinaison ne dépasse pas 10°. Agrandissez .cube-container (et centrez-y le cube) pour un mouvement plus ample, comme dans les trois exemples, ou divisez par un nombre plus petit dans le script.
Oui. Le script parcourt tous les .fx-0001-root de la page et donne à chacun sa zone, son cube et son état clavier ; il ne s'appuie sur aucun id. Mesuré avec deux copies : seule celle qu'on survole bouge.
Cube Auto-Rotation tourne seul, sans fin, avec six faces de la même couleur : un objet en suspension. Rotating Cube ne bouge que quand on l'oriente, avec des faces de couleurs et de noms différents : un objet qu'on manipule pour en lire chaque côté.