Tu galères à comprendre pourquoi tes éléments flex se réduisent de manière bizarre ? Tu veux savoir comment contrôler précisément la réduction de tes éléments quand l'espace manque ? Tu es au bon endroit !
Dans cet article, on va plonger dans flex-shrink, la propriété CSS qui gère la réduction des éléments flex. Je vais t'expliquer son fonctionnement avec des exemples concrets et interactifs.
C'est quoi flex-shrink ?
flex-shrink est comme le petit frère opposé de flex-grow. Alors que flex-grow définit comment les éléments grandissent, flex-shrink définit comment ils rétrécissent quand il n'y a pas assez d'espace.
La valeur par défaut est 1, ce qui signifie que tous les éléments vont rétrécir de manière égale. Plus la valeur est élevée, plus l'élément va rétrécir rapidement.
Le concept de réduction
Imagine que tu as trois boîtes dans un conteneur. Quand l'espace est suffisant, tout va bien. Mais que se passe-t-il quand l'espace se réduit ?
La boîte rouge est plus large (300px) et a un flex-shrink plus élevé (3)
La boîte bleue est plus petite (150px) avec un flex-shrink normal (1)
Quand l'espace manque :
La boîte rouge rétrécit plus vite car elle a un flex-shrink plus élevé
Elle rétrécit encore plus car sa taille de base est plus grande
Le piège commun avec flex-shrink
L'erreur la plus courante est de penser que flex-shrink: 0 est mauvais. En fait, c'est super utile ! Ça permet d'empêcher un élément de rétrécir.
Regarde cet exemple de navbar avec des boutons qui ne doivent pas rétrécir :
<style>
.navbar {display:flex;background:#1e293b;padding:1rem;gap:1rem;align-items:center;width:100%;}
.logo {background:rgba(239,68,68,0.5);padding:0.5rem1rem;border-radius:0.375rem;flex-shrink:0;}
.menu {display:flex;gap:1rem;flex-grow:1;flex-shrink:1;justify-content:center;min-width:0;}
.menu-item {color:white;text-decoration:none;white-space:nowrap;}
.actions {display:flex;gap:0.5rem;flex-shrink:0;}
.button {background:rgba(59,130,246,0.5);padding:0.5rem1rem;border-radius:0.375rem;color:white;text-decoration:none;white-space:nowrap;}</style><navclass="navbar"><divclass="logo">Logo</div><divclass="menu"><ahref="#"class="menu-item">Très long menu</a><ahref="#"class="menu-item">Autre long menu</a><ahref="#"class="menu-item">Menu qui prend de la place</a></div><divclass="actions"><ahref="#"class="button">Login</a><ahref="#"class="button">Register</a></div></nav>