Dynamiczny CSS
wtorek, 8 września 2009
Ten tekst został zainspirowany postem na blogu
nme.pl.
Zaprezentowane rozwiązanie zainteresowało mnie, ze względu na pewne analogie do moich eksperymentów z gradientami
Wprowadzenie
Na początek muszę napisać że nie jestem zwolennikiem opisywanych technik.
Powinno być tak, że
- HTML zawiera treść strony,
- CSS opisuje jej wygląd,
- natomiast JavaScript zachowanie.
Tyle teorii, w praktyce i tak wszystko wychodzi zupełnie inaczej.
JavaScript często wspomaga warstwę prezentacyjną, omijając liczne ograniczenia przeglądarek.
Do rzeczy. Istnieje kilka sposobów na modyfikację stylów.
Inline CSS
Najprostszy, polega na modyfikacji właściwości style danego elementu. Jest to łatwy w użyciu i mało elegancki sposób. Jako jedyny działa identycznie na każdej przeglądarce.
W3C DOM CSS Level 2
Oficjalnie istnieje API pozwalające modyfikować style, zdefiniowane za pomocą elementów link i style.
Style opisuje właściwość document.styleSheets
… i na tym koniec, bo obiekt, który otrzymamy nie doczekał się spójnej implementacji. Różnice pomiędzy przeglądarkami zabijają. API wygląda jak jakiś ponury żart. Dokumentacja jest żałosna. Nic dziwnego że rozwiązanie nie zdobyło popularności.
Modyfikacja elementu Style
Jest jeszcze jedna metoda. Użyłem jej przy okazji moich zabaw z gradientami. Wystarczy stworzyć własny element style i wypełnić go treścią. Ma to niezaprzeczalny urok — jest bajecznie proste. Wady? W IE próba modyfikacji elementów style kończy się błędem Unknown error
.
Jak nie kijem, to pałką
Z koślawym API modelu DOM CSS, zmierzył się Nme na swoim blogu. W efekcie powstała całkiem elegancka biblioteka.
Oto przykład użycia:
css.replace('.asd',{'color':'green'});
Metodologia jest wzorowana na jQuery. Nie będę dokładniej opisywał samej biblioteki, wszystko można znaleźć u źródeł.
To o czym chcę podzielić to moje przemyślenia nad dostępnymi możliwościami modyfikowania stylów. Dla tego właśnie zacząłem od małego podsumowania.
Zaskakujące jest słabe wsparcie dla modelu W3C. Dla przykładu Firebug nie pokazuje stylów modyfikowanych w ten sposób. Wygląda na to że Mozilla Fundation utraciła dawny zapał do implementowania standardów, gdy nie mają one wsparcia ze strony swojego głównego konkurenta. Czasy świętych wojen document.getElementById vs document.all minęły już bezpowrotnie.
Dotychczas ignorowałem document.styleSheets, dla tego że nie chciało mi się wnikać w szczegóły poszczególnych implementacji.
Oryginalny interfejs, pomijając liczne wady, ma jednak pewną miłą cechę: Daje dostęp do właściwości style:
document.styleSheets[0].cssRules[0].style.color = '#00c'
Jedyne czego brakuje, to możliwość łatwego wyszukiwania odpowiedniego opisu z użyciem selektorów CSS, może wystarczyło by zaimplementować tylko ten fragment?
$.css(".asd").color = "#00c";
Na razie to tylko luźny pomysł…
Linkownia
- Specyfikacja DOM-Level-2-Style z 2000 roku. Po dziewięciu latach, IE nadal nie jest z nią zgodny. To by było na tyle jeśli chodzi o mit jakoby ta przeglądarka w pełni obsługiwała standardy.
- Tabela kompatybilności, ułatwiająca zorientować się w gąszczu pytań
kto
ijak
. - Zestawienie obiektów modelu DOM
- www.hunlock.com Opis, wraz z przykładami.
- nme.pl Omawiana biblioteka..
Etykiety: css, javascript, programowanie, R
Red 00:42
Prześlij komentarz