9-1 Layout Flexbox
Le visuel de l'application n'est pas optimal pour le moment. En effet, la zone de contenu devrait prendre un maximum de place, ayant comme effet de pousser complètement vers le bas le footer.
Cela est un cas d'utilisation typique pour un layout
de type flex
. C'est-à-dire que les différents blocs sont répartis équitablement dans l'espace. Il est possible même de préciser qu'un certain élément devrait prendre un maximum d'espace (la zone de contenu, par exemple.)
Ainsi, pour appliquer un layout de type flexbox à la structure de l'application, on découpera en trois sections l'app:
- Barre de navigation
- Contenu
- Footer
On appliquera au composant app-root
une class d-flex flex-column
pour que les sous-éléments soient disposés l'un à la suite de l'autre.
En effet, les composantes navbar
, la zone de contenu (router outlet)
et footer
sont tous des endants de app-root
. Ce sont des ces éléments qui seront soumis à la disposition flex
.
flex-column
assurera une disposition de haut en bas (column), plutôt que de gauche à droite comme la valeur par défaut le veut.
S'assurer que html
, body
et app-root
prennent 100% de l'espace vertical
La première étape est de s'assurer que les blocs html
, body
et app-root
prennent 100% de l'espace vertical qui leur est alloué.
En effet, ce n'est pas dutout le cas actuellement:
Modifiez index.html
afin d'ajouter les classes CSS h-100
(height: 100%
) à ces éléments (html
, body
et app-root
)
<!doctype html>
<html lang="en" data-bs-theme="dark" class="h-100">
<head>
<meta charset="utf-8">
<title>Houdini</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body class="h-100">
<app-root class="h-100"></app-root>
</body>
</html>
Le body
de la page devrait maintenant prendre 100% de l'espace.
Mettre app-root
en conteneur flex
Comme c'est app-root
qui contient directement sous ce dernier les éléments de barre de navigation, zone de contenu et footer, on lui asignera la classe Bootstrap d-flex flex-column
, soit display: flex; flex-direction: column
.
<!doctype html>
<html lang="en" data-bs-theme="dark" class="h-100">
<head>
<meta charset="utf-8">
<title>Houdini</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body class="h-100">
<app-root class="h-100 d-flex flex-column"></app-root>
</body>
</html>
flex-column
dispose les éléments un à la suite de l'autre, verticalement, contrairement à flex-row
qui les dispose de gauche à droite.
Pour l'instant rien ne change cepandant!
Faire en sorte que la zone de contenu prenne tout l'espace vertical
Pour que la zone de contenu prenne tout l'espace, on doit lui assigner une classe flex-grow-1
. En effet, cela a pour effet de faire prendre à l'élément l'espace restant, s'il en reste.
Comme la zone de contenu est le router-outlet
, enveloppons ce dernier dans un bloc main
qui aura la classe flex-grow-1
.
Vous pouvez modifier le fichier app.ts
de cette façon:
@Component({
selector: 'app-root',
imports: [RouterOutlet, Navbar, Footer],
template: `
<app-navbar></app-navbar>
<main class="flex-grow-1">
<router-outlet />
</main>
<app-footer></app-footer>
`,
styles: [],
})
Beaucoup mieux!