最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:动视网 责编:小采 时间:2020-11-02 22:15:11
文档

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

Vue使用CSS变量实现切换主题功能:主题化管理经常能在网站上看到,一般的思路都是将主题相关的CSS样式独立出来,在用户选择主题的时候加载相应的CSS样式文件。现在大部分浏览器都能很好的兼容CSS变量,主题化样式更容易管理了。最近,使用CSS变量在Vue项目中做了一个主题化实践,下面来看看整
推荐度:
导读Vue使用CSS变量实现切换主题功能:主题化管理经常能在网站上看到,一般的思路都是将主题相关的CSS样式独立出来,在用户选择主题的时候加载相应的CSS样式文件。现在大部分浏览器都能很好的兼容CSS变量,主题化样式更容易管理了。最近,使用CSS变量在Vue项目中做了一个主题化实践,下面来看看整

实现主题切换

这里主题切换的思路是替换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教程栏目,欢迎学习

文档

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

Vue使用CSS变量实现切换主题功能:主题化管理经常能在网站上看到,一般的思路都是将主题相关的CSS样式独立出来,在用户选择主题的时候加载相应的CSS样式文件。现在大部分浏览器都能很好的兼容CSS变量,主题化样式更容易管理了。最近,使用CSS变量在Vue项目中做了一个主题化实践,下面来看看整
推荐度:
标签: 切换 VUE 主题
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top