当前位置:   article > 正文

前端 ”一键换肤“ 技术方案

css-vars-ponyfill

 一、技术核心

通过切换 css 选择器的方式实现主题样式的切换.

  • 在组件中保留不变的样式,将需要变化的样式进行抽离

  • 提供多种样式,给不同的主题定义一个对应的 CSS 选择器

  • 根据不同主题通过切换CSS选择器设置不同的样式

二、实现方法

提取公共CSS样式, 通过变量的形式切换主题

1、建一个存放公共css变量的js文件,将需要定义的css变量存放到该js文件,通过css-vars-ponyfill 插件换肤

  1. // variable.js
  2. // 字体变量
  3. const baseSize = {
  4. "--font-size-first-level-title": "18px",
  5. "--font-size-second-level-title": "16px",
  6. };
  7. // 浅色
  8. export const lightTheme = {
  9. "--themeColor": "#01cc8c",
  10. "--left-bg": "rgb(182, 23, 23)",
  11. "--right-bg": "rgb(63, 9, 9)",
  12. "--top-bg": "rgb(6, 36, 65)",
  13. "--bottom-bg": "rgb(55, 214, 10)",
  14. ...baseSize,
  15. };
  16. // 深色
  17. export const darkTheme = {
  18. "--themeColor": "#56518C",
  19. "--left-bg": "#0094ff",
  20. "--right-bg": "blue",
  21. "--top-bg": "red",
  22. "--bottom-bg": "pink",
  23. ...baseSize,
  24. };

2、页面中使用css变量

  1. <style lang="sass">
  2. .left {
  3. background-color: var(--left-bg);
  4. color: var(--themeColor);
  5. height: 500px;
  6. flex: 1;
  7. }
  8. </style>

3、安装css-vars-ponyfill 插件

npm i css-vars-ponyfill

4、封装切换主题的js

  1. // theme.js
  2. import { lightTheme, darkTheme } from "../src/assets/js/variable";
  3. import cssVars from "css-vars-ponyfill";
  4. export const initTheme = (theme = true) => {
  5. document.documentElement.setAttribute("data-theme", theme ? "light" : "dark");
  6. cssVars({
  7. watch: true, // 当添加,删除或修改其<link>或<style>元素的禁用或href属性时,ponyfill将自行调用
  8. variables: theme ? lightTheme : darkTheme, // variables 自定义属性名/值对的集合
  9. onlyLegacy: false, // false 默认将css变量编译为浏览器识别的css样式 true 当浏览器不支持css变量的时候将css变量编译为识别的css
  10. });
  11. };

5、main.js中调用theme.js

  1. import { initTheme } from './theme'
  2. let theme = 条件 ? false : true
  3. initTheme(theme)

6、图片路径怎么解决?

  1. // main.js
  2. // lightTheme 和 darkTheme 是文件夹名字
  3. Vue.prototype.SKIN_IMAGE_PATH = 条件 ? 'lightTheme' : 'darkTheme'
  1. // .vue文件
  2. export default {
  3. data () {
  4. return {
  5. tip: require(`@assets/img/theme/${this.SKIN_IMAGE_PATH}/tip.png`),
  6. }
  7. }
  8. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/133579
推荐阅读
相关标签
  

闽ICP备14008679号