Files
Site_web/exercices/memory-pictogrammes/assets/css/animations.css
gauthier.chombart 2227aa89d5 Refonte visuelle du jeu Memory Pictogrammes GHS
Corrige les pictogrammes cassés (mauvais noms de fichiers dans
utils.js) et le conflit de classe CSS .progress-bar avec le header
qui cassait la barre de progression du jeu. Réorganise l'interface
dans un panneau de jeu unifié, ajoute des icônes aux statistiques
et au sélecteur de difficulté, et rend le dos des cartes plus ludique.
2026-07-07 16:58:40 +02:00

395 lines
8.3 KiB
CSS

/* ============================================
ANIMATIONS AVANCÉES - Memory Pictogrammes
============================================ */
/* ============================================
FADE ANIMATIONS
============================================ */
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes fadeInDown {
from {
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* ============================================
CARD ANIMATIONS
============================================ */
/* Match Success - Explosion colorée */
@keyframes matchSuccess {
0% {
transform: scale(1);
filter: drop-shadow(0 0 0px rgba(76, 175, 80, 0.6));
}
50% {
transform: scale(1.15) rotate(5deg);
filter: drop-shadow(0 0 12px rgba(76, 175, 80, 0.8));
}
100% {
transform: scale(1);
filter: drop-shadow(0 0 0px rgba(76, 175, 80, 0));
}
}
/* Card Shake - Erreur */
@keyframes cardShake {
0%, 100% {
transform: translateX(0) rotateZ(0deg);
}
10%, 30%, 50%, 70%, 90% {
transform: translateX(-8px) rotateZ(-1deg);
}
20%, 40%, 60%, 80% {
transform: translateX(8px) rotateZ(1deg);
}
}
/* Pop In - Apparition */
@keyframes popIn {
0% {
transform: scale(0.5);
opacity: 0;
}
50% {
transform: scale(1.1);
}
100% {
transform: scale(1);
opacity: 1;
}
}
/* Bounce - Rebond */
@keyframes bounce {
0%, 100% {
transform: translateY(0);
}
50% {
transform: translateY(-12px);
}
}
/* ============================================
PROGRESS BAR ANIMATIONS
============================================ */
/* Pulse Progress Bar */
@keyframes progressPulse {
0%, 100% {
box-shadow: 0 0 8px rgba(29, 158, 117, 0.4);
}
50% {
box-shadow: 0 0 24px rgba(29, 158, 117, 0.8);
}
}
.game-progress-fill.pulse {
animation: progressPulse 0.6s ease-out;
}
/* ============================================
MODAL ANIMATIONS
============================================ */
/* Slide Up */
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(40px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Fade In Modal Background */
@keyframes fadeInBlur {
from {
opacity: 0;
backdrop-filter: blur(0px);
}
to {
opacity: 1;
backdrop-filter: blur(5px);
}
}
/* ============================================
FLOAT ANIMATION (Confettis)
============================================ */
@keyframes float {
0%, 100% {
transform: translateY(0px);
}
50% {
transform: translateY(-12px);
}
}
/* ============================================
SCORE UPDATE ANIMATION
============================================ */
@keyframes scoreFlip {
0% {
transform: rotateX(90deg);
opacity: 0;
}
100% {
transform: rotateX(0deg);
opacity: 1;
}
}
/* ============================================
ACHIEVEMENT UNLOCK ANIMATION
============================================ */
@keyframes achievementUnlock {
0% {
transform: scale(0) rotateZ(-180deg);
opacity: 0;
}
50% {
transform: scale(1.15);
}
100% {
transform: scale(1) rotateZ(0deg);
opacity: 1;
}
}
/* ============================================
STAT BOX ANIMATIONS
============================================ */
@keyframes statUpdate {
0% {
transform: scale(0.8);
background: rgba(29, 158, 117, 0.2);
}
100% {
transform: scale(1);
background: transparent;
}
}
/* ============================================
TIMER ANIMATIONS
============================================ */
@keyframes timerTick {
0% {
transform: scale(1);
}
50% {
transform: scale(1.1);
}
100% {
transform: scale(1);
}
}
/* Timer warning (< 30 seconds) */
@keyframes timerWarning {
0%, 100% {
color: #FF9800;
}
50% {
color: #D85A30;
}
}
/* ============================================
LEADERBOARD ANIMATIONS
============================================ */
/* Rank item slide in */
@keyframes rankSlideIn {
from {
opacity: 0;
transform: translateX(-20px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
.rank-item {
animation: rankSlideIn 0.3s ease-out forwards;
}
.rank-item:nth-child(1) { animation-delay: 0.1s; }
.rank-item:nth-child(2) { animation-delay: 0.2s; }
.rank-item:nth-child(3) { animation-delay: 0.3s; }
.rank-item:nth-child(4) { animation-delay: 0.4s; }
.rank-item:nth-child(5) { animation-delay: 0.5s; }
/* ============================================
GLOW ANIMATIONS
============================================ */
/* Card glow hover */
@keyframes glowCard {
0% {
box-shadow: 0 0 0px rgba(29, 158, 117, 0);
}
100% {
box-shadow: 0 0 16px rgba(29, 158, 117, 0.3);
}
}
/* Victory confetti animation */
@keyframes confetti {
0% {
transform: translateY(-200px) rotateZ(0deg) scale(1);
opacity: 1;
}
100% {
transform: translateY(600px) rotateZ(720deg) scale(0);
opacity: 0;
}
}
/* ============================================
PULSING ANIMATIONS
============================================ */
/* Pulse button */
@keyframes buttonPulse {
0%, 100% {
box-shadow: 0 0 0px rgba(29, 158, 117, 0.7);
}
50% {
box-shadow: 0 0 16px rgba(29, 158, 117, 0.4);
}
}
/* Loading spinner */
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
/* ============================================
FLIP ANIMATION (3D)
============================================ */
@keyframes flip {
0% {
transform: rotateY(0deg);
}
100% {
transform: rotateY(180deg);
}
}
/* ============================================
UTILITY ANIMATION CLASSES
============================================ */
.animate-fade-in {
animation: fadeIn 0.3s ease-out;
}
.animate-slide-up {
animation: slideUp 0.4s ease-out;
}
.animate-pop {
animation: popIn 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.animate-bounce {
animation: bounce 0.6s ease-in-out;
}
.animate-shake {
animation: cardShake 0.4s ease-in-out;
}
.animate-float {
animation: float 1s ease-in-out infinite;
}
/* ============================================
STAGGERED ANIMATIONS (pour listes)
============================================ */
.stagger-children > * {
animation: fadeInUp 0.6s ease-out forwards;
}
.stagger-children > *:nth-child(1) { animation-delay: 0.1s; }
.stagger-children > *:nth-child(2) { animation-delay: 0.2s; }
.stagger-children > *:nth-child(3) { animation-delay: 0.3s; }
.stagger-children > *:nth-child(4) { animation-delay: 0.4s; }
.stagger-children > *:nth-child(5) { animation-delay: 0.5s; }
.stagger-children > *:nth-child(6) { animation-delay: 0.6s; }
/* ============================================
TRANSITIONS (mouvements fluides)
============================================ */
button, a, .stat-box, .rank-item {
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
/* ============================================
DARK MODE ANIMATIONS (optionnel)
============================================ */
@media (prefers-color-scheme: dark) {
@keyframes fadeInDark {
from {
opacity: 0;
filter: brightness(0.8);
}
to {
opacity: 1;
filter: brightness(1);
}
}
main {
animation: fadeInDark 0.6s ease-out;
}
}
/* ============================================
MOTION PREFERENCE RESPECT
============================================ */
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}