返回顶部
首页 > 资讯 > 精选 >基于Css Variable的主题切换示例
  • 181
分享到

基于Css Variable的主题切换示例

2023-06-08 03:06:14 181人浏览 泡泡鱼
摘要

小编给大家分享一下基于CSS Variable的主题切换示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!当接到这个需求的时候,百度到业界关于主题切换的方案还挺多

小编给大家分享一下基于CSS Variable的主题切换示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

当接到这个需求的时候,百度到业界关于主题切换的方案还挺多的,css链接替换、className更改、less.modifyVars、css in js等等,但每一种方案听起来都是又累又贵。有没有那种代码侵入低,小白无脑又好维护的方案呢?那自然是有的,确切的说是css它本身就支持。

Css3 Variable

定义一个全局颜色变量,改变这个变量的值页面内所有引用这个变量的元素都会进行改变。好简单是不是?

// base.less:root {  --primary: green;  --warning: yellow;  --info: white;  --danger: red;}// var.less@primary: var(--primary)@danger: var(--danger)@info: var(--info)// page.less.header {  background-color: @primary;  color: @info;}.content {  border: 1px solid @danger;}
// change.jsfunction changeTheme(themeObj) {  const vars = Object.keys(themeObj).map(key => `--${key}:${themeObj[key]}`).join(';')  document.documentElement.setAttribute('style', vars)}

本文结束

个P,它不支持 IE 啊!!0202年还要兼容IE吗?是的,就是要兼容IE。

基于Css Variable的主题切换示例 

css vars ponyfill

是的,还真有polyfill能兼容IE: css-vars-ponyfill 。它搞定IE的方式大概是这样子的

+-------------------------+
|   获取页面内style标签内容  |
|     请求外链css内容       |
+-------------------------+
  |
  |
  v
+-------------------------+  是   +-------------------------+
|      内容是否含有var()    | ----> |        标记为src         |
+-------------------------+       +-------------------------+
  |                                 |
  | 否                              |
  v                                 v
+-------------------------+       +-------------------------+
|       标记为skip         |       |   将var(*)替换为变量值,  |
|                         |       |  新增style标签添加到head  |
+-------------------------+       +-------------------------+

效果大概是这个样子的

基于Css Variable的主题切换示例 

简单粗暴又不失优雅,在支持css var的浏览器中不会进行处理,所以不需要担心性能问题( 是IE的问题,不是我的问题

)。 我们来改造一下代码

// store/theme.jsimport cssVars from 'css-vars-ponyfill'export default {  state: {    'primary': 'green',    'danger': 'white'  },  mutations: {    UPDATE_THEME(state, payload) {      const variables = {}      Object.assign(state, payload)      Object.keys(state).forEach((key) => {        variables[`--${key}`] = state[key]      })      cssVars({        variables      })    }  },  actions: {    changeTheme({ commit }, theme = {}) {      commit('UPDATE_THEME', theme)    }  }}// router.js// 因为路由跳转后的页面会按需加载新的css资源,重新转换const convertedPages = new Set()router.afterEach((to) => {  if (convertedPages.has(to.path)) return  convertedPages.add(to.path)  context.store.dispatch('theme/changeTheme')})

SSR项目闪屏问题优化

在SSR项目中用上述方案你可能会在IE中看到这样的情况

基于Css Variable的主题切换示例 

因为 css-vars-ponyfill

是依赖dom元素来实现转换的,在node中无法使用,所以从server直出未转换的css代码到client加载js文件转换css间存在一段样式空档。

+- - - - - - - - - - - - - - - - - - - -+
                 ' 样式空窗期:                             '
                 '                                       '
+----------+     ' +----------------+     +------------+ '     +-------------+
| 发起请求  | --> ' |  SSR直出页面     | --> | 加载js依赖  | ' --> |  替换css变量 |
+----------+     ' +----------------+     +------------+ '     +-------------+
                 '                                       '
                 +- - - - - - - - - - - - - - - - - - - -+

解决这个问题也很简单,只需要在每个用到 css var 的地方加上一个兼容写法

