Z poprzednich lekcji wiesz, że zmienne w SASS mogą być typu m. in.boolean
(wartość prawda / fałsz) lubmap
. Tym razem dowiesz się w jakim celu możesz je zdefiniować i jak je wykorzystać.
Instrukcja @if
Zacznijmy od operacji warunkowych. Są one miejscem w kodzie, w którym zostaje podjęta decyzja na podstawie wartości zmiennych. Możesz w kodzie zadać np. pytanie “Jeśli zmienna$debug
ma wartośćtrue
(prawda), to wbody
ustaw kolor czerwony, jeśli jest inaczej ustaw kolor zielony”. Za pomocą takiej zmiennej można w bardzo łatwy sposób wyświetlać dowolne dane, które mogą być Ci potrzebne do tworzenia layoutu, ale nie koniecznie powinien je widzieć użytkownik końcowy twojej strony. Zapiszmy powyższy przykład w kodzie:
123456789 | $debug:true;body{@if$debug==true{background-color:red;}@else{background-color:green;}} |
---|---|
W powyższym przykładziebody
będzie miało tło w kolorze czerwonym, jednak wystarczy zmienić wartość zmiennej$debug
nafalse
(fałsz), aby tło elementubody
zmieniło swój kolor na kolor zielony. Instrukcje warunkowe można np. też wykorzystać gdy tworzymy dwie wersje kolorystyczne naszego szablonu. Wystarczy zdefiniować np. zmienną$theme
i nadać mu wartościlight
idark
. Dzięki temu możemy w łatwy sposób przełączać się między dwoma wersjami szablonu.
Instrukcje warunkowe w SASS zaczynamy od operatora@if
, a następnie piszemy kod, który jest warunkiem (pytaniem). W tym przykładzie pytamy czy zmienna$debug
ma wartośćtrue
. Jeśli tak, to wykona się kod objęty klamrami umieszczony od razu po warunku. W przeciwnym wypadku wykona się kod objęty klamrami umieszczony po operatorze@else
. Jest to część opcjonalna instrukcji warunkowej i nie musimy pisać@else
jeśli tego nie potrzebujemy.
Instrukcja @else if
Przy pomocy instrukcji warunkowych możemy również sprawdzić wiele wariantów. Na przykład:
1 2 3 4 5 6 7 8 910111213 | $type:monster;p{@if$type==ocean{color:blue;}@elseif$type==matador{color:red;}@elseif$type==monster{color:green;}@else{color:black;}} |
---|---|
W tym wypadku pytamy o 3 różne wartości i nadajemy odpowiedni kolor dla elementup
. Jeśli wartość zmiennej$type
nie posiada żadnej z wartości o którą pytamy, wykona się kod z bloku@else
. W podanym przykładzie użyte zostało słowo kluczowe@else if
. Jest to blok, który wykona się w następującej sytuacji. Wszystkie poprzedzające@if
oraz@else if
nie są spełnione, oraz warunek przy aktualnej instrukcji@else if
jest spełniony.
Najłatwiej zrozumieć działanie tej instrukcji analizując powyższy przykład. SASS sprawdza po kolei warunki, na początek jest sprawdzane$type == ocean
, nie jest to prawda, więc fragmentcolor: blue;
nie zostanie wykonany. Następuje sprawdzenie kolejnego warunku, czyli$type == matador
. On również nie jest prawdą, więc fragmentcolor: red;
również nie zostanie wykonany. SASS przejdzie do kolejnego warunku, czyli$type == monster
, on już jest prawdziwy, więc instrukcjacolor: green;
zostanie wykonana. Po napotkaniu prawdziwego warunku, kończy się sprawdzanie kolejnych w danej sekwencji.
W kodzie wynikowym otrzymamy po prostu:
123 | p{color:green;} |
---|---|
Dobrą wiadomością jest też to, że instrukcje warunkowe możemy umieszczać we wcześniej poznanych już mixinach, dzięki czemu nie musimy pisać kolejnego ifa dla każdego elementu, ale wystarczy proste@include
wcześniej zdefiniowanego mixinu.
Pętle
Teraz wspomnijmy nieco o pętlach. Są to kawałki kodu, które powtarzają się tyle razy, dopóki nie wykona się zadany warunek. W SASS mamy możliwość wykorzystania trzech różnych typów pętli@for
,@each
i@whille
. Zacznijmy więc po kolei. Wyobraźmy sobie, że chcemy zrobić 100 elementów które będą odwzorowywać swoją szerokością postęp w wykonaniu takiego kursu jak ten. Potrzebowalibyśmy stu różnych klas np..progressbar-1
,.progressbar-2
itd. aż do.progressbar-100
. Byłoby nieco uciążliwe pisać to ręcznie metodą “kopiuj - wklej”, nie mówiąc już jak męczące byłoby wprowadzenie jakiejkolwiek zmiany w tym kodzie, dlatego warto w tym miejscu użyć pętli.
@for
@for
jest podstawową i najprostszą pętlą, którą możemy zastosować. Jej składnia przedstawia się w poniższy sposób:
123456 | @for$ifrom1through100{.progressbar-#{$i}{$width:unquote($i+'%');width:$width;}} |
---|---|
Pętla ta wykona za nas 100 elementów.progressbar-1
,.progressbar-2
itd. z szerokością od 1 do 100%. Oczywiście w miejsca liczb 1 i 100 możemy wstawić dowolne zmienne, a akcje wykonywane wewnątrz pętli mogą być bardziej skomplikowane. Mogą również zawierać ify.
W powyższym przykładzie pojawia się również nowa funkcjaunquote
. Jej zadaniem jest usunięcie niepotrzebnych nam apostrofów np. po operacji dodawania stringów. Dzięki temu otrzymamy poprawnie wygenerowane wartości dla właściwościwidth
.
@each
Drugą z pętli, którą dziś poznamy, jest@each
. Podobnie do@for
pętla ta jest bardzo prosta, ale do jej wykonania potrzebujemy listy elementów np.seat, nissan, renault
. Pętla będzie pracować właśnie na tych danych.
Przykład:
12345 | @each$animalinpuma,sea-slug,egret,salamander{.#{$animal}-icon{background-image:url('/images/#{$animal}.png');}} |
---|---|
Powyższy kod wygeneruje klasy.puma-icon
,.sea-slug-icon
itd. z odpowiednimbackground-image
. Pętla będzie się wykonywać dopóki na liście istnieją niewykorzystane elementy. Oczywiście zamiast stałej listy możesz także wstawić w to miejsce zmienną. Pętla@each
ma też inne, bardziej zaawansowane struktury z wykorzystaniem wielu list czy map. Jeśli chcesz zgłębić temat na własną rękę polecam zajrzeć dooficjalnej dokumentacji.
@while
Trzecią i ostatnią pętlą jest pętla@while
. W swej strukturze posiada ona instrukcję warunkową, która steruje tym, kiedy pętla ma się zakończyć. Jest jedna, bardzo ważna rzecz o której musisz pamiętać korzystając z tej pętli. Sprawdź dokładnie kod i napisz go tak, aby pętla miała kiedyś swój koniec, bowiem możesz stworzyć taki warunek, który nigdy się nie spełni. Wtedy pętla nigdy nie zakończy swojego działania i zawiesi kompilator. Musisz też mieć na uwadze, że pętla ta może nie wykonać się nigdy, gdyż warunek jest sprawdzany przed wejściem do pętli. Jeśli tylko będziesz pamiętał o tych sytuacjach, możesz swobodnie korzystać z pętli@while
.
123456789 | $i:6;@while$i>0{.item-#{$i}{width:2em*$i;}$i:$i-2;} |
---|---|
Instrukcją warunkową w tej pętli jest$i > 0
. Pętla zakończy swoje działanie po trzech przebiegach, ale gdyby usunąć z jej zawartości linijkę$i $i - 2;
pętla nigdy nie skończyłaby swojego działania, ponieważ zmienna$i
zawsze będzie miała wartość równą6
i ta wartość nigdy nie będzie mniejsza lub równa0
. Pamiętaj o tym!
Jak się pewnie domyślasz, instrukcja$i: $i - 2
wstawia do$i
wartość$i - 2
, czyli zmniejsza$i
od2
.
Zadanie 1
W ciele HTML zostało umieszczone 101 klas odprogress-0
doprogress-100
. Twoim zadaniem jest przypisanie im odpowiedniej szerokości w procentach, która będzie odpowiadać nazwie klasy. Dodatkowo nieparzyste elementy powinny posiadać kolor#00F
, a parzyste#0F0
.
Przy wykonywaniu tego zadania skorzystaj z pętli i instrukcji warunkowych dostępnych w SASS.
Podsumowanie
W tej lekcji poznałeś operacje warunkowe i wszystkie 3 typy pętli dostępne w SASS. Dowiedziałeś się jak używać@if
,@else
i@else if
oraz jak wykorzystywać pętle i jakie problemy mogą one wywołać. Wiesz, że niebezpieczeństwem pętli@while
jest brak jej końca, co może spowodować zawieszenie się kompilatora.