De quels petits utilitaires CSS et JavaScript un site moderne a-t-il besoin ?

Les utilitaires sont de petites briques réutilisables pour les besoins courants : barre de progression de lecture, bouton de retour en haut, sélecteur de thème, copie dans le presse-papiers, boutons de partage et de notation, comptes à rebours. Ils côtoient sur cette page des techniques responsives modernes : container queries, formes fluides et bordures en dégradé animées grâce à @property.

Comment choisir, performances et accessibilité
  • Ajoutez Scroll Progress Bar aux articles longs, Back to Top aux pages longues, un Theme Toggle qui mémorise le choix et suit prefers-color-scheme, et Copy to Clipboard à côté d'un extrait de code ou d'un code promo.
  • Utilisez la Clipboard API plutôt que execCommand, désormais obsolète, donnez un nom accessible aux boutons qui n'affichent qu'une icône et limitez la fréquence des gestionnaires de scroll et de redimensionnement.
  • Scroll Progress Bar, Adaptive Card et Gradient Border Spin sont gratuits avec leur code complet ; les autres utilitaires sont inclus dans Premium.

Faites defiler ce contenu pour voir la barre de progression en action. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit.

Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem.

Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.

Scroll Progress Bar

Indicateur de progression de lecture avec gradient animé en haut du contenu.

JS Scroll Progress
Voir le code source
HTML
<div class="demo-preview">
  <div class="scroll-progress-container">
    <div class="scroll-progress-bar" id="scrollProgressBar"></div>
    <div class="scroll-progress-content" id="scrollContent">
      <p>Faites defiler ce contenu pour voir la barre de progression en action. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
      <p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit.</p>
      <p>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde omnis iste natus error sit voluptatem.</p>
      <p>Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.</p>
    </div>
  </div>
</div>
CSS
.demo-preview,
.demo-preview *,
.demo-preview *::before,
.demo-preview *::after {
  box-sizing: border-box
}

.demo-preview {
  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;
}

.scroll-progress-container {
  width: 100%;
  height: 100px;
  background: #1a1a2e;
  border-radius: 12px;
  position: relative;
  overflow: hidden;
}

