<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
對於網頁換膚,例如最常見的深色、淺色風格已經是很常見的一個需求了。一直以來也有很多的實現方案,這裡我主要介紹一下基於 CSS variable
的實現方式
1、把不同風格樣式寫到不同的類名下面,通過切換類名來實現換膚
這種方式沒啥明顯的優點,只是單純的實現了此需求。反而增加了css樣式檔案程式碼冗餘且會造成大量重複程式碼,樣式程式碼不利於拓展維護,且開發效率低下
2、實現多套主題樣式檔案,通過 link 標籤動態載入不同的樣式檔案
這種方式的優點大概是做到了按需載入吧,但同時也造成了需要拷貝大量重複程式碼來單獨修改,也算是做到了樣式隔離,相比上一種方式稍稍提高了一點可維護性吧
在多個樣式檔案切換的時候,可能會有載入延遲。這時候可以考慮使用 alternate
來解決
3、通過less或sass的變數方式實現
這種方式我們可以將所有風格變數抽離出來,在樣式程式碼中直接使用該變數,是一種比較推薦的方式。極大提高了程式碼的拓展性和維護性
如圖所示,目前主流瀏覽器都已經支援css variable
,我們儘管放心使用
CSS variable
允許我們在 css 裡面宣告變數,在變數前加上兩根小橫線即可(--)
body { --foo: #000; --bar: #fff; }
需要注意的是css vars
變數宣告,區分大小寫--foo
與 --Foo
是兩個不同的變數
使用var()函數來讀取變數
p{ color:var(--foo) }
var()
函數支援第二個引數,用於表示變數的預設值,如果變數值不存在,則以預設值為準
p{ color:var(--fooo, #ccc) }
關於var()
函數此處不做過多贅述,詳情請查閱官方檔案
大致思路:不管深色或是淺色風格,我們都可以把它視作一個個主題。把每個主題的顏色值、盒子寬高、圖片地址等抽離為一個字典物件結構。一個主題對應一個組態檔,再通過切換組態檔來實現主題風格的變化
一個主題對應一份組態檔,所以我們需要提前和UI設計師溝通好各主題對應的色階,字號,一些通用樣式規則等
css vars
變數名稱是不變的,變數值隨著主題的切換而發生改變
我的UI同事使用的是 figma,然後我發現 figma 右側的資訊欄裡面有顏色編號,正好可以使用這個來當做變數名稱。在編碼階段,看到這個編號,就知道用什麼變數名了,非常方便。
如果你的UI同事使用的是別的設計工具,最好也是提前約定好變數名,使其大家都方便
dark.js
export default { '--grey900': '#EBEEF5', '--grey600': '#A7ABC0', '--grey500': '#72768D', '--grey400': '#5D6177', '--grey300': '#404759', '--grey200': '#2C323E', '--grey100': '#282B32', '--grey50': '#171B22', '--grey0': '#222730', ... }
white.js
export default { '--grey900': '#1F2429', '--grey600': '#646C73', '--grey500': '#8D9399', '--grey400': '#C3C7CB', '--grey300': '#E4E6E7', '--grey200': '#EFF0F1', '--grey100': '#F4F5F6', '--grey50': '#F8F9FA', '--grey0': '#FFFFFF', ... }
這裡我們需要用到 document.body.style
的api
// 設定變數 document.body.style.setProperty('--foo', '#666') // 讀取變數 document.body.style.getPropertyValue('--foo') // 刪除變數 document.body.style.removeProperty('--foo')
遍歷變數字典物件,根據不同主題,給網頁設定對應變數
import C from '@/utils/cssVarMap' setCssVar (flag) { const varList = Object.entries(flag ? C.white : C.dark) varList.forEach(([key, val]) => { document.body.style.setProperty(key, val) }) }
至此,我們已經完成根據不同主題設定不同主題變數了,可以愉快的在樣式檔案裡面使用css vars
這種方式操作簡單,且極大的提高了程式碼的拓展性和維護性。之後再有別的主題,也不過是多增加一份組態檔而已,不會增加額外的副作用。
通過結合媒體查詢,我們可以實現更復雜的互動場景
body { --foo: #fff } p { color: var(--foo) } @media screen and (min-width: 768px) { body { --foo: #000 } }
在一些特殊需求場景下,我們可以結合js業務邏輯,動態追加或編輯 css vars
const docStyle = document.documentElement.style; document.addEventListener('mousemove', (e) => { docStyle.setProperty('--foo', e.clientX); });
既然是宣告變數,那麼就有儲存資訊的功能。我們可以試著將一些資訊儲存在 css vars
裡面,再通過document.body.style.getPropertyValue('--foo')
去讀取使用。不過大部分場景應該使用不到這種方法,也算是提供一種思路吧。
css vars是個潛力股,一起來挖掘它更多巧妙的用法吧
以上就是優雅的實現網頁多主題風格換膚功能詳解的詳細內容,更多關於網頁多主題風格換膚的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45