摘要:具體操作如下這樣我們就可以自由的切換主題啦。這個(gè)時(shí)候只需要引入一份就行了,要切換樣式的時(shí)候修改的類標(biāo)簽。,有沒(méi)有更好的切換主題的方案呢,求大佬指點(diǎn)參考
某一天,一個(gè)頭條的大佬問(wèn)我,聽說(shuō)你之前在項(xiàng)目里面弄過(guò)主題切換,你當(dāng)時(shí)是怎么實(shí)現(xiàn)的可以詳說(shuō)一下嗎?
如果已經(jīng)對(duì)less了如指掌,直接從這里開始。
從less說(shuō)起 使用Node.js 環(huán)境中使用 Less :
npm install -g less > lessc styles.less styles.css
在瀏覽器環(huán)境中使用 Less :
不過(guò)比較推薦的還是通過(guò)webpack或者gulp等工具先將less編譯成css,然后再引入使用。
變量@nice-blue: #5B83AD; @light-blue: @nice-blue + #111; #header { color: @light-blue; }混合
常用
.bordered { border-top: dotted 1px black; &:hover { border: 1px solid red; } // 同樣可以包含選擇器混用 } .post a { color: red; .bordered !important; // 可以在屬性后面都加上!important }
編譯后不輸出至css文件
.my-other-mixin() { background: white; }
作用域混合
#outer { .inner() { color: red; } } #outer1 { .inner() { color: blue; } } .c { #outer > .inner; }
輸出
.c { color: red; }
擁有前置條件的作用域混合,更多詳情
@mode: little; #outer when (@mode=huge) { .inner { color: red; } } #outer when (@mode=little) { .inner { color: blue; } } .c { #outer > .inner; }
輸出(可以看到?jīng)]有通過(guò)前置條件的樣式被過(guò)濾了)
#outer .inner { color: blue; } .c { color: blue; }
帶參數(shù)混合,可以指定默認(rèn)值,可以帶多個(gè)參數(shù),使用時(shí)可以通過(guò)名稱賦值
.mixin(@color: black; @margin: 10px; @padding: 20px) { color: @color; margin: @margin; padding: @padding; } .class1 { .mixin(@margin: 20px; @color: #33acfe); } .class2 { .mixin(#efca44; @padding: 40px); }
使用@arguments
.mixin(@a; @b) { margin: @arguments; right:extract(@arguments,2); top:@b; } p {.mixin(1px; 2px);}
輸出
p { margin: 1px 2px; right: 2px; top: 2px; }
使用@rest參數(shù)
// 方式1 .mixin(@listofvariables...) { border: @listofvariables; } p { .mixin(1px; solid; red); } // 方式2 .mixin(@a; ...) { color: @a;} .mixin(@a) { background-color: contrast(@a); width:100%;} .mixin(@a; @b;) { background-color: contrast(@a); width:@b;} p { .mixin(red); } p.small { .mixin(red,50%); }
輸出
/*方式1*/ p { border: 1px solid red; } /*方式2*/ p { color: red; background-color: #ffffff; width: 100%; } p.small { color: red; background-color: #ffffff; width: 50%; }
模式匹配混合
.mixin(dark; @color) { color: darken(@color, 10%); } .mixin(light; @color) { color: lighten(@color, 10%); } .mixin(@_; @color) { display: block; } @switch: light; .class { .mixin(@switch; #888); }
輸出
.class { color: #a2a2a2; display: block; }
規(guī)則集混合
// declare detached ruleset @detached-ruleset: { background: red; }; // use detached ruleset .top { @detached-ruleset(); }函數(shù)
類似于先函數(shù)運(yùn)算計(jì)算出變量的值,再通過(guò)變量的值設(shè)置屬性。
.mixin() { @width: 100%; @height: 200px; } .caller { .mixin(); width: @width; height: @height; }
輸出
.caller { width: 100%; height: 200px; }繼承
繼承另外一個(gè)選擇器的屬性,更多詳情
nav ul { &:extend(.inline); background: blue; } // &是父類型選擇器,指代的是nav ul .inline { color: red; }
輸出
nav ul { background: blue; } .inline, nav ul { color: red; }嵌套
#header { color: black; .navigation { font-size: 12px; } .logo { width: 300px; } }引入
@import "foo"; // foo.less is imported @import "foo.less"; // foo.less is imported @import "foo.php"; // foo.php imported as a less file @import "foo.css"; // statement left in place, as-is參數(shù)
@import (keyword) "filename";
reference: use a Less file but do not output it
inline: include the source file in the output but do not process it
less: treat the file as a Less file, no matter what the file extension
css: treat the file as a CSS file, no matter what the file extension
once: only include the file once (this is default behavior)
multiple: include the file multiple times
optional: continue compiling when file is not found
循環(huán).generate-columns(4); .generate-columns(@n, @i: 1) when (@i =< @n) { .column-@{i} { width: (@i * 100% / @n); } .generate-columns(@n, (@i + 1)); }
輸出
.column-1 { width: 25%; } .column-2 { width: 50%; } .column-3 { width: 75%; } .column-4 { width: 100%; }合并
逗號(hào)合并
.mixin() { box-shadow+: inset 0 0 10px #555; } .myclass { .mixin(); box-shadow+: 0 0 20px black; }
輸出
.myclass { box-shadow: inset 0 0 10px #555, 0 0 20px black; }
空格合并
.mixin() { transform+_: scale(2); } .myclass { .mixin(); transform+_: rotate(15deg); }
輸出
.myclass { transform: scale(2) rotate(15deg); }切換主題樣式 方案1
當(dāng)幾種主題布局類似,幾乎只是顏色不同時(shí),可以使用這種。
通過(guò)對(duì)less的了解(可以進(jìn)行許多額外的騷操作哦),我們這里最簡(jiǎn)單地編寫出如下less文件。
基礎(chǔ)樣式模版style.less,里面主要通過(guò)變量設(shè)置各個(gè)樣式
愛國(guó)紅樣式patriotic-red.less,設(shè)置變量的值
天空藍(lán)樣式sky-blue.less,設(shè)置不同的變量值
...
style.less里樣式類似這樣
a, .link { color: @link-color; } a:hover { color: @link-color-hover; } .widget { color: #fff; background: @link-color; }
patriotic-red.less里樣式類似這樣
@import "style"; @link-color: #f03818; @link-color-hover: darken(@link-color, 10%);
sky-blue.less里樣式類似這樣
@import "test"; @link-color: #428bca; @link-color-hover: darken(@link-color, 10%);
利用相關(guān)工具(或原始人手動(dòng)lessc)提前編譯成patriotic-red.css和sky-blue.css文件。
這里簡(jiǎn)單的假設(shè)頁(yè)面header中只引入了默認(rèn)愛國(guó)紅——
同時(shí)存在一個(gè)按鈕,用戶點(diǎn)擊時(shí)切換主題。首先我們給按鈕綁定點(diǎn)擊事件,當(dāng)用戶點(diǎn)擊時(shí)刪除當(dāng)前導(dǎo)入的樣式,然后再引入另外一個(gè)樣式。具體操作如下:
function toggleThemeClick() { let a = document.getElementsByTagName("link"); let aHref = a[0].getAttribute("href").slice(2, -4); a[0].parentElement.removeChild(a[0]); let b = document.createElement("link"); b.setAttribute("rel", "stylesheet"); if ("patriotic-red" === aHref) { b.setAttribute("href", "./sky-blue.css"); } else { b.setAttribute("href", "./patriotic-red.css"); } document.getElementsByTagName("head")[0].appendChild(b); }
這樣我們就可以自由的切換主題啦。
方案2我們還可以通過(guò)給body添加類標(biāo)簽來(lái)進(jìn)行主題的切換。
新建一個(gè)style-mixin.less,里面內(nèi)容如下——
.patriotic-red { @import "patriotic-red"; } .sky-blue { @import "sky-blue"; }
這里需要注意的是,在sky-blue.less或者patriotic-red.less中引入style.less時(shí),需要使用(multiple)參數(shù),否則會(huì)只編譯出一份樣式。編譯出來(lái)的樣式會(huì)自動(dòng)加上.patriotic-red和sky-blue前綴。
這個(gè)時(shí)候只需要引入一份style-mixin.css就行了,要切換樣式的時(shí)候修改body的類標(biāo)簽。
document,getElementsByTagName("body")[0].className="xxx"
題外話頭條大佬似乎并不是很認(rèn)可方案1,他認(rèn)為方案1會(huì)導(dǎo)致之前引入的樣式和后來(lái)的沖突?我沒(méi)有明白具體是什么意思,由于時(shí)間關(guān)系他也沒(méi)有解釋得很清楚,希望知道問(wèn)題出在哪里的同學(xué)告訴我一下哦。
ps,有沒(méi)有更好的切換主題的方案呢,求大佬指點(diǎn)~
參考lesscss.cn
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/114455.html
摘要:具體操作如下這樣我們就可以自由的切換主題啦。這個(gè)時(shí)候只需要引入一份就行了,要切換樣式的時(shí)候修改的類標(biāo)簽。,有沒(méi)有更好的切換主題的方案呢,求大佬指點(diǎn)參考 某一天,一個(gè)頭條的大佬問(wèn)我,聽說(shuō)你之前在項(xiàng)目里面弄過(guò)主題切換,你當(dāng)時(shí)是怎么實(shí)現(xiàn)的可以詳說(shuō)一下嗎? 如果已經(jīng)對(duì)less了如指掌,直接從這里開始。 從less說(shuō)起 使用 Node.js 環(huán)境中使用 Less : npm install -g...
摘要:具體操作如下這樣我們就可以自由的切換主題啦。這個(gè)時(shí)候只需要引入一份就行了,要切換樣式的時(shí)候修改的類標(biāo)簽。,有沒(méi)有更好的切換主題的方案呢,求大佬指點(diǎn)參考 某一天,一個(gè)頭條的大佬問(wèn)我,聽說(shuō)你之前在項(xiàng)目里面弄過(guò)主題切換,你當(dāng)時(shí)是怎么實(shí)現(xiàn)的可以詳說(shuō)一下嗎? 如果已經(jīng)對(duì)less了如指掌,直接從這里開始。 從less說(shuō)起 使用 Node.js 環(huán)境中使用 Less : npm install -g...
摘要:其實(shí)這里還是有漏洞的,坐等高手指出來(lái)微笑臉后臺(tái)沒(méi)有用生成一個(gè)完整的架構(gòu)。來(lái)自不同視圖的行為需要變更同一狀態(tài)。 最近對(duì)vue很感興趣,趁閑暇時(shí)間,模仿了wunderlist里面的部分功能,編寫了前后端分離的基于vue技術(shù)棧和express的todolist小項(xiàng)目。寫這篇博文來(lái)總結(jié)思考下。項(xiàng)目所在github,可以自行參考克隆。 本人博客 總體概覽 整個(gè)項(xiàng)目最終做成的樣子如下: showI...
摘要:有兩種方法,一種是在開發(fā)環(huán)境中設(shè)置通過(guò)的,另一種是在服務(wù)器上修改的配置設(shè)置。這樣我們以后使用訪問(wèn)接口就可以不加了,打包后訪問(wèn)也不用手動(dòng)去除統(tǒng)一管理在項(xiàng)目開發(fā)過(guò)程中,會(huì)涉及到很多接口的處理,當(dāng)項(xiàng)目足夠大時(shí),就需要統(tǒng)一管理接口。 這篇文章總結(jié)了vue項(xiàng)目的所遇到的問(wèn)題,包括跨域、用戶認(rèn)證、接口統(tǒng)一管理、路由配置、兼容性處理,性能優(yōu)化等內(nèi)容。 項(xiàng)目github地址 : 前端 https:...
閱讀 1002·2021-09-30 09:58
閱讀 2829·2021-09-09 11:55
閱讀 2000·2021-09-01 11:41
閱讀 991·2019-08-30 15:55
閱讀 3349·2019-08-30 12:50
閱讀 3495·2019-08-29 18:37
閱讀 3294·2019-08-29 16:37
閱讀 2010·2019-08-29 13:00