使用 css/less 动态更换主题色(换肤功能)

前言

说起换肤功能,前端应该是非常熟悉了??

一般来说换肤的需求分为几种:

1. 纯前端,直接在页面前端通过点击自由切换限定的几种主题色,切换之后主题色变量存到本地浏览器

2. 在后台配置好色值,传到前端,前端从接口获取主题色在初始化的时候显示对应的主题色

3. 前面两者的结合,初始化的颜色设置,但也可通过前端的切换来更改主题色

拿到换肤需求后,就在思考该如何实现呢??

先搜一下,看下有哪些方法

Ant Design 的更换主题色功能是用 less 提供的 modifyVars 的方式进行覆盖变量来实现,基于 less 在浏览器中的编译来实现,

在引入less文件的时候需要通过link方式引入,然后基于less.js中的方法来进行修改变量

Element-UI 有换肤功能 https://elementui.github.io/theme-preview/#/zh-CN

实现原理:https://github.com/ElemeFE/element/issues/3054

如果是有限的几种颜色切换,可以:

1. 在最外层加主题类名,定义几种主题色,通过切换类来切换主题色 or

2. 将不同主题的样式抽取出来生成多份主题样式文件,在切换事件的时候动态引入

这两种方法的缺点都是要维护几种样式文件,对开发者不友好

由于是要实现动态换肤,自定义色值,所以上面的几种方式就不适合了。

起初想用less的 modifyVars方法

less.modifyVars({
  ‘@themeColor‘: ‘blue‘
});

但less是预编译的,在加载的时候已经编译成css了,再要去改的话,是不行的,除非在编译之前修改和定义颜色。

ant的实现是通过less,不过是有限制的,less需要用link方式引入,是基于 less 在浏览器中的编译来实现。

最终使用了css变量来进行主题色的修改,替换主题色变量,然后用setProperty来进行动态修改

用法很简单就是给变量加--前缀

例如主题色:

body{
   --themeColor:#000;
}

使用:

.main{
   color: var(--themeColor);
}

要修改主题色的话:

document.body.style.setProperty(‘--themeColor‘, this.theme_color);

最后,这些方法来看,使用哪种可根据需求来灵活决定实现方式。

参考: https://juejin.im/post/5ca41617f265da3092006155

原文地址:https://www.cnblogs.com/leiting/p/11203383.html

时间: 2024-10-13 17:37:49

使用 css/less 动态更换主题色(换肤功能)的相关文章

【转】Javascript+css 实现网页换肤功能

来源:http://www.php100.com/html/webkaifa/DIV_CSS/2008/1014/2326.html Html代码部分: 1.要有一个带id的样式表链接,我们要通过操作这个链接来调用不同的href. <link href="css/main0.css" rel="stylesheet" type="text/css" id="cssfile" /> 2.皮肤选择按钮(后台为每个li添

cookie换肤功能

<div class="selectSkin"> <input id="red" class="themeBtn" type="button" value="红色"> <input id="yellow" class="themeBtn" type="button" value="黄色"> &

[转]页面换肤功能浅析

原理:通过存取cookie和dom操作调用不同的样式表文件来实现前台换肤. Html代码部分: 1.要有一个带id的样式表链接,我们要通过操作这个链接来调用不同的href. <link href="css/main0.css" rel="stylesheet" type="text/css" id="cssfile" /> 2.皮肤选择按钮(后台为每个li添加onclick事件,触发换肤功能) <ul id=

Android学习之 换肤功能模块的实现&lt;二&gt;

在上篇中 主要有学习到皮肤资源内置到应用程序中 的方式实现换肤的 基本思路,本篇将继续以上篇的思路学习 皮肤资源内置的方式实现换肤效果.但本篇侧重于应用中换肤功能的代码设计实现上!切换的皮肤资源位于assets下不同的皮肤资源文件夹中. 本篇demo程序的代码结构如下: 本篇实现换肤功能的代码设计 UML类图如下: 本篇demo的换肤效果如下:               主要的实现代码在于: 1.SkinConfigManager.java 作用:皮肤配置管理,封装了SharedPrefere

Android实现换肤功能(二)

前两天写的上章关于换肤的功能获得了很好的反响,今天为大家介绍另一种方式.今天实现的策略也是网友建议的,然后我自己去写了个demo,大家自己评估下相比第一种方式的优势和劣势在哪里. 简单介绍下关于第一种关于换肤实现的方法一些不友好的地方,比如点击了换肤的功能键,需要先下载一个资源apk,然后再去引用其中的资源ID,于用户使用起来确实有有很多不便之处.今天为大家介绍的方法是克服了这一弊端的,可以实现直接在应用内切换,把资源文件存储在本地apk的,读取和操作也是更加便捷的,下面介绍下大致的一个实现逻辑

实现系统滚动条换肤功能

http://blog.sina.com.cn/s/blog_4c3538470100gews.html 1 实现系统滚动条换肤功能 对于Windows系统中各种控件换肤功能,要数滚动条的换肤最难实现了,尤其是控件自带的系统滚动条,如Edit.ListBox.ListView.TreeView等自带的系统滚动条,要想实现其自定义的皮肤功能,用常规办法似乎都无法实现. 对于常规的皮肤定制一般都是通过定制WM_PAINT.WM_ERASEBKGND.WM_CTLCOLORxxx.NM_CUSTOMD

.NET vs2010中使用IrisSkin2.dll轻松实现winForm窗体换肤功能

.NET vs2010中使用IrisSkin2.dll轻松实现winForm窗体换肤功能 转载▼ 大家好,从事c-s开发的C#程序员经常为winForm的界面设计苦恼,笔者曾经也深受“美工神话”的危害,如今提到美工,界面布局设计就开始蛋疼…. 所幸的是,笔者无意间接触到了一些比较可爱的第三方控件,可以为我们程序员省掉很多美工上面的麻烦…在陆续的博客中我会为大家介绍,今天我们的主题是:IrisSkin2.dll IrisSkin2.dll是一款很不错的免费皮肤控件,利用它可以轻松的实现winFor

Android学习之 换肤功能模块的实现&amp;lt;二&amp;gt;

在上篇中 主要有学习到皮肤资源内置到应用程序中 的方式实现换肤的 基本思路,本篇将继续以上篇的思路学习 皮肤资源内置的方式实现换肤效果.但本篇側重于应用中换肤功能的代码设计实现上.切换的皮肤资源位于assets下不同的皮肤资源目录中. 本篇demo程序的代码结构例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFuaWNlMDUyOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissol

JS实现网页换肤功能

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>JS实现网页换肤功能 -石家庄花卉出租 </ti