@_primary: red@primary: var(--primary):root{  --primary: @_primary}.theme {  color: @primary;}// 改为.theme {  color: @_primary;  color: @primary;}

在不支持css var的浏览器上会渲染默认颜色 red ,等待js加载完毕后ponyfill替换样式覆盖。

Webpack插件开发

手动在每个用到的地方添加兼容写法既幸苦又不好维护,这个时候我们需要了解一些 webpack 生命周期以及插件开发相关的知识,我们可以通过手写一个WEBpack插件,在 nORMalModuleLoader ( v5版本被废弃,使用NormalModule.getCompilationHooks(compilation).loader )的hooks中为所有css module添加一个loader来处理兼容代码。

笔者项目使用了less,注意webpack中loader执行顺序是 类似栈的先进后出 ,所以我需要把转换loader添加到less-loader之前,确保我们处理的是编译后的css var写法而非less变量。

// plugin.jsexport default class HackCss {  constructor (theme = {}) {    this.themeVars = theme  }  apply(compiler) {        compiler.hooks.thisCompilation.tap('HackCss', (compilation) => {          compilation.hooks.normalModuleLoader.tap(            'HackCss',            (_, moduleContext) => {              if (/\.Vue\?vue&type=style/.test(moduleContext.userRequest)) {                // ssr项目同构会有2次compiler,如果module中存在loader则不继续添加                if (hasLoader(moduleContext.loaders, 'hackcss-loader.js')) {                  return                }                let lessLoaderIndex = 0                // 项目用了less,找到less-loader的位置                moduleContext.loaders.forEach((loader, index) => {                  if (/less-loader/.test(loader.loader)) {                    lessLoaderIndex = index                  }                })                  moduleContext.loaders.splice(lessLoaderIndex, 0, {                  loader: path.resolve(__dirname, 'hackcss-loader.js'),                  options: this.themeVars                })              }            }          )        })      }    })}// loader.jsconst { getOptions } = require('loader-utils')module.exports = function(source) {  if (/module\.exports/.test(source)) return source  const theme = getOptions(this) || {}  return source.replace(    /\n(.+)?var\(--(.+)?\)(.+)?;/g,    (content, before, name, after = '') => {      const [key, indent] = before.split(':')      const add = after.split(';')[0]      return `\n${key}:${indent}${theme[name]}${after}${add};${content}`    }  )}

至此,我们可以愉快自如的切换主题了。

基于Css Variable的主题切换示例 

以上是“基于Css Variable的主题切换示例”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 基于Css Variable的主题切换示例

