您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页Vue使用CSS变量实现切换主题功能

Vue使用CSS变量实现切换主题功能

来源:飒榕旅游知识分享网

实现主题切换

这里主题切换的思路是替换link标签的href属性,因此,需要写一个替换函数,在src目录下新建themes.js文件,代码如下:

// themes.js
const createLink = (() => {
 let $link = null
 return () => {
 if ($link) {
 return $link
 }
 $link = document.createElement('link')
 $link.rel = 'stylesheet'
 $link.type = 'text/css'
 document.querySelector('head').appendChild($link)
 return $link
 }
})()
/**
 * 主题切换函数
 * @param {string} theme - 主题名称, 默认default
 * @return {string} 主题名称
 */
const toggleTheme = (theme = 'default') => {
 const $link = createLink()
 $link.href = `./themes/${theme}.css`
 return theme
}
export default toggleTheme

然后,在themes文件下创建default.css和dark.css两个主题文件。创建CSS变量,实现主题化。CSS变量实现主题切换请参考另一篇文章初次接触css变量

兼容性

IE浏览器以及一些旧版浏览器不支持CSS变量,因此,需要使用css-vars-ponyfill,是一个ponyfill,可在旧版和现代浏览器中为CSS自定义属性(也称为“ CSS变量”)提供客户端支持。由于要开启watch监听,所以还有安装MutationObserver.js。

安装:

npm install css-vars-ponyfill mutationobserver-shim --save

然后,在themes.js文件中引入并使用:

// themes.js
import 'mutationobserver-shim'
import cssVars from 'css-vars-ponyfill'
cssVars({
 watch: true
})
const createLink = (() => {
 let $link = null
 return () => {
 if ($link) {
 return $link
 }
 $link = document.createElement('link')
 $link.rel = 'stylesheet'
 $link.type = 'text/css'
 document.querySelector('head').appendChild($link)
 return $link
 }
})()
/**
 * 主题切换函数
 * @param {string} theme - 主题名称, 默认default
 * @return {string} 主题名称
 */
const toggleTheme = (theme = 'default') => {
 const $link = createLink()
 $link.href = `./themes/${theme}.css`
 return theme
}
export default toggleTheme

开启watch后,在IE 11浏览器点击切换主题开关不起作用。因此,每次切换主题时都重新执行cssVars(),还是无法切换主题,原因是开启watch后重新执行cssVars()是无效的。最后,只能先关闭watch再重新开启。成功切换主题的themes.js代码如下:

// themes.js
import 'mutationobserver-shim'
import cssVars from 'css-vars-ponyfill'
const createLink = (() => {
 let $link = null
 return () => {
 if ($link) {
 return $link
 }
 $link = document.createElement('link')
 $link.rel = 'stylesheet'
 $link.type = 'text/css'
 document.querySelector('head').appendChild($link)
 return $link
 }
})()
/**
 * 主题切换函数
 * @param {string} theme - 主题名称, 默认default
 * @return {string} 主题名称
 */
const toggleTheme = (theme = 'default') => {
 const $link = createLink()
 $link.href = `./themes/${theme}.css`
 cssVars({
 watch: false
 })
 setTimeout(function () {
 cssVars({
 watch: true
 })
 }, 0)
 return theme
}
export default toggleTheme

查看所有代码,请移步Github项目地址。

记住主题

实现记住主题这个功能,一是可以向服务器保存主题,一是使用本地存储主题。为了方便,这里主要使用本地存储主题的方式,即使用localStorage存储主题。具体实现请移步Github项目地址。

本文来自PHP中文网,CSS教程栏目,欢迎学习

Copyright © 2019- sarr.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务