2013-03-07 5 views
6

Zajmuje się tutaj LESS, ale jedno jest wciąż niejasne.LESS CSS - Zmień wartość zmiennej dla kolorów motywów w zależności od klasy ciała

Powiedzmy, że mam wiele motywów kolorystycznych dla mojej witryny, kontrolowanych przez klasę na znaczniku body. Dzięki temu mogę przedefiniować różne kolory dla każdego elementu w ramach każdego motywu. Wystarczająco łatwe, ale dość czasochłonne, jeśli mam wiele elementów do zmiany ... i wiele tematów. Za każdym razem, gdy dodaję nowy motyw, muszę ponownie wypisać wszystkie selektory, z różnymi wartościami kolorów.

ja opierając moją pracę tak daleko na innym poście znalazłem: LESS.css variable depending on class

... Jednak wciąż wydaje się zbyt skomplikowane dla co chcę zrobić, że mam jeszcze napisać wszystkie selektorów i włącz mixin zanim wpadniesz do tego samego CSS ze zmienną koloru.

Stworzyłem CODEPEN HERE

bym wdzięczny, gdyby ktoś miał czas, aby zająć trochę wygląd i mi doradzić w jaki sposób mógłbym podejść do tego inaczej lub jak mogę usprawnić ten proces.

Wielkie dzięki dla każdego, kto przyczynia się :)

+1

Czy istnieje dlaczego chcesz, aby twoje "motywy" były w tym samym pliku CSS? Wygląda na to, że znacznie łatwiej byłoby po prostu użyć alternatywnych arkuszy stylów z jednym motywem na plik. – cimmanon

+0

Cześć cimmanon. Gdybym tylko używał CSS, zszedłbym tą drogą. Po prostu pomyślałem, że może istnieć łatwy sposób na zmianę rzeczywistej wartości zmiennej po jej zadeklarowaniu, co oznacza, że ​​potrzebowałbym tylko kilku linii mniej, by powiedzieć, jakie nowe zmienne kolory znajdowały się w ".theme- 2 "i wszystko zmieniłoby kolor w związku z tymi nowymi wartościami zmiennymi. Dzięki za Twoją sugestię. – user1814828

+0

Rozumiem, czego chcesz, ale nie odpowiedziałeś na moje pytanie. Utworzenie 1 motywu na plik byłoby najprostszym sposobem na zrobienie motywu i pozwoliłoby użytkownikowi uniknąć pobierania stylów, których nie potrzebują, ponieważ nigdy nie będą używać niczego innego niż wybrany (lub domyślny) motyw. Jeśli każda strona ma swój własny motyw (np. Motywy nie są konfigurowalne), to przechodzenie z poszczególnymi arkuszami stylów nie ma większego sensu. – cimmanon

Odpowiedz

14

Zakładając, że pozostanie z chcąc tematu to w ciągu jednego arkusza stylów (a nie wielu arkuszach jako cimmanon odnotowanych w komentarzach), a zakładając używasz MNIEJ 1.3. 2+, następnie następujący kod działa w celu zmniejszenia ilości duplikacji poprzez ustawienie pętli przez klasy, które wymagają zmian motywu.

Należy pamiętać, że to nie działa na Codepen (to jest rzucanie błąd uncaught throw #, być może dlatego, że korzystasz ze starszej wersji mniej), ale widać, że kompilowanie prawidłowo umieszczając kod do LESS's compiler.

mniej (oparte off kod Codepen z dodatkiem tematu demo)

////////////////////////////////////////////////////// 
// CONSTANTS 

@lightColour: #fff; 
@darkColour: #000; 
@lightBg: #fff; 
@darkBg: #000; 
@numberOfThemes: 3; //controls theme loop 

////////////////////////////////////////////////////// 
// MIXINS 

//Theme Definitions by parametric mixin numbers (1), (2), etc. 
.themeDefs(1) { 
    @lightColour: #f00; 
    @darkColour: #fff; 
    @lightBg: #f00; 
    @darkBg: #fff; 
} 

.themeDefs(2) { 
    //inverse of 1 
    @lightColour: #fff; 
    @darkColour: #f00; 
    @lightBg: #fff; 
    @darkBg: #f00; 
} 

.themeDefs(3) { 
    @lightColour: #cfc; 
    @darkColour: #363; 
    @lightBg: #cfc; 
    @darkBg: #363; 
} 


.curvy { 
    -moz-border-radius: 5px; 
    -webkit-border-radius: 5px; 
    border-radius: 5px; 
} 

////////////////////////////////////////////////////// 
// GENERAL STYLING 

* {padding: 0;margin: 0;} 
html {text-align: center;} 
h2 {padding: 20px 0;} 

.box { 
    .curvy; 
    color: @lightColour; 
    background: @darkBg; 
    display:inline-block; width:10%; padding:20px 5%; margin:0 1% 20px 1%; 
} 

////////////////////////////////////////////////////// 
// THEME BUILDING 

.buildThemes(@index) when (@index < @numberOfThemes + 1) { 

    [email protected]{index} { 
     .themeDefs(@index); 
     color: @lightColour; 
     background: @darkBg; 

     .box { 
     color: @darkColour; 
     background: @lightBg; 
     } 
    } 
    .buildThemes(@index + 1); 
} 
//stop loop 
.buildThemes(@index) {} 
//start theme building loop 
.buildThemes(1); 

CSS wyjścia (tylko pokazano zapętlone css temat dla zwięzłość)

.theme-1 { 
    color: #ff0000; 
    background: #ffffff; 
} 
.theme-1 .box { 
    color: #ffffff; 
    background: #ff0000; 
} 
.theme-2 { 
    color: #ffffff; 
    background: #ff0000; 
} 
.theme-2 .box { 
    color: #ff0000; 
    background: #ffffff; 
} 
.theme-3 { 
    color: #ccffcc; 
    background: #336633; 
} 
.theme-3 .box { 
    color: #336633; 
    background: #ccffcc; 
} 
+0

Bardzo dziękuję za ten ScottS. Wypróbuję to z poprawną wersją LESS. Ten fragment kodu będzie dla mnie bardzo przydatny w przyszłości, zwłaszcza w przypadku mniejszych obszarów CSS. Myślę, że będzie to przypadek wzięcia na pokład zarówno swoich, jak i cimmanona, komentarzy w przyszłości i podjęcia decyzji o najlepszym rozwiązaniu dla danego zadania. Dziękuję za obie odpowiedzi. – user1814828

+0

Moja mniejsza wersja to 2.2.0, ale nie działa. Mam błąd w: .buildThemes (@ index) when (@ index <@ numberumber = 1) –

+0

Dobre pismo to: .buildThemes (@ index) when (@ index <(@numberOfThemes + 1)) –

Powiązane problemy