web網(wǎng)頁中主題切換的實(shí)現(xiàn)思路

網(wǎng)頁中切換主題腺逛,實(shí)際上就是在對(duì)網(wǎng)頁中的元素設(shè)置不同的樣式所呈現(xiàn)出來的整體顯示效果的切換

比如上圖中nutz官網(wǎng)可以發(fā)現(xiàn)荷愕,亮色與暗色主題對(duì)比,網(wǎng)頁結(jié)構(gòu)布局是完全一致的棍矛,背景色一黑一白安疗,文字顏色也改成了對(duì)應(yīng)背景色可讀性良好的顏色。

實(shí)現(xiàn)思路

先說結(jié)論茄靠,總結(jié)成一句話就是 “加載對(duì)應(yīng)的css茂契,后加載的css覆蓋默認(rèn)顯示樣式,即可達(dá)到換主題的目的”慨绳,具體的實(shí)現(xiàn)分為2步:

  1. 準(zhǔn)備兩份不同主題的css
  2. 使用js實(shí)現(xiàn)切換(加載)css的方法

生成不同主題的css

不同主題的css差異主要體現(xiàn)在顏色這個(gè)概念上掉冶,理論上只要有使用顏色的地方都需要進(jìn)行適當(dāng)?shù)恼{(diào)整,比如文字顏色脐雪,背景色厌小,邊框顏色等等。簡單來說就是白底陪黑字战秋,黑底用白字璧亚,如果是采用了灰度色,則根據(jù)現(xiàn)實(shí)情況進(jìn)行適度調(diào)整或無需調(diào)整脂信。最簡單的調(diào)整顏色的方法是使用適當(dāng)?shù)墓ぞ邅砩蒫ss癣蟋,比如less透硝,scss等

用bs4來實(shí)現(xiàn)

nutz官網(wǎng)采用了bootstrap4(下文簡稱為bs4)作為前端樣式庫,bs4本身就采用了scss進(jìn)行編寫疯搅,在源碼的基礎(chǔ)上進(jìn)行主題的設(shè)置可以說是非常的簡單濒生。先看下bs4本身是怎么做的

bs4根據(jù)功能將css內(nèi)容拆散放置在不同的scss文件中,最終通過bootstrap.scss將所有模塊引入后編譯成最終的css
其中最關(guān)鍵的variables.scss定義了樣式所有變量幔欧,包括顏色罪治,各種寬度大小等等

所以需要實(shí)現(xiàn)一個(gè)不同顏色的主題,只需要修改variables.scss中屬性即可礁蔗,然后不同主題的variables.scss即可編譯多份不同的bootstrap.scss荧琼。
bs4本身也提供了custom.scss供你修改默認(rèn)的屬性惶傻,所以將變更內(nèi)容放這里更好所坯,避免在未來更新bs4本身時(shí)引發(fā)一些不必要的麻煩纳胧。

也就是將需要修改的顏色的部分放到custom.scss中,替換到現(xiàn)有的bootstrap.scss中再編譯滋饲。

nutzam的主題

  1. 將bootstrap.scss復(fù)制2份厉碟,分別命名為nutzbs_dark.scss與nutzbs_light.scss
  2. 新建nutzbs-custom_dark.scss,nutzbs-custom_light.scss分別替換掉主題文件中的custom.scss
  3. 新建一個(gè)nutzam.scss加入到主題文件的最后
  4. 根據(jù)需要修改bs自帶的控件并進(jìn)行替換

這樣最終nutzbs_dark.scss與nutzbs_light.scss分別編譯出來就是兩份主題css文件

準(zhǔn)備工作好了,下面說下幾個(gè)文件文件具體的修改屠缭。

nutzam.scss

該文件主要是nutzam首頁中自定義樣式的存放位置箍鼓,放在主題文件的最后是因?yàn)榉奖闶褂胋s提供的各種屬性與方法
nutzam所使用的顏色除了bs提供的,自定義的顏色也要使用變量的方式進(jìn)行引用然后分別在nutzbs-custom_dark.scss與nutzbs-custom_light.scss設(shè)置

custom_dark與custom_light

顧名思義這里就是修改對(duì)應(yīng)顏色的地方呵曹,也就是覆蓋variables.scss中定義的顏色來達(dá)到對(duì)應(yīng)主題需要的效果款咖。

