Redimensionnement en drag'n drop

Résumé Support

Dans ce tutoriel je vous propose de découvrir comment créer un système de redimensionnement en JavaScript. L'objectif est de permettre à l'utilisateur de redimensionner la sidebar.

Le style

Pour notre structure nous allons utiliser une grille avec une variable CSS pour piloter la largeur de la sidebar.

<style> body, html { --sidebar: 300px; } .layout { display: grid; grid-template-columns: var(--sidebar) 1fr; } </style> <div class="layout"> <aside class="sidebar"> <!-- Cet élément servira --> <div class="resizer"></div> </aside> <main class="main"> <!-- Le contenu ici --> </main> </div>

Pour contrôler la sidebar, on va créer un élément qui servira de zone sélectionnable (on rendra cette zone volontairement plus large afin de faciliter la sélection)

.resizer { position: absolute; top: 0; right: -10px; height: 100%; width: 20px; cursor: ew-resize; touch-action: none; }

On utilisera ensuite les pseudos élément pour définir l'aspect visuel de notre curseur de redimensionnement.

.resizer::after { content: ""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: coral; transform: scale(0); opacity: 0; transition: 0.3s; } .resizer:hover::after { opacity: 1; transform: scaleX(0.2); }

Souris & Doigts

Afin de gérer, les différents périphériques nous allons utiliser les évènements de type PointerEvent qui offre une API commune à tous les dispositifs de pointage.

// Lorsque l'on clique sur l'élément element.addEventListener("pointerdown", onPointerDown); /** * On commence à écouter le déplacement du curseur * * @param {PointerEvent} e **/ function onPointerDown(e) { e.preventDefault(); document.addEventListener("pointermove", onPointerMove); document.addEventListener("pointerup", onPointerUp, { once: true }); } /** * Au déplacement du curseur, on met à jour la largeur de la sidebar * * @param {PointerEvent} e **/ function onPointerMove(e) { e.preventDefault(); const sidebarWidth = e.pageX + "px"; document.body.style.setProperty("--sidebar", sidebarWidth); } /** * Lorsque le curseur est relaché, on arrête de suivre le déplacement du curseur * * @param {PointerEvent} e **/ function onPointerUp(e) { document.removeEventListener("pointermove", onPointerMove); }

Limiter la largeur

Pour limiter la largeur de la sidebar on va se reposer sur le CSS et la fonction CSS [clamp](https://developer.mozilla.org/en-US/docs/Web/CSS/clamp()) qui permettra en prime de prendre en compte la taille de l'écran.

.layout { --sidebarClamped: clamp(300px, var(--sidebar), 50vw); grid-template-columns: var(--sidebarClamped) 1fr; }