Sytuacja kobiet w IT w 2024 roku
7.05.20204 min
Zachary Orona-Calvert

Zachary Orona-CalvertFront End Web DeveloperJamba

Jak napisać i używać Sass Mixin (SCSS)

Dowiedz się, jak używać mixinów od Sass oraz w jaki sposób mogą one ulepszyć Twój CSS.

Jak napisać i używać Sass Mixin (SCSS)

Sass mixins (znane również jako domieszki) to fragmenty kodu, które mogą zostać wielokrotnie użyte w całym naszym CSS bez konieczności ich przepisywania. Pisanie mixinów jest samo w sobie proste. Wszystko, co musisz zrobić, to użyć słowa kluczowego @mixin, po którym podasz swoją nazwę, nawiasów klamrowych, między którymi znajdą się wszelkie potrzebne deklaracje. Zasadniczo przypomina to pisanie bloku deklaracji CSS, z tą różnicą, że tutaj musimy wstawić @mixin przed deklaracją.

@mixin blue-list {
    li {
       color:blue;
    }
}

Uwaga: dywizy i podkreślenia są uważane za identyczne w nazewnictwie mixinów. Zatem blue-list i blue_list określałyby ten sam mixin.

Żeby wykorzystać nasz mixin, musimy użyć słowa kluczowego @include.

ul {
 @include blue-list;
}

Kiedy SCSS jest kompilowany do CSS, to zmienia się on w następujący sposób:

ul li {
 color: blue;
}

Argumenty

Nauczyliśmy się już kilku przydatnych rzeczy, ale dużo jeszcze przed nami. Do mixinów można przekazywać argumenty. Na przykład, jeśli chcielibyśmy, aby nasz poprzedni mixin przyjmował argument koloru, zamiast ustawiać go na sztywno:

@mixin blue_list($color) {
li {
  color:$color;
 }
}

Zwróć uwagę na $. Oznacza to, że słowo po tym znaku to nazwa zmiennej. Zmienne również mają swój zasięg. Rozważmy, na przykład, następujacy blok kodu:

$color: white; //global
.a-local {
$color: black; // overrides global
color: $color;
$local-color: blue; // available only inside button-local
}
.a-default {
$color: #black !default;//uses global value as it is already defined
color: $color;
}
.a {
color: $color; // uses global because no local defined
color: $local-color; //undefined variable: "$local-color"
}

$local-color jest niezdefiniowane, ponieważ nie jest zmienną globalną, a $color jest zdefiniowane, ponieważ taką zmienną jest. Inną ciekawą funkcją jest słowo kluczowe !default. Pozwala ono użyć wartości zapasowej, jeśli $color jest niezdefiniowane.

Czasami zdarzają się takie sytuacje, w których chcesz zdefiniować wartości zapasowe dla argumentów mixinu. Takie coś nazywane jest wartościami domyślnymi. Można je zdefiniować w następujący sposób:

@mixin blue_list($color: blue) {
 li {
  color:$color;
 }
}

Oznacza to, że jeśli wywołane zostanie @include blue-list (nawet jeśli wartość koloru nie została przekazana) Sass użyje niebieskiego, ponieważ zdefiniowaliśmy wartość domyślną.

Należy również zauważyć, że domyślne argumenty trzeba zdefiniować na końcu listy. Na przykład, poniższy kod to niepoprawna składnia i wyrzuci on błąd:

@mixin blue_list($color: blue $width) {
///Code
 }

W CSS istnieją właściwości, które mogą przyjmować wiele argumentów. Margines można, na przykład, zapisać w dowolnej z tych odmian:

a {
 margin: 10px;
 margin: 10px 20px;
 margin: 10px 20px 50px;
 margin: 10px 20px 50px 20px;
}

Problem pojawia się, gdy mamy mixin dla właściwości margin, jak poniżej:

@mixin margin($values) {
 @each $let in $values {
 margin: #{$let};
 }
}


A co jeśli zamiast przekazać jedną wartość dla marginesu, chcieliśmy przekazać kilka, w taki sposób, w jaki to możliwe w CSS? Wywołanie czegoś takiego jak @include margin(2px 4px 6px); skompilowałby się do:

ul {
 margin: 2px;
 margin: 4px;
 margin: 6px;
}

Jeśli chcemy przekazać wiele wartości, musimy podać Sassowi, że nie jest to lista, tylko jedna zmienna. Robimy to za pomocą 3 kropek:

@mixin margin($values…) {
 //Code in here
}

Przez użycie 3 kropek w naszym argumencie, wywołanie @include margin(2px 4px 6px) kompiluje się do tego:

ul {
 margin: 2px 4px 6px;
}

Skoro jesteśmy już przy 3 kropkach, SCSS obsługuje również operatory rozwinięcia (ang. spread operator). Oznacza to, że zamiast przekazywać każdą właściwość indywidualnie, możemy po prostu przekazać coś, co nazywa się mapą. Na przykład:

$light-theme: (textColor: #333333, backgroundColor: #ffffff, borderColor: #000000);
$dark-theme: (textColor: #cccccc, backgroundColor: #000000, borderColor: #ffffff);
@mixin bodyColors($textColor, $backgroundColor, $borderColor) {
 color: $textColor;
 background-color: $backgroundColor;
 border-color: $borderColor;
}
.button {
 @include bodyColors($light-theme...);
}

Kontrola przepływu

Mamy jeszcze funkcje kontroli przepływu. Zgadza się: SCSS ma operatory if, else, else if oraz each.

Operatory @if, @else if oraz @else są zdefiniowane w następujący sposób:

@if $let == true
{
// Conditional code
@else if $let == true {
// Conditional code
} 
@else {
// Neither were true, so fallback to this
 }
}

@each wywołuje się tak:

@each <variables> in <list or map> {
//code
}

W praktyce @each wygląda tak:

@each $name,$size in (“normal”:5px,”big”:10px,”huge”: 20px) {
.#{$name} { text-size: $size;}
}

I skompiluje się do tego:

.normal {
text-size: 5px;
}
.big {
text-size: 10px;
}
.huge {
text-size: 20px;
}

Podsumowanie

Mixiny to jedna z wielu funkcji Sassa. Więcej dowiesz się z dokumentacji.


Oryginał tekstu w języku angielskim możesz przeczytać tutaj

<p>Loading...</p>