2013-03-07 42 views
6

在這裏掌握LESS,但有一點仍不清楚。LESS CSS - 根據主體類別更改主題顏色的變量值

可以說我的網站有多個顏色主題,由body標籤上的一個類控制。從這我可以重新定義每個主題內的每個元素的各種顏色。如果我有很多元素需要改變,以及很多主題,那麼容易但相當耗時。每當我添加一個新的主題時,我都需要用不同的顏色值再次寫出所有的選擇器。

我立足我到目前爲止在另一篇文章中,我發現工作: LESS.css variable depending on class

...但是它似乎仍然對我想在做什麼,我還是得過於複雜,以寫出所有的選擇和在與顏色變量放入同一個CSS之前包含mixin。

我創建了一個CODEPEN HERE

我會很感激,如果任何人有時間去看看小和告訴我我怎麼能接近這個不同或我怎麼能簡化這一過程。

非常感謝的人誰幫助了:)

+1

是否有你想讓你的「主題」都在同一個CSS文件中嗎?看起來只要使用每個文件具有一個主題的備用樣式表就會變得非常簡單。 – cimmanon 2013-03-07 16:09:04

+0

嗨cimmanon。如果我只是使用CSS,我會沿着這條路線走下去。 我只是認爲在聲明後可能會有一種簡單的方法來改變實際的變量值,這意味着我只需要少量幾行就可以說出新的變量顏色在「.theme- 2「,然後一切都會改變顏色與這些新的變量值相關聯。儘管感謝您的建議。 – user1814828 2013-03-07 17:44:35

+0

我明白你想要什麼,但你還沒有回答我的問題。爲每個文件創建1個主題將是最簡單的主題化方法,並允許用戶避免下載他們不需要的樣式,因爲他們永遠不會使用除了他們選擇的(或默認)主題之外的其他任何東西。如果每個頁面都有自己的主題(即主題不可配置),那麼使用單獨的樣式表並不合理。 – cimmanon 2013-03-07 17:52:16

回答

14

假設你仍然有希望的主題是一個樣式表(而不是多張作爲cimmanon在評論中指出),並假設在你使用LESS 1.3。 2+,那麼以下代碼通過設置需要主題更改的類的循環來減少重複數量。

請注意,這對Codepen不起作用(它引發了錯誤uncaught throw #,可能是因爲它們運行的​​是較早版本的LESS),但您可以通過將代碼放入LESS's compiler來正確編譯。

LESS(基於關閉您Codepen代碼爲演示添加的主題)

////////////////////////////////////////////////////// 
// 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輸出(只顯示爲簡潔的環形主題CSS)

.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

非常感謝這位ScottS。我會嘗試使用正確版本的LESS。這段代碼將在未來對我非常有用,特別是對於較小的CSS區域。我認爲這將會是一個既將你和Cimmanon的評論加入未來並決定給定任務的最佳解決方案的案例。感謝你的答案。 – user1814828 2013-03-07 20:30:40

+0

我的較少版本是2.2.0,但它不起作用。我有一個錯誤:.buildThemes(@index)when(@index <@numberOfThemes + 1) – 2015-01-16 08:51:17

+0

好的文字是:.buildThemes(@index)when(@index <(@numberOfThemes + 1)) – 2015-01-16 09:18:57