.scroll-progress-bar {
  position: absolute;
  top: 0;
  left: 0;
  height: 4px;
  width: 0%;
  background: linear-gradient(90deg, #6366f1, #8b5cf6, #d946ef);
  transition: width 0.1s ease-out;
}

.scroll-progress-content {
  padding: 20px;
  height: 100%;
  overflow-y: auto;
  color: rgba(255, 255, 255, 0.7);
  font-size: 0.85rem;
  line-height: 1.6;
}
JavaScript
(function() {
  const scrollProgressBar = document.getElementById('scrollProgressBar');

  if (scrollContent && scrollProgressBar) {
    scrollContent.addEventListener('scroll', function() {
      const scrollTop = scrollContent.scrollTop;
      const scrollHeight = scrollContent.scrollHeight - scrollContent.clientHeight;
      const progress = (scrollTop / scrollHeight) * 100;
      scrollProgressBar.style.width = progress + '%';
    });
  }
})();

Back to Top Button

Bouton animé qui apparait au scroll avec effet de rebond.

CSS Animation Scroll

Theme Toggle

Interrupteur de theme avec animation fluide soleil/lune.

CSS Toggle Transition

Countdown Timer

Compte a rebours style flip-clock avec animation de retournement.

JS Animation Timer

Copy to Clipboard

Bouton de copie avec confirmation animée et feedback visuel.

JS Click Feedback

Share Buttons

Boutons de partage social avec effets de survol et tooltips.

CSS Hover Social

Rating Stars

Système de notation avec étoiles animées et effet de remplissage.

JS Interactive Rating

Like / Heart Button

Bouton coeur avec animation de battement et explosion de particules.

JS Click Particles

Bookmark Toggle

Icône de signet avec animation de sauvegarde élastique.

CSS Toggle Animation

Notification Badge

Badge de notification avec animations pulse, bounce et shake.

JS Animation Badge

Carte Adaptive

Le layout passe de colonne à rangée selon la largeur du conteneur.

@container CSS

Adaptive Card

Carte qui passe d'un layout vertical à horizontal via @container query quand le conteneur dépasse 280px.

CSS @container Layout
Voir le code source
HTML
<div class="demo-preview">
  <div class="cq-adaptive-wrap">
    <div class="cq-adaptive-card">
      <div class="cq-adaptive-img"></div>
      <div class="cq-adaptive-body">
        <h4>Carte Adaptive</h4>
        <p>Le layout passe de colonne à rangée selon la largeur du conteneur.</p>
        <div class="cq-adaptive-tags">
          <span class="cq-adaptive-tag">@container</span>
          <span class="cq-adaptive-tag">CSS</span>
        </div>
      </div>
    </div>
  </div>
</div>
CSS
.demo-preview,
.demo-preview *,
.demo-preview *::before,
.demo-preview *::after {
  box-sizing: border-box
}

.demo-preview {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 280px;
  overflow: hidden;
  position: relative;
  background: rgb(10, 10, 15);
  color: rgb(255, 255, 255);
  font-family: sans-serif;
}

.demo-preview:has(.cq-resizable),
.demo-preview:has(.cq-adaptive-wrap) {
  min-height: 280px;
  background: #0a0a0f;
}

.cq-adaptive-wrap {
  container-type: inline-size;
  container-name: adaptive;
  width: 100%;
  max-width: 340px;
  resize: horizontal;
  overflow: hidden;
  min-width: 160px;
  border: 1px dashed rgba(139, 92, 246, 0.3);
  border-radius: 16px;
  position: relative;
}

.cq-adaptive-wrap::after {
  content: '⟷ Redimensionnez';
  position: absolute;
  bottom: 4px;
  right: 10px;
  font-size: 0.6rem;
  color: rgba(139, 92, 246, 0.4);
  pointer-events: none;
  z-index: 2;
}

.cq-adaptive-card {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 16px;
  background: rgba(255, 255, 255, 0.04);
  border-radius: 14px;
  transition: all 0.3s ease;
}

.cq-adaptive-img {
  width: 100%;
  height: 80px;
  border-radius: 10px;
  background: linear-gradient(135deg, #8b5cf6, #ec4899);
  flex-shrink: 0;
  transition: all 0.3s ease;
}

.cq-adaptive-body h4 {
  font-size: 0.85rem;
  font-weight: 700;
  color: #fff;
  margin: 0 0 4px;
}

.cq-adaptive-body p {
  font-size: 0.72rem;
  color: rgba(255, 255, 255, 0.5);
  margin: 0;
  line-height: 1.5;
}

.cq-adaptive-tags {
  display: flex;
  gap: 6px;
  flex-wrap: wrap;
}

.cq-adaptive-tag {
  padding: 3px 8px;
  border-radius: 6px;
  background: rgba(139, 92, 246, 0.15);
  font-size: 0.6rem;
  font-weight: 600;
  color: #a78bfa;
}
JavaScript
/* CSS pur — aucun JavaScript requis */

Responsive Nav

Navigation qui affiche seulement les icônes en petit, puis ajoute les labels quand le conteneur s'élargit.

CSS @container Nav

Fluid Typography

Tailles de texte qui s'adaptent en 3 paliers via @container à 260px et 320px. Bouton inclus.

CSS @container Typography

Dashboard Widget

Widget analytics avec stats en grille adaptative (1→2→4 colonnes) et graphique qui apparaît à 300px.

CSS @container Dashboard

Product Card

Carte produit e-commerce qui passe en layout horizontal et révèle la description et le bouton secondaire.

CSS @container E-commerce

Stats Panel

Panneau de statistiques passant de 1 à 2 colonnes avec indicateurs de tendance qui apparaissent.

CSS @container Stats

Media Card

Carte vidéo qui passe en mode horizontal avec description étendue quand le conteneur dépasse 280px.

CSS @container Media

Sidebar Toggle

Sidebar qui affiche les labels via @container quand elle s'étend. Le contenu principal s'adapte aussi.

CSS @container Sidebar

Form Adapt

Formulaire dont les champs passent d'empilés à côte-à-côte quand le conteneur dépasse 280px.

CSS @container Form

Grid Morph

Grille qui passe de 1 à 2 puis 3 colonnes avec la première cellule qui prend 2 colonnes au palier max.

CSS @container Grid

Container Query Cards

La carte change de layout (vertical, horizontal, minimal) selon la largeur du conteneur avec @container queries.

CSS @container Layout

Shape-Responsive Hero

Le clip-path du hero passe de diagonal a courbe puis hexagonal selon la largeur du conteneur.

CSS clip-path @container

Adaptive Navigation

La navigation se transforme : hamburger, tabs inline, puis sidebar selon la taille du conteneur.

CSS @container Navigation

Fluid Grid Morph

Les items de la grille passent smoothly de 1 à 2 puis 3 colonnes au redimensionnement avec transitions CSS.

CSS Grid @container

Container Query Typography

La typographie adapte sa taille, son poids et son espacement selon les dimensions du conteneur via @container.

CSS @container Typography

Breakpoint Morphing Cards

Les éléments de la carte (image, texte, boutons) se réorganisent physiquement aux breakpoints du conteneur.

CSS @container Morph

Responsive Chart

Le graphique passe d'une sparkline simple à un bar chart détaillé avec labels selon l'espace disponible.

CSS @container Data Viz

Sidebar Collapse

La sidebar passe de icônes seules à une navigation complète avec labels selon la largeur du conteneur.

CSS @container Sidebar

Responsive Pricing Table

Les cartes de pricing passent d'un empilement vertical à côte à côte avec transitions animées.

CSS @container Pricing

Dynamic Aspect Ratio

Le conteneur media change d'aspect ratio (1:1, 4:3, 16:9, 21:9) selon la largeur via @container.

CSS @container Aspect Ratio
Gradient Spin

Gradient Border Spin

Bordure en conic-gradient tournant utilisant @property pour animer l'angle. L'effet viral du spinning border.

CSS @property Gradient
Voir le code source
HTML
<div class="demo-preview">
  <div class="border-box border-gradient-spin">
    Gradient Spin
  </div>
</div>
CSS
.demo-preview,
.demo-preview *,
.demo-preview *::before,
.demo-preview *::after {
  box-sizing: border-box
}

.demo-preview {
  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;
}

@property --spin-angle {
  syntax: '<angle>';
  initial-value: 0deg;
  inherits: false;
}

.border-box {
  width: 200px;
  height: 120px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 0.95rem;
  font-weight: 600;
  color: white;
  border-radius: 12px;
  position: relative;
  cursor: pointer;
  font-family: inherit;
  user-select: none;
}

.border-gradient-spin {
  background: #0a0a0f;
  z-index: 1;
}

.border-gradient-spin::before {
  content: '';
  position: absolute;
  inset: -3px;
  border-radius: 15px;
  background: conic-gradient(from var(--spin-angle), #ff0080, #ff8c00, #40e0d0, #7b2ff7, #ff0080);
  z-index: -2;
  animation: spinGradient 3s linear infinite;
}

.border-gradient-spin::after {
  content: '';
  position: absolute;
  inset: 3px;
  background: #0a0a0f;
  border-radius: 9px;
  z-index: -1;
}

.border-gradient-spin:hover::before {
  animation-duration: 1s;
  filter: blur(4px);
}

@keyframes spinGradient {
  to {
    --spin-angle: 360deg;
  }
}
JavaScript
/* CSS pur — aucun JavaScript requis */

Dashed Border March

Bordure en pointillés dont les tirets défilent en continu via stroke-dashoffset animé.

SVG Animation Dash

Neon Border Pulse

Bordure néon qui pulse avec une lueur alternant d'intensité via box-shadow animé.

CSS Neon Glow

Border Draw-On

La bordure se dessine depuis un coin et trace tout le périmètre avec 4 pseudo-éléments animés séquentiellement.

CSS Hover Sequential

Double Line Border

Deux bordures concentriques animées tournant en sens opposés avec des couleurs distinctes.

CSS @property Multi-layer

Lightning Border

Effet électrique/foudre utilisant un filtre SVG feTurbulence avec seed animé pour un rendu organique.

SVG Filter Electric

Gradient Border Morph

Bordure en dégradé qui mute fluidement vers un nouveau jeu de couleurs au hover.

CSS Hover Gradient

Corner Accent Borders

Seuls les coins sont bordés, avec des accents colorés qui s'allongent au survol.

CSS Hover Corners

Border Ripple

Au clic, une impulsion lumineuse parcourt le périmètre de la bordure avec des ondes qui se propagent.

JS Click Ripple

Dotted Constellation Border

Points le long de la bordure reliés par des lignes animées formant une constellation au survol.

SVG JS Interactive

CSS Anchor Tooltip Pro

Tooltips ancrés nativement à n'importe quel élément avec anchor-name / position-anchor, avec auto-flip. Affichage 100% CSS via :has(). Fallback absolute automatique.

Anchor PositioningCSS modernePremium

Hypno Cascade

Cascade hypnotique de 24 pétales déphasés par sibling-index() — zéro JavaScript, zéro donnée dans le HTML. Teintes OKLCH calculées par index, repli var(--i) universel.

💡 Idéal pour : écrans d'attente, génération IA, hero décoratif, indicateurs de traitement.

CSS sibling-index Zero-JS Premium

Ruled Grid

Règles de gouttière natives (gap décorations) : séparateurs stylisés qui vivent dans les espacements de la grille, sans divs ni pseudo-éléments. Compteurs animés, repli dégradés.

💡 Idéal pour : dashboards, grilles de stats, tableaux éditoriaux, pages pricing.

CSS Gap Decorations Dashboard Premium

Flash Sale Countdown

Compte à rebours flip-clock avec barre d'urgence qui se vide, pensé pour les ventes flash. Durée et libellés personnalisables ; se branche sur une vraie date de fin.

💡 Idéal pour : vente flash, Black Friday, lancement, offre limitée, bannière promo, pop-up d'urgence.

Vanilla JS Flip-clock Urgence Premium

Questions fréquentes

Comment activer le smooth scroll en CSS ? +

Ajoutez html { scroll-behavior: smooth } à votre CSS. Tous les liens ancres (#section) animeront le scroll automatiquement. Pour un contrôle plus fin, utilisez element.scrollIntoView({ behavior: 'smooth' }) en JavaScript.

Comment copier du texte dans le presse-papier en JavaScript ? +

Utilisez navigator.clipboard.writeText(text). C'est l'API moderne, asynchrone et sécurisée. Fonctionne uniquement en HTTPS. En fallback, créez un textarea temporaire, sélectionnez son contenu, et exécutez document.execCommand('copy').

Comment créer un dark mode toggle ? +

Ajoutez une classe (theme-light) sur body qui inverse les couleurs via CSS custom properties. Sauvegardez la préférence dans localStorage. Au chargement, lisez localStorage et appliquez la classe avant le rendu pour éviter le flash.

Comment détecter si un élément est visible à l'écran ? +

Utilisez IntersectionObserver. Créez un observer avec le threshold souhaite (0.1 = 10% visible, 1 = 100%). Observez l'élément. Le callback est appelé quand la visibilité change. Plus performant qu'un listener scroll.

Comment debouncer une fonction en JavaScript ? +

Créez une fonction wrapper qui annule le timer précédent et en crée un nouveau : function debounce(fn, delay) { let timer; return (...args) => { clearTimeout(timer); timer = setTimeout(() => fn(...args), delay); }; }. Utilisez pour search, resize, scroll.

Catégories similaires