本文链接: https://www.lsjlt.com/news/251480.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 基于Css Variable的主题切换示例
    小编给大家分享一下基于Css Variable的主题切换示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!当接到这个需求的时候,百度到业界关于主题切换的方案还挺多...
    99+
    2023-06-08
  • 基于Vue2.0和Typescript实现多主题切换的示例
    目录第一步: 需要创建一个colorConfig.ts文件,用于配置主题信息 (我创建的目录是src/config/colorConfig.ts)第二步,根据接口获取当前主题信息,并...
    99+
    2023-05-16
    Vue Typescript多主题切换 Vue 多主题切换
  • 怎么简单实现CSS主题的切换
    这篇文章给大家分享的是有关怎么简单实现CSS主题的切换的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。HTML首先,我们需要包含“按钮”,这些按钮将触发主题根据选择的主题进行切换。(注:你总是可以使这些作为 opt...
    99+
    2023-06-08
  • 如何分析基于GTID的一主两从和主从切换
    这期内容当中小编将会给大家带来有关如何分析基于GTID的一主两从和主从切换,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 故障描述:一主两从...
    99+
    2024-04-02
  • mysql中MGR单主多主模式切换的示例分析
    这篇文章将为大家详细讲解有关mysql中MGR单主多主模式切换的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。主库执行CREATE DATABASE&n...
    99+
    2024-04-02
  • Vue怎么用CSS变量实现切换主题功能
    本篇内容介绍了“Vue怎么用CSS变量实现切换主题功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  ...
    99+
    2024-04-02
  • CSS实现Tab页切换的案例
    这篇文章主要介绍了CSS实现Tab页切换的案例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.hover移入其父元素.navI时,触发鼠标的hover态,给父元素添加样式为...
    99+
    2023-06-08
  • apache基于端口创建虚拟主机的示例
    apache:基于端口创建虚拟主机 以创建虚拟主机(a,b,c)为例子 1)2.1.2禁用默认的主机模式 [root@localhost httpd]# vim /etc/httpd/conf/httpd.conf ...
    99+
    2022-06-04
    apache端口创建虚拟主机 apache端口虚拟主机
  • 基于require.js的示例分析
    这篇文章将为大家详细讲解有关基于require.js的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.为什么使用require.js使用之前,我的页面的js是这...
    99+
    2024-04-02
  • Pythonmatplotlib实现图表主题变换示例详解
    目录一、更换主题样式二、线条变换三、将图表保存成本地图片四、添加辅助线五、调整画图的大小和清晰度六、使用动漫风格七、横坐标的倾斜度八、横纵坐标轴转换有时候因为jupyter note...
    99+
    2024-04-02
  • AntDesign中使用css切换的问题及解决
    目录Ant Design使用css切换问题1、绑定一个自定义属性2、css模块化3、Ant Design主题方案4、css in js ant design中css样式覆盖...
    99+
    2024-04-02
  • 解决redis sentinel 频繁主备切换的问题
    问题描述操作redis发现原有Master变成slave,其他slave成master,切换较频繁问题分析查看redis服务器sentinel日志,发现主机频繁在凌晨左右sentin...
    99+
    2024-04-02
  • Vue UI框架的主题切换功能实现
    目录AntD 的方式1. 创建黑暗主题文件2. 创建切换主题的函数3. 切换主题Quasar 的方式ElementUI 的方式NaiveUI 的方式在如今,很多网页已经可以手动切换明...
    99+
    2022-12-08
    vue主题切换 vue ui框架主题切换
  • C#WinForm实现多语言切换的示例
    因项目需要,所以在网上找了一些方法实现了该功能,本文也是做一个总结和记录。使用resx文件实现Winform多语言切换,以实现简体中文、英文、泰语的切换为例。如果后续需要增加其它语言...
    99+
    2023-01-30
    C# WinForm多语言切换 C# 多语言切换
  • css中一切皆为框的示例分析
    这篇文章给大家分享的是有关css中一切皆为框的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 div、h2 或 p 元素常常被称为块级元素。这意味着这些元素显示为一块内...
    99+
    2024-04-02
  • Android中ViewPager组件的基本用法及实现图片切换的示例
    ViewPager是android-support-v4.jar包里的组件。在布局文件里标签需要连包名一起 写全称<android.support.v4.view.Vie...
    99+
    2022-06-06
    示例 图片 viewpager Android
  • 基于Java实现进制转换工具类的示例代码
    目录背景原理十进制A转换为N进制RN进制R转换为十进制A应用延伸背景 最近有个发送短信的功能,需要在短信中带有详情链接,链接中带有对应信息且要有校验功能,然而短信是按字数收费的,所以...
    99+
    2023-02-19
    Java进制转换工具类 Java进制转换
  • WPF实现页面的切换的示例代码
    目录前言一、准备工作二、实现1.使用Frame控件的方式实现2.使用反射的方式实现3.实现效果总结前言 本文主要讲述如何在同一个窗体内,实现不同功能模块的页面切换。 一、准备工作 1...
    99+
    2023-01-30
    WPF 页面切换 WPF 切换页面
  • Android 列表形式的切换的示例代码
    电商项目中经常有这样的需求:在商品列表页面中,切换列表的展现形式,一般分为列表形式和表格形式。如京东:本文最终实现的效果:关键词:RecyclerView主布局文件:activity_main.xml<?xml version...
    99+
    2023-05-30
    android 列表 切换
  • python基于tkinter点击按钮实现图片的切换
    tkinter是python的标准Tk GUI工具包的接口,在windows下如果你安装的python3,那在安装python的时候,就已经自动安装了tkinter了 如果是在lin...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作