摘要:具體操作如下這樣我們就可以自由的切換主題啦。這個時候只需要引入一份就行了,要切換樣式的時候修改的類標簽。,有沒有更好的切換主題的方案呢,求大佬指點參考
某一天,一個頭條的大佬問我,聽說你之前在項目里面弄過主題切換,你當時是怎么實現的可以詳說一下嗎?
如果已經對less了如指掌,直接從這里開始。
從less說起 使用Node.js 環境中使用 Less :
npm install -g less > lessc styles.less styles.css
在瀏覽器環境中使用 Less :
不過比較推薦的還是通過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; }
輸出(可以看到沒有通過前置條件的樣式被過濾了)
#outer .inner { color: blue; } .c { color: blue; }
帶參數混合,可以指定默認值,可以帶多個參數,使用時可以通過名稱賦值
.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參數
// 方式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; }
規則集混合
// declare detached ruleset @detached-ruleset: { background: red; }; // use detached ruleset .top { @detached-ruleset(); }函數
類似于先函數運算計算出變量的值,再通過變量的值設置屬性。
.mixin() { @width: 100%; @height: 200px; } .caller { .mixin(); width: @width; height: @height; }
輸出
.caller { width: 100%; height: 200px; }繼承
繼承另外一個選擇器的屬性,更多詳情
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參數
@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
循環.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%; }合并
逗號合并
.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
當幾種主題布局類似,幾乎只是顏色不同時,可以使用這種。
通過對less的了解(可以進行許多額外的騷操作哦),我們這里最簡單地編寫出如下less文件。
基礎樣式模版style.less,里面主要通過變量設置各個樣式
愛國紅樣式patriotic-red.less,設置變量的值
天空藍樣式sky-blue.less,設置不同的變量值
...
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%);
利用相關工具(或原始人手動lessc)提前編譯成patriotic-red.css和sky-blue.css文件。
這里簡單的假設頁面header中只引入了默認愛國紅——
同時存在一個按鈕,用戶點擊時切換主題。首先我們給按鈕綁定點擊事件,當用戶點擊時刪除當前導入的樣式,然后再引入另外一個樣式。具體操作如下:
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我們還可以通過給body添加類標簽來進行主題的切換。
新建一個style-mixin.less,里面內容如下——
.patriotic-red { @import "patriotic-red"; } .sky-blue { @import "sky-blue"; }
這里需要注意的是,在sky-blue.less或者patriotic-red.less中引入style.less時,需要使用(multiple)參數,否則會只編譯出一份樣式。編譯出來的樣式會自動加上.patriotic-red和sky-blue前綴。
這個時候只需要引入一份style-mixin.css就行了,要切換樣式的時候修改body的類標簽。
document,getElementsByTagName("body")[0].className="xxx"
題外話頭條大佬似乎并不是很認可方案1,他認為方案1會導致之前引入的樣式和后來的沖突?我沒有明白具體是什么意思,由于時間關系他也沒有解釋得很清楚,希望知道問題出在哪里的同學告訴我一下哦。
ps,有沒有更好的切換主題的方案呢,求大佬指點~
參考lesscss.cn
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/103533.html
摘要:具體操作如下這樣我們就可以自由的切換主題啦。這個時候只需要引入一份就行了,要切換樣式的時候修改的類標簽。,有沒有更好的切換主題的方案呢,求大佬指點參考 某一天,一個頭條的大佬問我,聽說你之前在項目里面弄過主題切換,你當時是怎么實現的可以詳說一下嗎? 如果已經對less了如指掌,直接從這里開始。 從less說起 使用 Node.js 環境中使用 Less : npm install -g...
摘要:具體操作如下這樣我們就可以自由的切換主題啦。這個時候只需要引入一份就行了,要切換樣式的時候修改的類標簽。,有沒有更好的切換主題的方案呢,求大佬指點參考 某一天,一個頭條的大佬問我,聽說你之前在項目里面弄過主題切換,你當時是怎么實現的可以詳說一下嗎? 如果已經對less了如指掌,直接從這里開始。 從less說起 使用 Node.js 環境中使用 Less : npm install -g...
摘要:其實這里還是有漏洞的,坐等高手指出來微笑臉后臺沒有用生成一個完整的架構。來自不同視圖的行為需要變更同一狀態。 最近對vue很感興趣,趁閑暇時間,模仿了wunderlist里面的部分功能,編寫了前后端分離的基于vue技術棧和express的todolist小項目。寫這篇博文來總結思考下。項目所在github,可以自行參考克隆。 本人博客 總體概覽 整個項目最終做成的樣子如下: showI...
摘要:有兩種方法,一種是在開發環境中設置通過的,另一種是在服務器上修改的配置設置。這樣我們以后使用訪問接口就可以不加了,打包后訪問也不用手動去除統一管理在項目開發過程中,會涉及到很多接口的處理,當項目足夠大時,就需要統一管理接口。 這篇文章總結了vue項目的所遇到的問題,包括跨域、用戶認證、接口統一管理、路由配置、兼容性處理,性能優化等內容。 項目github地址 : 前端 https:...
閱讀 940·2021-09-27 13:36
閱讀 888·2021-09-08 09:35
閱讀 1064·2021-08-12 13:25
閱讀 1437·2019-08-29 16:52
閱讀 2907·2019-08-29 15:12
閱讀 2726·2019-08-29 14:17
閱讀 2606·2019-08-26 13:57
閱讀 1012·2019-08-26 13:51