Trochę to trwało, ale wygląda na to, że powoli zaczynam nabierać tempa z rozwojem projektu. Odrobina wolnego czasu pozwoliła mi na ogarnięcie technologii z których będę korzystał (a gdy chcemy korzystać z nowości, czasem może zająć to dosyć długo). Ostatnio projektowałem wygląd aplikacji za pomocą mockup’ów. Nastała więc pora tchnąc trochę życia w projekt i napisać trochę kodu. Przyznam, że słaby ze mnie designer, więc nie będzie to takie proste. Jeżeli mowa o wyglądzie aplikacji webowej, raczej na pewno pojawi się temat CSS’ów. Nie jest to moja najmocniejsza strona, więc postanowiłem sobie trochę ułatwić ten temat. W tym celu sięgnąłem po Sass.
Co to jest Sass?
Sass, czyli Syntactically Awesome Style Sheets, to preprocesor języka CSS. Dodaje do niego funkcje, które nie są dostępne w podstawowej wersji CSS. Kod Sass jest kompilowany do zwykłego CSSa. W wyniku tej operacji otrzymujemy więc plik zawierający czysty CSS. Można zadać sobie pytanie: po co go używać, skoro ostatecznie uzyskujemy to samo? Jest takie powiedzenie, mówiące że Nie chodzi o cel, tylko o podróż. No i właśnie, korzystając z Sass podróż ta nie jest tak męcząca… Osobiście z CSS nie miałem aż tak dużo do czynienia. Praca ta polegała głównie na drobnych poprawkach, układaniu elementów etc. Motywy były już zwykle gotowe lub korzystałem z gotowych szablonów. Gdy dużo pracy poświęcamy upiększaniu naszej aplikacji za pomocą CSS, możemy jednak natrafić na wiele drobnych lub bardziej poważnych niedogodności.
Problemy z CSS
Pomine tutaj problemy, których użycie Sassa nie rozwiąże. Każdy, kto pracował z tą technologią miał czasem wrażenie, że żyje sobie własnym życiem. W moim przypadku wynika to zwykle z niewiedzy, ale nie zawsze.
A wracając do problemów, które Sass jest w stanie pomóc rozwiązać, to są to między innymi:
- Problem z kolorem motywów, gdy w naszych plikach CSS trzeba zmienić jakiś kolor, albo po prostu w wielu miejscach użyć tej samej barwy. Musimy kopiować lub pamiętać o jaki kolor chodzi
- Duplikacje kodu, gdy wiele elementów będzie miało ten sam styl i musimy powielać go wielokrotnie
- Nie mamy możliwości zagnieżdżaniastylów, co może powodować problem gdy musimy zmieniać nazwę jakiejś klasy lub identyfikatora. Dodatkowo wpływa to także na przejrzystość kodu
- Brak możliwości wykonywania obliczeń w naszych stylach, czasem chcemy żeby niektóre wartości były od siebie zależne. Musimy robić to ręcznie, czasem w wielu miejscach
- Import stylów, który jest obecny, ale powoduje wykonanie kolejnego zapytania do serwera po importowany styl
Sass na ratunek
Tutaj z pomocą przychodzi nam Sass. Daje on gotowe rozwiązania na powyższe problemy. Opowiem o nich w skrócie poniżej. Jak wcześniej wspomniałem, Sass to preprocesor języka CSS, przeglądarki nie wiedzą co z nim zrobić. Najpierw trzeba go przekompilować. Nie będę tego tutaj dokładnie opisywał, ponieważ to jak to zrobimy zależy od technologi w jakiej będziemy pracowali. Na początek polecam poćwiczyć online np. na CodePen. Wystarczy, że wybierzemy jako preprocesor SCSS i możemy zaczynać. Tutaj kolejna uwaga: do wyboru mamy dwie składnie Sassa: klasyczną (Sass), oraz nową (
Zmienne
Problemy związanie między innymi z kolorami rozwiązuje dodanie zmiennych:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//Zmienne $primaryColor: #3269ff; $secondaryColor: #ffdb34; $baseFontSize: 16px; h1 { color: $primaryColor; font-size: $baseFontSize + 10px; } h2 { color: $primaryColor; } a { color: $primaryColor; } p { font-size: $baseFontSize; background: $secondaryColor; } |
Dzięki nim jeżeli w wielu miejscach wykorzystujemy te same wartości, w przypadku zmiany możemy je łatwo podmienić. Na zmiennych można wykonywać także operacje. Tutaj dla przykładu nagłówek będzie większy od bazowego tekstu o 10px.
Zagnieżdżanie reguł
Zagnieżdżanie pozwala nam na usunięcie kodu który byłby powielany, oraz dodaje mu przejrzystości.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//Zagnieżdżanie reguł nav { font: { size: 14px; weight: bold; } float: left; ul { list-style-type: none; li { float: left; margin: 3px; a { text-decoration: none; &:hover { text-decoration: underline; } } } } } |
Dzięki temu zabiegowi na pierwszy rzut oka widać, które elementy są ze sobą powiązane. Dodatkowo elementy font
zostały pogrupowane razem, co też wpływa na ich czytelność.
Import
Dyrektywa @import
pozwana na modularyzację naszego kodu. Dzięki temu możemy dodać do projektu plik .scss
, który zawierać będzie tylko deklarację zmiennych z kolorami. W ten sposób łatwo dodawać różne motywy do naszej aplikacji. Poniżej przykładowy plik z deklaracją zmiennych przechowujących kolory.
1 2 3 4 |
//Plik colors.scss $primaryColor: Black; $secondaryColor: Blue; |
Następnie wykorzystujemy import pliku ze zmiennymi.
1 2 3 4 5 6 7 8 9 10 11 |
// plik ze stylami aplikacji @import 'colors'; a { color: $primaryColor; &:hover { color: $secondaryColor; } } |
Dzięki temu że importujemy plik .scss
, jako efekt tej operacji otrzymamy jeden plik zawierający całą zawartość obu tych plików. Jeżeli importowalibyśmy plik .css
, podczas importu musielibyśmy pobrać plik z serwera, przez co musielibyśmy wysłać kolejne żądanie na serwer.
Dziedziczenie reguł
Kolejna dyrektywa którą chcę przedstawić to @extend
. Dzięki niej możemy łatwiej definiować elementy posiadające te same style, różniące się tylko kilkoma szczegółami.
1 2 3 4 5 6 7 8 9 10 11 12 |
// Dziediczenie reguł .button-simple { border: 1px solid #ccc; padding: 4px; color: Blue; } .button-important { @extend .button-simple; color: Red; } |
Jako element wyjściowy tej operacji otrzymamy następujący kod CSS:
1 2 3 4 5 6 7 8 9 10 11 |
//Efekt wykorzystania @extend .button-simple, .button-important { border: 1px solid #ccc; padding: 4px; color: Blue; } .button-important { color: Red; } |
Jedyne zmiana to dodanie do deklaracji bazowej klasy naszej rozszerzonej implementacji, a na końcu dodanie pozostałej części. Zmiana niewielka, ale taki zapis łatwo pokazuje, że elementy te są ze sobą powiązane w logiczny sposób (pełnią podobną rolę). W przypadku gdy będziemy implementować wiele podobnych elementów, taki zapis jest moim zdaniem o wiele bardziej czytelny.
Powtarzalne reguły
Bardzo potężne narzędzie do jakiego daje nam dostęp Sass to dyrektywa @mixin
. Dzięki niej nie będziemy musieli powielać wielokrotnie tego samego kody dla różnych, niepowiązanych ze sobą elementów, które mają jednak wspólne cechy. Przykładowo możliwość dodania zaokrąglonych krawędzi. Można to zaimplementować w następujący sposób:
1 2 3 4 5 6 7 8 9 10 11 12 |
// Przykład dyrektywy @mixin @mixin rounded-corners($size: 5px) { border-radius: $size; -webkit-border-radius: $size; -moz-border-radius: $size; } //wykorzystanie @mixin .button-simple { @include rounded-corners(3px); } |
Taki kod sprawia, że możemy wykorzystać tą samą funkcję (funkcja nie do końca można to nazwać, ale pokazuje o co tutaj chodzi) do zaokrąglania krawędzi. Dodatkowo posiada ona parametr, który może mieć wartość domyślną, dzięki czemu wiele elementów które w różny sposób chcemy zaokrąglić może z niej skorzystać.
Funkcje
Kolejna dyrektywa w arsenale Sass to @function
. Dzięki niej możemy wydzielić fragment logiki, który będziemy mogli wielokrotnie użyć.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//Przykładowa funkcja $cell-size: 50px; $gutter-size: 10px; //Obliczenie rozmiaru tabeli @function grid-size($n) { return $n * $cell-size + ($n-1) * gutter-size; } #table-cats { width: grid-size(5); } //Wynik w CSS #table-cats { width: 290px; } |
Dzięki temu oszczędzimy czas na operacje, które będziemy wykonywać wielokrotnie.
Podsumowanie
Nie przedstawiłem wszystkich zalet, jakie niesie ze sobą używanie Sass w naszym projekcie. Jeżeli chcecie dowiedzieć się więcej na ten temat, zapraszam do przejrzenia dokumentacji. Wydaje mi się że warto spróbować, jeżeli ktoś nie miał jeszcze styczności z tego typu technologiami. Na rynku jest oczywiście wiele innych rozwiązań, które pełnią podobną fukncję: LESS, Stylus, PostCSS. Niezależnie od naszego wyboru, wydaje mi się, że zawsze będzie to krok na przód.