因?yàn)槟J(rèn)的bs4就是一種白底為主的樣式,所以light主題基本不用修改奄喂,僅僅將nutzam自定義的顏色放在這里铐殃。dark主題將需要修改的顏色從variables.scss中copy過來,然后修改成需要的顏色即可跨新。

這里有一點(diǎn)需要注意富腊,就是variables.scss中copy過來的顏色都帶有 !default 字樣,修改時(shí)一定要去掉域帐。
!default 標(biāo)記表示該屬性在沒有其他值的時(shí)候的默認(rèn)值赘被,如果這里還帶著將不會(huì)起到替換variables.scss樣式的效果

切換主題的方法

可以先將默認(rèn)主題寫到頁面中,然后通過js觸發(fā)事件加載其他主題的css肖揣。后加載的css會(huì)覆蓋之前樣式從而達(dá)到切換主題的效果民假。

下面給出我的一種實(shí)現(xiàn)思路,先將亮色主題加入到頁面中

<link rel="stylesheet" type="text/css" href="/css/nutzbs_light.css">

然后實(shí)現(xiàn)兩個(gè)方法龙优,添加/刪除暗色主題

// 添加暗色主題
function addDarkTheme() {
   var link = document.createElement('link');
   link.type = 'text/css';
   link.id = "theme-css-dark";  // 加上id方便后面好查找到進(jìn)行刪除
   link.rel = 'stylesheet';
   link.href = '/css/nutzbs_dark.css';
   document.getElementsByTagName("head")[0].appendChild(link);
}
// 刪除暗色主題
function removeDarkTheme() {
   $('#theme-css-dark').remove();
}

接著實(shí)現(xiàn)一個(gè)方法來進(jìn)行切換即可

// 使用暗色主題
function useDarkTheme(useDark) {
   if (useDark) {
       addDarkTheme();
   } else {
       removeDarkTheme();
   }
}

保持選中的主題

如果你按照上面的實(shí)現(xiàn)了就會(huì)發(fā)現(xiàn)一個(gè)問題羊异,當(dāng)前頁面切換好了主題以后,切換到其他頁面又變成了默認(rèn)主題,這里就需要解決這個(gè)保持當(dāng)前選中主題的問題

因?yàn)槭庆o態(tài)網(wǎng)頁野舶,所以通過cookie來記錄選中的樣式是最好的方案易迹。這里推薦一個(gè)jq庫js-cookie,可以很方便管理cookie平道。

加入該庫后修改上面的方法

// 獲取cookie中選中的主題名稱赴蝇,沒有就給個(gè)默認(rèn)的
function getThemeCSSName() {
   return Cookies.get('nutzam-theme') || "light";
}
// 使用暗色主題(記錄選擇到cookie中)
function useDarkTheme(useDark) {
   Cookies.set('nutzam-theme', useDark ? "dark" : "light");
   if (useDark) {
       addDarkTheme();
   } else {
       removeDarkTheme();
   }
}

然后在頁面加載完成后,調(diào)用一下該方法即可, 切換其他頁面也就自動(dòng)的切換到選中的主題了

$(document).ready(function () {
    useDarkTheme(getThemeCSSName() == 'dark');
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巢掺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子劲蜻,更是在濱河造成了極大的恐慌陆淀,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件先嬉,死亡現(xiàn)場離奇詭異轧苫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疫蔓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門含懊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人衅胀,你說我怎么就攤上這事岔乔。” “怎么了滚躯?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵雏门,是天一觀的道長。 經(jīng)常有香客問我掸掏,道長茁影,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任丧凤,我火速辦了婚禮募闲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘愿待。我一直安慰自己浩螺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布呼盆。 她就那樣靜靜地躺著年扩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪访圃。 梳的紋絲不亂的頭發(fā)上厨幻,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼况脆。 笑死饭宾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的格了。 我是一名探鬼主播看铆,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼盛末!你這毒婦竟也來了弹惦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤悄但,失蹤者是張志新(化名)和其女友劉穎棠隐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檐嚣,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡助泽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嚎京。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗡贺。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鞍帝,靈堂內(nèi)的尸體忽然破棺而出诫睬,到底是詐尸還是另有隱情,我是刑警寧澤膜眠,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布岩臣,位于F島的核電站,受9級(jí)特大地震影響宵膨,放射性物質(zhì)發(fā)生泄漏架谎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一辟躏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧会涎,春花似錦末秃、人聲如沸惰匙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锡垄。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丈牢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工垫桂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霹粥,地道東北人后控。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像男旗,于是被迫代替她去往敵國和親泽台。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怀酷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容