首页 > 其他分享 >基于第三方组件主题修改

基于第三方组件主题修改

时间:2023-02-17 15:44:35浏览次数:27  
标签:style -- setProperty 修改 theme rgba 组件 root 第三方

  1. 调用修改主题方法,通常结合 localStorage 来使用
updateTheme("theme");
  1. 方法调用,通过 root 设置变量 + 手动注入页面 less
import { setThemeColor } from "@/utils/themeConfig";

let lessNodesAppended;

const colorList = [
  {
    key: "薄暮",
    type: "huaxia",
    color: "#EA2927",
    rgb: { r: 234, g: 41, b: 39 },
    fontRgb: { r: 51, g: 51, b: 51 },
    btnRight: { r: 255, g: 94, b: 92 },
    menu: { r: 234, g: 41, b: 39, a: 0.2 },
    menuRgb: { r: 234, g: 41, b: 39 },
  },
  {
    key: "邮政",
    type: "postOffice",
    color: "#176177",
    rgb: { r: 23, g: 97, b: 119 },
    fontRgb: { r: 51, g: 51, b: 51 },
    btnRight: { r: 12, g: 46, b: 83 },
    menu: { r: 23, g: 97, b: 119, a: 0.2 },
    menuRgb: { r: 2, g: 229, b: 243 },
  },
];

const updateTheme = (primaryColor) => {
  if (!primaryColor) {
    return;
  }
  const vagueColor = colorList.find((it) => it.type === primaryColor);
  setThemeColor(vagueColor);
  // const hideMessage = message.loading('正在编译主题!', 0)
  // console.info(`正在编译主题!`)
  function buildIt() {
    // 正确的判定less是否已经加载less.modifyVars可用
    if (!window.less || !window.less.modifyVars) {
      return;
    }
    // less.modifyVars可用
    window.less
      .modifyVars({
        "@primary-color": primaryColor,
      })
      .then(() => {
        // hideMessage()
      })
      .catch(() => {
        // hideMessage()
      });
  }
  if (!lessNodesAppended) {
    // insert less.js and color.less
    const lessStyleNode = document.createElement("link");
    const lessConfigNode = document.createElement("script");
    const lessScriptNode = document.createElement("script");
    lessStyleNode.setAttribute("rel", "stylesheet/less");
    lessStyleNode.setAttribute("href", __webpack_public_path__ + "color.less");
    lessConfigNode.innerHTML = `
      window.less = {
        async: true,
        env: 'production',
        javascriptEnabled: true
      };
    `;
    lessScriptNode.src =
      "https://gw.alipayobjects.com/os/lib/less.js/3.8.1/less.min.js";
    lessScriptNode.async = true;
    lessScriptNode.onload = () => {
      buildIt();
      lessScriptNode.onload = null;
    };
    document.body.appendChild(lessStyleNode);
    document.body.appendChild(lessConfigNode);
    document.body.appendChild(lessScriptNode);
    lessNodesAppended = true;
  } else {
    buildIt();
  }
};
  1. 设置 root
