Module SCSS.3 – Mixins & fonctions
Objectif
Maîtriser les mixins et fonctions SCSS pour créer du code réutilisable et DRY (Don't Repeat Yourself).
Théorie
Mixins
Mixins = Blocs de code réutilisables.
Déclaration :
@mixin button {
padding: 10px 20px;
border-radius: 5px;
border: none;
cursor: pointer;
}
Utilisation :
.button-primary {
@include button;
background-color: blue;
color: white;
}
.button-secondary {
@include button;
background-color: gray;
color: white;
}
Compilé :
.button-primary {
padding: 10px 20px;
border-radius: 5px;
border: none;
cursor: pointer;
background-color: blue;
color: white;
}
Mixins avec paramètres
Paramètres :
@mixin button($bg-color, $text-color: white) {
padding: 10px 20px;
border-radius: 5px;
background-color: $bg-color;
color: $text-color;
}
Utilisation :
.button-primary {
@include button(blue);
}
.button-secondary {
@include button(gray, black);
}
Paramètres par défaut :
@mixin button($bg-color: blue, $text-color: white) {
// ...
}
.button {
@include button; // Utilise les valeurs par défaut
}
Arguments nommés :
@mixin button($bg-color, $text-color, $padding: 10px 20px) {
// ...
}
.button {
@include button($bg-color: blue, $text-color: white);
}
Mixins avec @content
@content = Permet d'ajouter du contenu dans le mixin.
@mixin media($breakpoint) {
@media (min-width: $breakpoint) {
@content;
}
}
.container {
width: 100%;
@include media(768px) {
width: 750px;
}
@include media(992px) {
width: 970px;
}
}
Compilé :
.container {
width: 100%;
}
@media (min-width: 768px) {
.container {
width: 750px;
}
}
@media (min-width: 992px) {
.container {
width: 970px;
}
}
Mixins courants
Clearfix :
@mixin clearfix {
&::after {
content: "";
display: table;
clear: both;
}
}
.container {
@include clearfix;
}
Centrage :
@mixin center {
display: flex;
justify-content: center;
align-items: center;
}
Truncate (texte coupé) :
@mixin truncate {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
Responsive :
@mixin respond-to($breakpoint) {
@if $breakpoint == mobile {
@media (max-width: 575px) { @content; }
}
@else if $breakpoint == tablet {
@media (min-width: 576px) and (max-width: 991px) { @content; }
}
@else if $breakpoint == desktop {
@media (min-width: 992px) { @content; }
}
}
.element {
@include respond-to(mobile) {
width: 100%;
}
}
Fonctions SCSS
Fonctions = Retournent une valeur (pas de CSS généré).
Déclaration :
@function calculate-width($total, $sidebar) {
@return $total - $sidebar;
}
.main {
width: calculate-width(1200px, 250px); // 950px
}
Fonctions mathématiques :
@function rem($pixels, $base: 16px) {
@return ($pixels / $base) * 1rem;
}
.element {
font-size: rem(24px); // 1.5rem
padding: rem(16px); // 1rem
}
Fonctions de couleur :
$primary: #007bff;
.button {
background-color: $primary;
border-color: darken($primary, 10%);
color: lighten($primary, 50%);
}
Fonctions de couleur disponibles :
lighten($color, $amount): Éclaircirdarken($color, $amount): Assombrirsaturate($color, $amount): Saturerdesaturate($color, $amount): Désaturermix($color1, $color2, $weight): Mélangerrgba($color, $alpha): Ajouter transparence
Exemple :
$primary: #007bff;
.button {
background-color: $primary;
&:hover {
background-color: darken($primary, 10%);
}
&:active {
background-color: darken($primary, 20%);
}
}
Fonctions personnalisées avancées
Fonction pour obtenir une couleur depuis une map :
$theme-colors: (
primary: #007bff,
secondary: #6c757d,
success: #28a745
);
@function color($key) {
@return map-get($theme-colors, $key);
}
.button-primary {
background-color: color(primary);
}
Fonction pour z-index :
$z-indexes: (
dropdown: 1000,
modal: 2000,
tooltip: 3000
);
@function z($key) {
@return map-get($z-indexes, $key);
}
.modal {
z-index: z(modal);
}
Exercices guidés
Exercice 1 : Mixins de base
Créez des mixins :
buttonpour les boutonscardpour les cartes- Utilisez-les dans vos composants
Exercice 2 : Mixins avec paramètres
Créez un mixin button avec :
- Paramètre pour la couleur de fond
- Paramètre optionnel pour la couleur du texte
- Utilisez-le pour créer plusieurs boutons
Exercice 3 : Mixins avec @content
Créez un mixin media :
- Paramètre pour le breakpoint
- Utilisez @content
- Créez des media queries responsive
Exercice 4 : Fonctions
Créez des fonctions :
rem()pour convertir px en remcolor()pour obtenir une couleur depuis une map- Utilisez-les dans vos styles
Exercice 5 : Fonctions de couleur
Utilisez les fonctions de couleur :
darken()pour les hoverslighten()pour les états actifs- Créez une palette cohérente
❌ Erreurs fréquentes
Erreur 1 : Confondre mixin et fonction
❌ Mauvais :
@mixin calculate($a, $b) {
@return $a + $b; // Erreur : mixin ne peut pas retourner
}
✅ Bon :
@function calculate($a, $b) {
@return $a + $b;
}
Pourquoi : Mixin = génère du CSS, Fonction = retourne une valeur.
Erreur 2 : Oublier @content dans le mixin
❌ Mauvais :
@mixin media($breakpoint) {
@media (min-width: $breakpoint) {
// Pas de @content
}
}
✅ Bon :
@mixin media($breakpoint) {
@media (min-width: $breakpoint) {
@content;
}
}
Pourquoi : @content permet d'injecter du code.
Erreur 3 : Paramètres dans le mauvais ordre
❌ Mauvais :
@mixin button($text-color, $bg-color) { }
.button {
@include button(blue, white); // Inversé
}
✅ Bon :
@mixin button($bg-color, $text-color: white) { }
.button {
@include button(blue); // Ou arguments nommés
}
Pourquoi : Ordre logique ou arguments nommés.
Erreur 4 : Fonction qui génère du CSS
❌ Mauvais :
@function button-style() {
padding: 10px; // Erreur : fonction ne peut pas générer CSS
}
✅ Bon :
@mixin button-style() {
padding: 10px;
}
Pourquoi : Fonction = valeur, Mixin = CSS.
Erreur 5 : Pas de @return dans une fonction
❌ Mauvais :
@function calculate($a, $b) {
$result: $a + $b; // Pas de return
}
✅ Bon :
@function calculate($a, $b) {
@return $a + $b;
}
Pourquoi : Fonction doit retourner une valeur.
🚀 Mini-projet
Mission : Créer une bibliothèque de mixins et fonctions
Créez un fichier _mixins.scss avec :
Mixins :
button($bg-color, $text-color)card($padding, $border-radius)media($breakpoint)avec @contentclearfixtruncate
Fonctions :
rem($pixels)pour convertir en remcolor($key)pour obtenir une couleurz($key)pour z-index
Utilisation :
- Utilisez tous les mixins dans vos composants
- Utilisez toutes les fonctions dans vos styles
- Créez des variantes avec paramètres
Critères :
- ✅ Mixins réutilisables
- ✅ Fonctions utiles
- ✅ Paramètres appropriés
- ✅ Documentation claire
- ✅ Code DRY
Objectif : Maîtriser les mixins et fonctions pour créer du code réutilisable et maintenable.
Validation : Vous pouvez passer au module suivant quand vous maîtrisez les mixins, fonctions et avez créé une bibliothèque réutilisable.