grid et position
Positionner en deux dimensions, puis superposer et fixer des éléments.
grid
→ Pour positionner dynamiquement les blocs dans une grille 2D (XY).
CSS Grid pour créer des layouts complexes. Contrairement à Flexbox qui fonctionne sur un axe, Grid vous permet de contrôler les lignes et les colonnes.
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 20px;
}
HTML fourni pour l'exercice
Voici une version simplifiée pour comprendre la structure :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="fonts.css">
<link rel="stylesheet" href="style.css">
<title>Poster</title>
</head>
<body>
<div class="header">Titre</div>
<!-- Ligne 1 -->
<div class="grid">
<div class="cell"><div class="box"><h3>DT1</h3></div></div>
<div class="cell"><div class="box"><h3>DT1</h3></div></div>
<div class="cell"><div class="box"><h3>DT1</h3></div></div>
<!-- ... 5 autres cellules -->
</div>
<!-- Lignes 2 à 6 : même structure -->
<!-- Faites 6 lignes de 8 colonnes (48 cellules) -->
<div class="footer">Footer</div>
</body>
</html>
Définir un conteneur de grille
display: grid
.grid {
display: grid;
}
Définir des colonnes et des lignes
grid-template-columns, grid-template-rows
.grid {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
grid-template-rows: repeat(10, 1fr);
}
L'unité fr (fraction) est une unité spécifique à CSS Grid. Elle représente une fraction de l'espace disponible dans le conteneur de la grille.
Dans l'exemple ci-dessus, on compte un total de 4 fractions ; la première colonne prendra donc 1 quart, la deuxième 2 quarts, et la troisième 1 quart.
Placement des éléments
Placement automatique
- Flux normal : Par défaut, les éléments sont placés de gauche à droite, de haut en bas, en suivant ce que l'on appelle le "flux de grille" (grid flow). Cela ressemble au comportement en ligne du texte dans un paragraphe.
- Gestion des espaces : Si un élément ne peut pas être placé dans une colonne en raison de sa taille il sera déplacé à la ligne suivante - en créant potentiellement un espace vide dans la ligne précédente.
- Ordre des Éléments : Les éléments sont placés dans l'ordre où ils apparaissent dans le code HTML, à moins que l'ordre ne soit modifié avec la propriété CSS order.
Placement manuel
grid-column, grid-row
.item1 {
grid-column: 1 / 3; /* de la ligne verticale 1 à 3 */
grid-row: 1 / 2; /* de la ligne horizontale 1 à 2 */
}
Espacement manuel avec span
.item2 {
grid-column: span 2; /* s'étend sur 2 colonnes */
}
Espacement
grid-gap, column-gap, row-gap
.grid-container {
grid-gap: 10px; /* espacement entre toutes les cellules */
}
/* Ou séparément */
.grid-container {
column-gap: 20px;
row-gap: 10px;
}
Utilisations avancées
Grilles nommées avec grid-template-areas
Permet de créer un layout en définissant la structure avec des noms.
.grid-container {
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
}
.item1 {
grid-area: header;
}
.item2 {
grid-area: main;
}
Fonctions de répétition et autres unités
repeat: Répète une colonne ou une ligne un certain nombre de fois.- Syntaxe :
repeat(num_repeats, size) - Exemple : Crée 3 colonnes de taille égale (
1frchacune)..grid-container { grid-template-columns: repeat(3, 1fr);}
- Syntaxe :
minmax: Définit une taille minimale et une taille maximale pour une colonne ou une ligne. Utile pour les grilles responsives.- Syntaxe :
minmax(min_size, max_size) - Exemple : Définit la taille minimale de la colonne à
100pxet la taille maximale à1fr..grid-container { grid-template-columns: minmax(100px, 1fr);}
- Syntaxe :
auto-fill: Remplit automatiquement le nombre de colonnes ou de lignes dans un conteneur, en fonction de l'espace disponible.- Syntaxe : Utilisé avec
repeat:repeat(auto-fill, size) - Exemple : Crée autant de colonnes que possible avec une taille minimale de
100pxet une taille maximale de1fr..grid-container { grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));}
- Syntaxe : Utilisé avec
position
→ Pour donner une position précise au bloc, souvent pour superposer des éléments ou les fixer à l'écran.
Positionnement statique
- Le positionnement statique est la valeur par défaut pour tous les éléments.
- Les éléments sont positionnés dans le flux normal du document HTML (de haut en bas, dans l'ordre du code source).
Positionnement relatif
position: relative; déplace un élément par rapport à sa position initiale dans le flux normal.
- Utilisez
top,right,bottom,leftpour décaler l'élément. - L'espace qu'il occupait initialement reste réservé (les autres éléments ne bougent pas) → il reste dans le flux
Exemple :
.relative-box {
position: relative;
top: 10px;
left: 20px;
}
Positionnement absolu
position: absolute; sort un élément du flux normal et le positionne par rapport à son premier parent positionné (c'est-à-dire qui a position: relative, absolute, fixed, ou sticky).
- Utilisez
top,right,bottom,leftpour positionner l'élément. - L'espace qu'il occupait est récupéré par les autres éléments → il est sorti du flux
Exemple :
.container {
position: relative; /* devient le parent de référence */
}
.absolute-box {
position: absolute;
top: 0;
right: 0;
}
Positionnement fixe
position: fixed; positionne un élément par rapport à la fenêtre du navigateur.
- L'élément reste fixe même lors du défilement de la page.
- Pour les menus sticky, les boutons flottants, etc.
Exemple :
.fixed-box {
position: fixed;
bottom: 20px;
right: 20px;
}
Positionnement sticky
position: sticky; est un hybride entre les positionnements relatif et fixe.
- L'élément se comporte comme
relativejusqu'à ce qu'il atteigne un certain point de défilement, après quoi il devientfixed. - Pour les headers de sections qui restent visibles au scroll.
Exemple :
.sticky-box {
position: sticky;
top: 0;
}
Propriété z-index
Contrôle la superposition des éléments positionnés. Plus le z-index est élevé, plus l'élément est au-dessus.
Exemple :
.below {
position: absolute;
z-index: 1;
}
.above {
position: absolute;
z-index: 2;
}
Erreurs courantes
Avec grid
Problème : Ma grille ne s'affiche pas.
Solution : Avez-vous bien mis display: grid; sur le conteneur parent ?
Problème : Mes colonnes ne sont pas égales.
Solution : Utilisez 1fr pour chaque colonne, pas des valeurs fixes en pixels.
Problème : Mon élément ne se place pas où je veux.
Solution : Vérifiez vos valeurs de grid-column et grid-row. Les numéros correspondent aux lignes de la grille, pas aux cellules.
Problème : Il y a trop d'espace entre mes cellules.
Solution : Réduisez la valeur de grid-gap ou utilisez gap: 0;.
Avec position
Problème : Mon élément absolute ne se positionne pas par rapport à son parent.
Solution : Le parent doit avoir position: relative; (ou absolute, fixed, sticky). Par défaut, les éléments ont position: static; et ne servent pas de référence.
Problème : Mon élément fixed défile avec la page.
Solution : Vérifiez qu'aucun parent n'a de propriété transform, filter, ou perspective qui peut casser le fixed.
Problème : Mon élément sticky ne se fixe pas.
Solution : Vérifiez que vous avez défini au moins une valeur (top, bottom, left, ou right) ; le parent doit avoir assez de hauteur pour permettre le scroll ; pas de overflow: hidden; sur les parents
Problème : Mon z-index ne fonctionne pas.
Solution : z-index ne fonctionne que sur les éléments positionnés (relative, absolute, fixed, ou sticky).
Pour aller plus loin :