export const setThemeColor = function (vagueColor) {
  const whiteRgb = { r: 255, g: 255, b: 255 }
  let root = document.querySelector(':root') as any

  root.style.setProperty('--theme-bg-color', rgba(whiteRgb, 1)) // 背景颜色
  root.style.setProperty('--theme-color', rgba(vagueColor.rgb, 1)) // 主题颜色
  root.style.setProperty('--theme-secondary-color', rgba({ r: 246, g: 246, b: 246 }, 1)) // 主题底色色
  root.style.setProperty('--theme-btn', rgba(vagueColor.rgb, 1)) // 主题按钮色
  root.style.setProperty('--theme-size', rgba(vagueColor.fontRgb, 1)) // 主题文字颜色
  root.style.setProperty('--theme-size-title', rgba(vagueColor.fontRgb, 1)) //  主题标题颜色
  root.style.setProperty('--theme-interactive-color', rgba(vagueColor.rgb, 1)) // 主题交互色
  root.style.setProperty('--theme-table-thead-bg', rgba({ r: 249, g: 249, b: 249 }, 1))
  root.style.setProperty('--theme-table-hover', rgba(vagueColor.rgb, 0.1)) // 表格hover
  root.style.setProperty('--theme-table-border', rgba({ r: 233, g: 233, b: 233 }, 1)) // 表格border
  root.style.setProperty('--theme-input-bg', rgba(whiteRgb, 1)) // input 等筛选条件 背景色
  root.style.setProperty('--theme-input-border', rgba({ r: 233, g: 233, b: 233 }, 1)) // input border
  root.style.setProperty('--theme-vague', rgba(vagueColor.rgb, 0.38))
  root.style.setProperty('--theme-vague-btn', rgba(vagueColor.rgb, 0.3))
  root.style.setProperty('--theme-btn-r', rgba(vagueColor.rgb, 1))
  root.style.setProperty('--theme-btn-l', rgba(vagueColor.btnRight, 0.8))
  root.style.setProperty('--theme-btn-r-hover', rgba(vagueColor.rgb, 0.8))
  root.style.setProperty('--theme-btn-l-hover', rgba(vagueColor.btnRight, 0.5))
  root.style.setProperty('--theme-btn-1', rgba(vagueColor.rgb, 0.1))
  root.style.setProperty('--theme-btn-8', rgba(vagueColor.rgb, 0.8))
  root.style.setProperty('--theme-menu-check-bg', rgba(vagueColor.menu, vagueColor.menu.a))
  root.style.setProperty('--theme-menu-size-active', rgba(vagueColor.menuRgb, 1));
  root.style.setProperty('--theme-logo', rgba(vagueColor.rgb, 1));
  if (vagueColor.type == 'huaxia') {
    root.style.setProperty('--theme-menu-start', 'rgba(255, 255, 255, 1)');
    root.style.setProperty('--theme-menu-end', 'rgba(255, 255, 255, 1)');
    root.style.setProperty('--theme-menu-size-color', 'rgba(0, 0, 0, 0.8)');
  } else {
    root.style.setProperty('--theme-menu-start', rgba(vagueColor.rgb, 1));
    root.style.setProperty('--theme-menu-end', rgba(vagueColor.btnRight, 0.8));
    root.style.setProperty('--theme-menu-size-color', 'rgba(255, 255, 255, 1)');
  }

  // --theme-bg-color: rgb(255, 255, 255);
  // --theme-color: rgba(234, 41, 39, 1);
  // --theme-secondary-color: rgba(246, 246, 246, 1);
  // --theme-btn: rgba(234, 41, 39, 1);
  // --theme-size: rgba(51, 51, 51, 1);
  // --theme-size-title: rgba(51, 51, 51, 1);
  // --theme-interactive-color: rgba(234, 41, 39, 1);
  // --theme-table-thead-bg: rgba(249, 249, 249, 1);
  // --theme-table-hover: rgba(234, 41, 39, 0.1);
  // --theme-table-border: rgba(233, 233, 233, 1);
  // --theme-input-bg: rgba(255, 255, 255, 1); //
  // --theme-input-border: rgba(233, 233, 233, 1);
  // --theme-vague: rgba(234, 41, 39, 0.38); // 通用阴影
  // --theme-vague-btn: rgba(234, 41, 39, 0.3); // 按钮阴影
  // --theme-btn-1: rgba(234, 41, 39, 0.1); // 主题按钮色
  // --theme-btn-8: rgba(234, 41, 39, 0.8); // 主题按钮色
  // --theme-btn-l: rgba(234, 41, 39, 1); // 主题按钮色
  // --theme-btn-r: rgba(255, 94, 92, 1);; // 主题按钮色
}
function rgba(rgb, a) {
  return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${a})`
}

标签:style,--,setProperty,修改,theme,rgba,组件,root,第三方
From: https://www.cnblogs.com/wp-leonard/p/17130405.html

相关文章

  • vue踩坑记录:用了v-if为什么组件没有被完全销毁
    事情是这样的,我做了个tab切换不同table的功能,但是发现tab切换的时候,table的内容没有真的被销毁,内容变乱了。后来发现只要加了key就可以顺利销毁了! ......
  • ABAP开发:获取当前时间前n个小时做过修改的数据
    1.问题描述OA设置每隔1小时从SAP同步采购订单,由于没做筛选每次同步SAP全部数据,响应报文太大导致OA系统卡顿。2.解决办法采购订单抬头(ekko)表,有个字段叫"LASTCHANGEDAT......
  • Eclipse中如何修改SVN的地址
    在SVN服务端的IP更改后,客户端SVN的连接地址可以在Eclipse中进行修改,方法如下:首先:在Eclipse中选择Windows->ShowView->others就会出现【SVN资源库/SVNRepositories】,选......
  • Vue组件之间通信,ref属性,动态组件,插槽,计算/监听属性
    目录组件一,组件间通信之父传子代码二,组件间通信之子传父三,ref属性1.放在普通标签上2.放在组件上用的多四,动态组件1,动态组件component标签五,插槽匿名插槽具名插槽六,计算......
  • vue2 - 组件中的通信,props,全局事件总线
    props属性:作用是让父组件可以给子组件传递data中的数据注意子组件不能修改props中的数据,只能访问父组件<template><divid="App"><!--给组件传入参数-->......
  • react组件
    创建方式:方式1:用函数创建  渲染:  可以直接使用箭头函数:   方式2:类创建组件    eg:1.先自己创建一个js文件,导包然后把组件写在里面  2.......
  • 自定义HarmonyOS启动页组件
    启动页作为应用程序首次出现的页面,该页面提供一些预加载数据的提前获取,防止应用程序出现白屏等异常,如是否第一次访问应用程序并开启应用欢迎页;判断用户登录信息进行页面跳转......
  • vue+elementUI 实现设置还款日字母弹窗组件
    1、业务背景还款业务,设置每月还款日,选每月几号扣款,不需要29、30、31,因为不是每个月都有这三天的2、预期效果图3、代码实现3.1初始化vue项目地址:https://cn.vuejs.org......
  • vue2 - vue.set 添加属性与修改属性,修改数组的注意事项
    1.vue.set添加属性与修改属性Vue.set(target,propertyName/index,value)vm.$set(target,propertyName/index,value)<divid="root"><buttonv-on:click="addAttr">点击......
  • Maven本地仓库修改
    阿里云镜像 <mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexusaliyun</name><url>http://maven.aliyun.com/......