Bootstrap est un framework CSS open-source cree par Twitter en 2011. Il fournit des composants preconstruits (boutons, navbars, cartes...) et un systeme de grille responsive sur 12 colonnes. La version 5 a supprime jQuery pour etre plus legere. Des millions de sites l'utilisent dans le monde.
Ajouter 2 lignes dans le HTML : un lien CSS dans le <head> et un script JS avant </body>. Ideal pour les projets rapides et l'apprentissage.
Rapide - Simple - Toujours a jour
Installer via npm install bootstrap ou telecharger les fichiers. Ideal pour la production avec personnalisation SASS.
Personnalisable - Hors ligne - Build
1 <!-- Bootstrap 5 - Structure minimale -->
2 <!DOCTYPEhtml>
3 <htmllang="fr">
4 <head>
5 <meta charset="UTF-8"/>
6 <meta name="viewport"/>
7 content="width=device-width, initial-scale=1"
8 <title>Mon site Bootstrap</title>
9 <!-- Bootstrap CSS via CDN -->
10 <link> href="...bootstrap.min.css" rel="stylesheet"</link>
11 </head>
12 <body>
13 <h1>Bonjour Bootstrap !</h1>
14 <!-- Bootstrap JS Bundle -->
15 <script> src="...bootstrap.bundle.min.js" </script>
16 </body>
17 </html>Bootstrap divise chaque ligne en 12 colonnes invisibles. Vous attribuez a chaque element un nombre de colonnes. La somme dans une ligne doit faire 12. C'est comme un gateau coupe en 12 parts : vous pouvez donner 6 parts a un element et 6 a un autre, ou 4+4+4, etc.
1 <!-- 2 colonnes egales : 6 + 6 = 12 -->
2 <divclass="row">
3 <divclass="col-6 bg-primary text-white p-3">
4 Colonne 1 (50%)
5 </div>
6 <divclass="col-6 bg-danger text-white p-3">
7 Colonne 2 (50%)
8 </div>
9 </div> 1 <!-- 3 colonnes egales : 4 + 4 + 4 = 12 -->
2 <divclass="row">
3 <divclass="col-4 bg-success text-white p-3">
4 Carte 1
5 </div>
6 <divclass="col-4 bg-warning text-dark p-3">
7 Carte 2
8 </div>
9 <divclass="col-4 bg-info text-white p-3">
10 Carte 3
11 </div>
12 </div> 1 <!-- Layout sidebar : 4 + 8 = 12 -->
2 <divclass="row">
3 <divclass="col-4 bg-dark text-white p-3">
4 Sidebar
5 </div>
6 <divclass="col-8 bg-light p-3">
7 Contenu principal
8 </div>
9 </div>| Classe | Comportement | Largeur |
|---|---|---|
.container | Largeur fixe qui change aux breakpoints | 540 / 720 / 960 / 1140 / 1320px |
.container-fluid | Pleine largeur a tous les ecrans | Toujours 100% |
.container-{bp} | Pleine largeur jusqu'au breakpoint, puis fixe | 100% puis fixe |
| Breakpoint | Classe | Largeur min | Appareils |
|---|---|---|---|
| xs | (pas de prefixe) | 0px | Telephones portrait |
| sm | -sm- | 576px | Telephones landscape |
| md | -md- | 768px | Tablettes |
| lg | -lg- | 992px | Portables |
| xl | -xl- | 1200px | Desktops |
| xxl | -xxl- | 1400px | Grands ecrans |
1 <!-- 1 colonne tel, 2 tablette, 3 desktop -->
2 <divclass="container">
3 <divclass="row g-4">
4 <divclass="col-12 col-md-6 col-lg-4">
5 <divclass="bg-primary text-white p-3 rounded">
6 Carte 1
7 </div>
8 </div>
9 <divclass="col-12 col-md-6 col-lg-4">
10 <divclass="bg-success text-white p-3 rounded">
11 Carte 2
12 </div>
13 </div>
14 </div>
15 </div>Toutes les classes utilitaires suivent un schema systematique :
| Partie | Valeurs | Exemple |
|---|---|---|
| Propriete | m, p, w, h, d, g | m-, p- |
| Cote | t (top), b (bottom), s (start), e (end), x (hori), y (verti) | mt-, px- |
| Taille | 0-5, auto | p-3 = 1rem |
1 <!-- Echelle spacing : 0=0rem, 1=0.25rem ... 5=3rem -->
2 <divclass="p-0 bg-light border mb-2">
3 p-0 (0rem - pas de padding)
4 </div>
5 <divclass="p-3 bg-light border mb-2">
6 p-3 (1rem de padding)
7 </div>
8 <divclass="p-5 bg-light border mb-2">
9 p-5 (3rem de padding)
10 </div> 1 <!-- Centrer horizontalement avec mx-auto -->
2 <divclass="w-50 mx-auto bg-primary text-white p-4 rounded shadow">
3 Centre avec mx-auto
4 </div>
5
6 <!-- Centrer verticalement et horizontalement -->
7 <divclass="d-flex align-items-center justify-content-center" style="height:200px">
8 <divclass="p-4 bg-success text-white rounded">
9 Contenu centre
10 </div>
11 </div> 1 <!-- Couleurs de texte -->
2 <pclass="text-primary">>Texte primaire (bleu)</p>
3 <pclass="text-success">>Texte succes (vert)</p>
4 <pclass="text-danger">>Texte danger (rouge)</p>
5 <pclass="text-warning">>Texte attention (jaune)</p>
6
7 <!-- Couleurs de fond -->
8 <divclass="bg-primary text-white p-2 rounded mb-1">>Fond primaire</div>
9 <divclass="bg-success text-white p-2 rounded mb-1">>Fond succes</div>
10 <divclass="bg-danger text-white p-2 rounded mb-1">>Fond danger</div>
11 <divclass="bg-dark text-white p-2 rounded">>Fond sombre</div> 1 <!-- Tailles de police fs-1 a fs-6 -->
2 <h1class="fs-1">>Titre fs-1 (2.5rem)</h1>
3 <h2class="fs-2">>Titre fs-2 (2rem)</h2>
4 <pclass="fs-5">>Texte fs-5 (1.25rem)</p>
5
6 <!-- Poids et transformations -->
7 <pclass="fw-bold">>Texte gras</p>
8 <pclass="fw-light">>Texte leger</p>
9 <pclass="text-uppercase">>tout en majuscules</p>
10 <pclass="fst-italic">>En italique</p> 1 <!-- Variantes de couleur -->
2 <buttonclass="btn btn-primary">>Primaire</button>
3 <buttonclass="btn btn-success">>Succes</button>
4 <buttonclass="btn btn-danger">>Danger</button>
5 <buttonclass="btn btn-warning">>Attention</button>
6
7 <!-- Tailles -->
8 <buttonclass="btn btn-primary btn-lg">>Grand</button>
9 <buttonclass="btn btn-primary">>Normal</button>
10 <buttonclass="btn btn-primary btn-sm">>Petit</button>
11
12 <!-- Outline et desactive -->
13 <buttonclass="btn btn-outline-primary">>Outline</button>
14 <buttonclass="btn btn-primary" disabled>>Desactive</button> 1 <!-- Groupe horizontal -->
2 <divclass="btn-group" role="group">
3 <buttonclass="btn btn-primary">>Gauche</button>
4 <buttonclass="btn btn-primary">>Centre</button>
5 <buttonclass="btn btn-primary">>Droite</button>
6 </div> 1 <formclass="row g-3">
2 <divclass="col-md-6 mb-3">
3 <labelclass="form-label">>Prenom</label>
4 <input type="text" class="form-control" required/>
5 </div>
6 <divclass="col-md-6 mb-3">
7 <labelclass="form-label">>Email</label>
8 <input type="email" class="form-control" required/>
9 </div>
10 <divclass="col-12 mb-3">
11 <labelclass="form-label">>Message</label>
12 <textareaclass="form-control" rows="3">></textarea>
13 </div>
14 <divclass="col-12">
15 <buttonclass="btn btn-primary" type="submit">>Envoyer</button>
16 </div>
17 </form> 1 <!-- Champ valide -->
2 <divclass="mb-3">
3 <labelclass="form-label">>Email</label>
4 <inputtype="email" class="form-control is-valid">
5 <divclass="valid-feedback">>Email correct !</div>
6 </div>
7
8 <!-- Champ invalide -->
9 <divclass="mb-3">
10 <labelclass="form-label">>Email</label>
11 <inputtype="email" class="form-control is-invalid">
12 <divclass="invalid-feedback">>Email requis !</div>
13 </div> 1 <tableclass="table table-striped table-hover table-bordered">
2 <theadclass="table-primary">
3 <tr>
4 <th>>Nom</th>
5 <th>>Email</th>
6 <th>>Role</th>
7 </tr>
8 </thead>
9 <tbody>
10 <tr>
11 <td>>Baba Niang</td>
12 <td>>baba@example.com</td>
13 <td>>Admin</td>
14 </tr>
15 </tbody>
16 </table>| Nom | Role | |
|---|---|---|
| Baba Niang | baba@example.com | Admin |
| Aissatou Diallo | aissatou@example.com | Utilisateur |
1 <!-- Image responsive (s'adapte a la largeur) -->
2 <img src="photo.jpg" class="img-fluid" alt="Description"/>
3
4 <!-- Image vignette -->
5 <img src="photo.jpg" class="img-thumbnail" alt="Vignette"/>
6
7 <!-- Image circulaire (avatar) -->
8 <img src="avatar.jpg" class="rounded-circle"/>
9 alt="Avatar" width="150" height="150"
10
11 <!-- Image pilule -->
12 <img src="photo.jpg" class="rounded-pill w-50" alt="Photo"/> 1 <divclass="row row-cols-1 row-cols-md-3 g-4">
2 <divclass="col">
3 <divclass="card h-100">
4 <img src="..." class="card-img-top" alt="..."/>
5 <divclass="card-body">
6 <h5class="card-title">>Titre</h5>
7 <pclass="card-text">>Description...</p>
8 <ahref="#" class="btn btn-primary">>En savoir plus</a>
9 </div>
10 <divclass="card-footer text-muted">>Il y a 2 jours</div>
11 </div>
12 </div>
13 </div> 1 <navclass="navbar navbar-expand-lg navbar-dark bg-dark">
2 <divclass="container">
3 <aclass="navbar-brand" href="#">>MonSite</a>
4 <button class="navbar-toggler" data-bs-toggle="collapse"/>
5 data-bs-target="#navMenu"
6 <divclass="collapse navbar-collapse" id="navMenu">
7 <ulclass="navbar-nav me-auto">
8 <liclass="nav-item">
9 <aclass="nav-link active" href="#">>Accueil</a>
10 </li>
11 <liclass="nav-item dropdown">
12 <aclass="nav-link dropdown-toggle" href="#">>Services</a>
13 </li>
14 </ul>
15 </div>
16 </div>
17 </nav> 1 <divclass="alert alert-primary" role="alert">
2 Information importante a lire !
3 </div>
4 <divclass="alert alert-success" role="alert">
5 Operation reussie avec succes !
6 </div>
7 <divclass="alert alert-danger" role="alert">
8 Une erreur est survenue !
9 </div>
10 <divclass="alert alert-warning" role="alert">
11 Attention, verifiez vos donnees !
12 </div> 1 <!-- Bouton declencheur -->
2 <buttonclass="btn btn-primary" data-bs-toggle="modal">
3 data-bs-target="#maModale">Ouvrir</button>
4
5 <!-- Modale -->
6 <divclass="modal fade" id="maModale" tabindex="-1">
7 <divclass="modal-dialog">
8 <divclass="modal-content">
9 <divclass="modal-header">
10 <h5class="modal-title">>Titre</h5>
11 <button class="btn-close" data-bs-dismiss="modal"/>
12 </div>
13 <divclass="modal-body">>Contenu...</div>
14 <divclass="modal-footer">
15 <buttonclass="btn btn-secondary" data-bs-dismiss="modal">>Fermer</button>
16 <buttonclass="btn btn-primary">>Sauvegarder</button>
17 </div>
18 </div>
19 </div>
20 </div> 1 <!-- Tabs (onglets) -->
2 <ulclass="nav nav-tabs">
3 <liclass="nav-item">
4 <aclass="nav-link active" data-bs-toggle="tab">>Accueil</a>
5 </li>
6 <liclass="nav-item">
7 <aclass="nav-link" data-bs-toggle="tab">>Profil</a>
8 </ul>
9
10 <!-- Breadcrumb (fil d'Ariane) -->
11 <navaria-label="breadcrumb">
12 <olclass="breadcrumb">
13 <liclass="breadcrumb-item">
14 <ahref="#">>Accueil</a>
15 </li>
16 <liclass="breadcrumb-item active">>Detail</li>
17 </ol>
18 </nav>
19
20 <!-- Pagination -->
21 <nav>
22 <ulclass="pagination">
23 <liclass="page-item">
24 <aclass="page-link" href="#">>Prec</a>
25 </li>
26 <liclass="page-item active">
27 <aclass="page-link" href="#">>1</a>
28 </li>
29 </ul>
30 </nav> 1 <!-- Barre de progression -->
2 <divclass="progress mb-3">
3 <divclass="progress-bar" style="width: 75%">>75%</div>
4 </div>
5
6 <!-- Barre animee avec stripes -->
7 <divclass="progress">
8 <divclass="progress-bar progress-bar-striped progress-bar-animated">
9 style="width: 60%"
10 </div>
11 </div>
12
13 <!-- Spinners -->
14 <divclass="spinner-border text-primary">></div>
15 <divclass="spinner-grow text-success">></div> 1 <!-- Bouton avec icone -->
2 <buttonclass="btn btn-primary">
3 <iclass="bi bi-download me-2">></i>Telecharger
4 </button>
5
6 <!-- Tailles d'icone -->
7 <iclass="bi bi-star fs-1 text-warning">></i>
8 <iclass="bi bi-star fs-4 text-danger">></i>
9
10 <!-- Badge notification -->
11 <buttonclass="btn btn-light position-relative">
12 <iclass="bi bi-bell fs-4">></i>
13 <spanclass="position-absolute top-0 start-100>
14 translate-middle badge rounded-pill bg-danger">5
15 </span>
16 </button> 1 <!-- BON : Mobile-first, g-4 pour espacement -->
2 <divclass="col-12 col-md-6 col-lg-4">
3 <divclass="row g-4">
4 <divclass="col-6">>...</div>
5 </div>
6 </div>
7
8 <!-- EVITER : Ordre inverse, marges manuelles -->
9 <divclass="col-lg-4 col-md-6 col-12">
10 <divclass="row">
11 <divclass="col-6 px-2 my-2">>...</div>
12 </div>
13 </div>| Regle | Bonnes pratiques |
|---|---|
| Labels | Toujours associer <label> a chaque <input> |
| ARIA | Utiliser aria-label, aria-hidden, role |
| Contraste | Verifer le ratio de contraste texte/fond (min 4.5:1) |
| alt | Attribut alt descriptif sur toutes les images |
| Minification | Utiliser les versions .min.css et .min.js en production |
| Tree-shaking | Importer uniquement le CSS necessaire via SASS |