Ktokolwiek, kto pisał dłuższy lub bardziej skomplikowany arkusz stylów CSS, wie jakim bólem siedzenia potrafi to być. Nie chodzi tu nawet o same style, których interakcje między sobą oraz z zawierającymi je selektorami mogą czasem być cokolwiek zagadkowe (tak, marginy i paddingi – o was mówię). Rzecz w tym, że sam język CSS jest po prostu biedny – nie tyle w zakresie możliwości (w końcu jest zupełny w sensie Turinga), co wygody użytkowania. Brakuje mu chociażby kilku kluczowych konstrukcji, jakich można by się spodziewać. Dobrym przykładem są stałe (zmienne) i możliwość wykonywania na nich operacji arytmetycznych – choćby w celu policzenia zależnych od siebie marginesów.
Z tą bolączką można sobie oczywiście radzić we własnym zakresie, podłączając na przykład arkusze CSS pod system szablonów normalnie używany do generowania stron HTML na poziomie serwera. Nie wydaje się to jednak najlepszym możliwym sposobem na zużywanie jego zasobów. Istnieją też na pewno bardziej interesujące rzeczy, które mógłby zrobić programista w czasie, gdy będzie takie (z natury raczej specyficzne) rozwiązanie implementował.
I tutaj pojawia się bardzo ciekawy projekt o nazwie LESS, rozszerzający składnię CSS-a o wiele przydatnych elementów, jakich domyślnie w nim nie uświadczymy. Najfajniejsze jest przy tym to, że trik ten odbywa się po stronie klienta przy pomocy odpowiedniego skryptu JavaScript. Możemy więc korzystać z niego niezależnie od backendu naszego serwera czy nawet w ogóle bez serwera, tj. do stron bez dynamicznie generowanej treści. Integracja jest zaś bardzo prosta: sprowadza się do dodania jednego znacznika
<script>
(oczywiście) oraz lekkiej modyfikacji referencji do arkuszy stylów, czyli znaczników <link rel="stylesheet">
.
Co dostajemy w zamian? Oprócz wspomnianych na początku zmiennych i operacji na nich, mamy też w LESS-ie “funkcje” (czy raczej makra) z parametrami. Pozwala to chociażby na łatwiejsze dostarczanie stylów specyficznych dla przeglądarek. Możliwe jest też np. importowanie kodu z innych arkuszy LESS, zagnieżdżanie selektorów oraz… wstawianie komentarzy w stylu C++ :)
Powyższe wyliczenie dodatków nie brzmi może bardzo imponująco, lecz nie jest to wcale dziwne. Tak naprawdę sam CSS już dawno powinien oferować tego rodzaju możliwości. Wiemy jednak, jak jest w rzeczywistości. Sądzę więc, że tym bardziej warto jest używać rozwiązania, które zamienia CSS w coś, czego można w końcu normalnie używać :)
Szkoda, że wymaga JS. CSSom potrzebny jest po prostu preprocesor C ;)
@Xion
Uzależnianie wyglądu strony od działania js (który z różnych względów może nie działać) czasami urywa nogi ;) Imho preprocessor po stronie serwera (niekoniecznie w momencie serwowania a w momencie deployowania aplikacji/commitowania) jest o wiele bezpieczniejszy. Trochę automatyki i się nie zauważa.
Zobacz jeszcze coffescript, haml, zen-coding…
Naturalnie LESS jest fajny tylko i wyłącznie, jeśli obsługa JavaScriptu jest zapewniona. Inaczej mówiąc, bez niego strona nie będzie działać w ogóle. Miałem nadzieję, że to jest oczywiste i dlatego o tym nie wspomniałem :)
Xion:
Tak, ta część jest oczywista, bardziej chodzi mi o np. błąd popełniony w javascript który uniemożliwia załadowanie reszty zależności.
Zawsze można spróbować zastosować zasadę progresywnego ulepszenia. Standardowe elementy zrobić CSS, a jakieś dodatkowe bajery ogarnąć właśnie tym mechanizmem:)
@Jarek: Nie wystarczy umieścić deklaracji <script> LESS-a jako pierwszej, przed wszystkimi innymi? Czy wtedy ewentualny błąd w dalszych skryptach wpłynie też uruchomienie kodu w tym pierwszym?
@Jerzy Piechowiak: Tu nie ma żadnych niestandardowych bajerów. LESS oferuje dokładnie takie same możliwości co zwykły CSS, tylko w wygodniejszej, bardziej przejrzystej i funkcjonalnej składni. Sens ma więc stosowanie go wszędzie.
@Xion
Tak racja, później widziałem więcej przykładów na stronie projektu.
Ciekawą alternatywą jest Sass, czyli superset biednego cssa. Dodaje dokładnie to, czego nam brakuje najczęściej :) no i nie wymaga JS.
CSS zupełny w sensie Turinga? Mnie uczyli, że kompletny jest, gdy można zapisać każdy algorytm…