Nous avons déjà exploré la structure HTML, les sélecteurs CSS et le Modèle de Boîte. Vous savez maintenant comment définir la taille et l'espacement des éléments. Avec CSS Grid, vous avez appris à structurer des mises en page complexes en deux dimensions. Cependant, pour des mises en page plus simples et des distributions d'éléments sur une seule ligne ou colonne, Flexbox est l'outil idéal.
Flexbox (Flexible Box Layout Module) est un module de mise en page CSS qui permet d'organiser des éléments dans une seule dimension (soit en ligne, soit en colonne). Il est idéal pour distribuer l'espace entre les éléments d'une interface et pour les aligner facilement.
Pensez à Flexbox comme à un moyen de rendre vos éléments "flexibles" pour qu'ils puissent s'adapter à l'espace disponible.
Pour utiliser Flexbox, vous devez définir un conteneur flex et ses éléments flex (enfants directs). C'est le conteneur qui contrôle la mise en page de ses enfants.
<div class="flex-container"> <!-- Conteneur Flex -->
<div class="flex-item">Item 1</div> <!-- Élément Flex -->
<div class="flex-item">Item 2</div>
<div class="flex-item">Item 3</div>
</div>
.flex-container {
display: flex; /* Transforme l'élément en conteneur flex */
background-color: #F0F8FF; /* Pour visualiser le conteneur */
padding: 15px;
border: 1px solid #A5B4FC;
}
.flex-item {
background-color: #BFDBFE; /* Pour visualiser les éléments */
padding: 10px;
border: 1px solid #60A5FA;
margin: 5px;
}
Flexbox fonctionne avec deux axes :
flex-direction.Ces propriétés sont appliquées au conteneur flex pour contrôler la disposition de ses enfants.
flex-direction: Définit la direction de l'axe principal.
justify-content: Aligne les éléments le long de l'axe principal.
align-items: Aligne les éléments le long de l'axe transversal.
flex-wrap: Gère le passage à la ligne des éléments.
gap: Définit l'espacement entre les lignes et les colonnes des éléments flex.
gap: 10px; (10px entre les lignes et les colonnes).row-gap et column-gap.align-content: Aligne les lignes de flex dans le conteneur flex le long de l'axe transversal, lorsque les éléments s'enroulent (flex-wrap: wrap;) et qu'il y a de l'espace libre dans l'axe transversal.
Ces propriétés sont appliquées aux éléments flex (les enfants directs du conteneur flex).
flex-grow: Spécifie la capacité d'un élément à grandir pour occuper l'espace disponible.
flex-shrink: Spécifie la capacité d'un élément à rétrécir si l'espace est insuffisant.
flex-basis: Définit la taille initiale d'un élément flex avant que l'espace disponible ne soit distribué.
flex-basis: 100px; ou flex-basis: auto; (défaut).flex: Raccourci pour flex-grow, flex-shrink, et flex-basis.
flex: 1 1 auto; (grandit, rétrécit, taille auto).flex: 1; (raccourci pour 1 1 0%).align-self: Surcharge la propriété align-items du conteneur pour un élément flex spécifique.
order: Spécifie l'ordre des éléments flex dans le conteneur.
order: 1; (les éléments avec un order plus bas apparaissent en premier). Défaut est 0.aspect-ratioUn problème courant en CSS est de vouloir qu'un élément (comme une vidéo ou une image de carte produit) conserve ses proportions (par exemple, un ratio 16/9) lorsque sa largeur change. La propriété moderne aspect-ratio résout ce problème élégamment.
.video-container {
width: 100%;
aspect-ratio: 16 / 9; /* Le conteneur gardera ce ratio hauteur/largeur */
background-color: black;
}
.video-container iframe {
width: 100%;
height: 100%;
}
Pour chaque exercice, créez un nouveau fichier HTML et CSS (ou continuez sur les fichiers des séances précédentes si vous le souhaitez, en les organisant bien). N'oubliez pas de lier votre fichier CSS dans le <head> de votre HTML.
<div class="flex-container">) et trois éléments enfants (<div class="flex-item">).display: flex; au conteneur.justify-content et align-items pour centrer les trois éléments enfants à la fois horizontalement et verticalement dans le conteneur.display: flex; au conteneur.flex-direction: column; pour empiler les éléments.justify-content: space-between; pour distribuer l'espace verticalement entre eux.flex-grow: 1; et aux autres flex-grow: 0;. Observez lequel prend l'espace restant.<ul>) d'éléments de lien (<li><a>).<ul> en conteneur flex.<li>) horizontalement et distribuez-les uniformément.flex-direction: column;).flex-grow).flex-wrap: wrap;) si l'espace est insuffisant.Pour ce TP, vous allez utiliser Flexbox pour construire une galerie d'images qui s'adapte à la taille de l'écran, en intégrant notre Design System et la propriété aspect-ratio.
Concevoir une galerie d'images où les images s'affichent en ligne et se disposent de manière flexible, en passant à la ligne si l'espace est insuffisant, tout en maintenant des proportions cohérentes.
tp-seance5-flexbox avec index.html et styles.css.index.html, créez une div principale <div class="gallery-container"> qui contiendra plusieurs divs <div class="gallery-item"> (au moins 6) simulant des images (vous pouvez juste mettre une couleur de fond et une taille).styles.css :
box-sizing: border-box; universellement.styles.css global (ex: var(--color-primary), var(--space-4), var(--font-size-base), var(--shadow-md)).display: flex;).flex-wrap: wrap;).justify-content: center;).gap (espacement) entre les éléments de la galerie en utilisant une variable de notre Design System.flex-basis: 150px; pour une largeur initiale).flex-grow: 1;) mais pas de rétrécir (flex-shrink: 0;) ou ajustez selon l'effet désiré.aspect-ratio: 1 / 1; pour que chaque élément de la galerie soit carré, quelle que soit sa largeur.display: flex; justify-content: center; align-items: center; si vous mettez du texte dedans).index.html dans le navigateur. Redimensionnez la fenêtre et observez comment les "images" se réorganisent et passent à la ligne de manière flexible pour s'adapter à l'espace disponible, tout en conservant leur forme carrée.