前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >换肤功能(scss、css变量)

换肤功能(scss、css变量)

原创
作者头像
Krry
修改于 2021-04-20 09:52:06
修改于 2021-04-20 09:52:06
4.5K0
举报
文章被收录于专栏:KrryblogKrryblog

博客地址:https://ainyi.com/104

产品 SaaS 化,通常需要有换肤功能

这里简单记录一下主题色及其衍生色(高亮、浅色)的更换功能

scss 全局定义

每个页面都有颜色,那么应该把颜色值定义在 global.scss 文件中,通过变量定义,比如

代码语言:txt
AI代码解释
复制
$color-primary: #4762FE;
$color-primary-dark: #3245D9;
$color-primary-light: #C2D1FF;
$color-primary-lightest: #EBF0FF;
$color-primary-transparency: rgba(71,98,254,0.1);

每个页面的样式表引入此文件

代码语言:txt
AI代码解释
复制
@import './global.scss';

// 使用例子
.demo {
  color: $color-primary
}

这样,只要更改 scss 中全局变量的颜色值,就可以同步更改项目的颜色值

css 变量定义

思考如何注入颜色值?

这里就用到 css 的变量函数了:==var()==

之前有谈到使用 css 的变量以及赋值方法:Bilibili [冬] banner 早中晚切换效果

var() 函数用于插入自定义的属性值

两个参数:property,value

property:必填,自定义属性的名称,必需以 -- 开头

value:可选,备用值,在属性不存在的时候使用

比如

代码语言:txt
AI代码解释
复制
body {
  --tempColor: #fff;
}
.temp {
  color: var(--tempColor)
}

设置其属性:DOM.style.setProperty(name, value)

这里就很清楚了,==scss 中全局变量引入的是 var() 函数的变量值==

获取衍生色

主题色是只有一个,需要通过主题色来获取其衍生颜色(高亮、浅色等)

scss 中提供一个方法:==mix()==

Mix 函数是将两种颜色根据一定的比例混合在一起,生成另一种颜色。其使用语法如下:

代码语言:txt
AI代码解释
复制
mix($color-1,$color-2,$weight);

$color-1 和 $color-2 指的是你需要合并的颜色,颜色可以是任何表达式,也可以是颜色变量

$weight 为 合并的比例(选择权重),默认值为 50%,其取值范围是 0~1 之间。它是每个 RGB 的百分比来衡量,当然透明度也会有一定的权重

如果指定的比例是 25%,意味着==第一个颜色==所占比例为 25%,第二个颜色所占比例为75%

此外,scss 还有一个 HSL 函数,也是设置颜色值的方法,这里就不过多探究了

坑来了

当我把 var() 函数获取的颜色值放进 mix 函数中,居然报错:

SassError: argument $color-2 of mix($color-1, $color-2, $weight: 50%) must be a color

mix 函数无法使用带有 var() 函数变量的参数,HSL 函数也是;但普通变量是可以的

最终只能使用 js 函数通过主题色来获取衍生颜色

这里提供几个方法:

代码语言:txt
AI代码解释
复制
// str: 十六进制颜色值,n:透明度
export function colorRgba(str, n) {
  // 十六进制颜色值的正则表达式
  let reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/
  let sColor = str.toLowerCase()
  n = n || 1
  // 十六进制颜色转换为RGB格式
  if (sColor && reg.test(sColor)) {
    let sColorChange = getRgbNum(sColor)
    return 'rgba(' + sColorChange.join(',') + ',' + n + ')'
  } else {
    return sColor
  }
}
// 获取 rgb 颜色值
function getRgbNum(sColor) {
  if (sColor.length === 4) {
    let sColorNew = '#'
    for (let i = 1; i < 4; i += 1) {
      // 补全颜色值 例如:#eee,#fff等
      sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))
    }
    sColor = sColorNew
  }
  // 处理六位颜色值
  let sColorChange = []
  for (let i = 1; i < 7; i += 2) {
    // 核心代码,通过parseInt将十六进制转为十进制,parseInt只有一个参数时是默认转为十进制的,第二个参数则是指定转为对应进制
    sColorChange.push(parseInt('0x' + sColor.slice(i, i + 2)))
  }
  return sColorChange
}
// 加深或减弱颜色值
export function lightDarkenColor(color, num) {
  let colorArr = getRgbNum(color)
  let sColorChange = []
  for (let i = 0; i < colorArr.length; i++) {
    let val = colorArr[i] + num
    if (val < 0) {
      val = 0
    }
    if (val > 255) {
      val = 255
    }
    sColorChange.push(val)
  }
  return 'rgba(' + sColorChange.join(',') + ',1)'
}

最后只需要在==路由全局前置守卫==中计算颜色值,并赋值到 css 变量上,在 scss 全局变量中用 var() 函数引入 css 变量(各种颜色值)

换肤流程

通过接口获取主题色 --> js 计算衍生色值 --> 赋值到 css 变量 --> scss 全局变量用 var() 函数引入 css 变量 --> 页面样式引用 scss 全局颜色值

使用例子

global.scss

代码语言:txt
AI代码解释
复制
$color-primary: var(--primaryColor, #4762FE);
$color-primary-dark: var(--primaryDarkColor, #3245D9);
$color-primary-light: var(--primaryLightColor, #C2D1FF);
$color-primary-lightest: var(--primaryLightestColor, #EBF0FF);
$color-primary-transparency: var(--primaryTransparencyColor, rgba(71,98,254,0.1));

路由守卫:

代码语言:txt
AI代码解释
复制
router.beforeEach((to, from, next) => {
  const primaryColor = getConfigStyle() // 从接口获取的主题色
  const colorObj = {
    primaryColor: primaryColor,
    primaryDarkColor: lightDarkenColor(primaryColor, -20),
    primaryLightColor: colorRgba(primaryColor, 0.3),
    primaryLightestColor: colorRgba(primaryColor, 0.12),
    primaryTransparencyColor: colorRgba(primaryColor, 0.1)
  }
  Object.entries(colorObj).forEach(ele => {
    // 逐个设置 css 变量到 body 上
    document.body.style.setProperty(`--${ele[0]}`, ele[1])
  })
  next()
})

博客地址:https://ainyi.com/104

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Sass-学习笔记【进阶篇】
特别说明: 没有sass基础请移步:【Sass-学习笔记【基础篇】】http://www.cnblogs.com/padding1015/articles/7056323.html 最底部附结构图(实
xing.org1^
2018/05/17
4.5K0
波浪动态背景
itclanCoder
2023/09/14
2730
波浪动态背景
详解在 vaw-layouts 中通过 sass 实现动态换肤功能 (一)
在以往的前端开发中,css 一直不能称之为一种编程语言,虽然在 css3中增加了几个变量和函数,但是实现的功能还是比较有限。后来出现了几个css预处理器,比较常用的有:sass、less 、stylus。有了他们,我们可以对css进行一些简单的编程。如果您对他们还不了解,可以查看一下他们的官网学习一下,vaw-layouts项目中使用的的预处理器是sass,因此本文也是基于sass进行讲解实现动态换肤的功能。
用户9078190
2022/10/25
1.2K0
详解在 vaw-layouts 中通过 sass 实现动态换肤功能 (一)
使用less\u002Fcss 动态的切换主题色实现换肤功能
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情 >>
默默的成长
2022/11/02
1.1K0
SASS相关
版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/details/53309416
空空云
2018/09/27
8360
SASS相关
Sass 基础(七)
Sass Maps 的函数-map-remove($map,$key),keywords($args)     map-remove($map,$key)     map-remove($map,$key)函数是用来删除当前$map中的某一个$key,从而得到一个新的     map,其返回的值是一个map.他并不能直接从一个map 中删除另一个map,仅能通过删除     map中的某个key 得到新的map     $map:map-remove($social - colors,drib
用户1197315
2018/01/19
8740
SCSS+WindiCSS实现主题色切换
最近在给自己写主页(同时也是博客),我做了一个切换主题色的功能。每次进入页面时,会随机选择一套配色,让页面显得灵动一些,就像下面这样:
戴兜
2023/04/27
1.5K0
SCSS+WindiCSS实现主题色切换
技巧 | 从Element项目中探索任意主题色设定
https://segmentfault.com/a/1190000038436829
@超人
2021/02/26
1.6K0
技巧 | 从Element项目中探索任意主题色设定
CSS 变量由浅入深,提升效率必备知识!
CSS变量(又名自定义属性)已在Web浏览器中支持了近四年。 我一般也会根据项目情况使用它们。 它们非常有用且易于使用,但是前端开发人员通常可能会误用或误解它们。
前端小智@大迁世界
2022/06/15
2.2K0
CSS 变量由浅入深,提升效率必备知识!
【vite+vue3+Ts+element-plus】肩并肩带你写后台管理之scss的使用和自定义主题、暗黑模式
scss的安装、全局设置及一些常规用法 css变量的一些用法 element-plus自定义主题的两种实现方法 暗黑模式的视线
十里青山
2023/04/28
4.9K1
【vite+vue3+Ts+element-plus】肩并肩带你写后台管理之scss的使用和自定义主题、暗黑模式
CSS变量的实际应用场景探索
在当今复杂多变的网页开发环境中,CSS变量作为一种强大的工具,正逐渐改变着我们处理样式的方式。它不仅在代码的可维护性方面发挥着巨大作用,还在动态样式调整、响应式设计、动画特效以及组件化开发等多个领域都有着丰富的实际应用场景。本文将深入探讨CSS变量的各种实际应用场景,帮助开发者更好地理解和运用这一技术。
Front_Yue
2025/03/25
690
CSS变量的实际应用场景探索
如何利用 SCSS 实现一键换肤
在项目开发过程中,我们有时候遇到需要更换站点主题色的需求。乃至于 APP 底部的 banner 中的 icon、文案和背景图都是运营线上可配置的。还有的功能比如更换系统字体大小等。
政采云前端团队
2022/03/29
2.9K0
如何利用 SCSS 实现一键换肤
你的网站可以一键变色吗?
得益于 Web 标准的发展和设计风格的变化,前端开发者从通过切图还原设计逐渐变为通过代码还原设计。CSS 预处理器也在一定程度上弥补了 CSS 本身表达能力的不足,许多 UI 框架(比如 Element)将基础的颜色值作为配置项供使用者定制,其余的颜色则在它们的基础上调整亮度/饱和度,或者与其他颜色混合而成。虽说做不到一键变色,但是通过重新构建来改变整个网站的配色是没有问题的。 除了可定制,这样做还可以让代码变得更容易维护。相比较充斥着各种颜色值的 CSS 代码,甚至可以表达出一些配色思路。 配色思路?
腾讯NEXT学位
2018/05/14
1.7K0
关于前端主题切换的思考和现代前端样式的解决方案落地
网站或者应用一键切换主题(简称:换肤)功能,对每个前端开发者来说已经非常常见了,通常是一深一浅,或自由组合衍生出众多主题,或任意主题,这时候,设计一个工程化主题切换功能,并梳理现代前端样式的解决方案显得尤为重要。
ConardLi
2023/01/09
1.6K0
关于前端主题切换的思考和现代前端样式的解决方案落地
第二章:基础概念精讲 - 第二节 - Tailwind CSS 颜色系统和主题定制
程序猿梦工厂
2025/02/28
510
第二章:基础概念精讲 - 第二节 - Tailwind CSS 颜色系统和主题定制
前端实现主题换肤功能的几种方案
文章链接:https://cloud.tencent.com/developer/article/2356628?from_column=20421&from=20421
永恒的财宝
2024/11/18
2220
前端实现主题换肤功能的几种方案
Vue + Element UI 实现权限管理系统 前端篇(六):更换皮肤主题
首先安装「主题生成工具」,可以全局安装或者安装在当前项目下,推荐安装在项目里,方便别人 clone 项目时能直接安装依赖并启动。
朝雨忆轻尘
2019/06/18
1.5K0
精读《State of CSS 2022》
解决业务代码的 !important 问题。为什么业务代码需要用 !important 解决问题?因为 css 优先级由文件申明顺序有关,而现在大量业务使用动态插入 css 的方案,插入的时机与 js 文件加载与执行时间有关,这就导致了样式优先级不固定。
黄子毅
2022/11/21
8520
Sass控制命令及函数知识整理
声明:   请尊重博客园原创精神,转载或使用图片请注明:   博主:xing.org1^   出处:http://www.cnblogs.com/padding1015/ 特别说明: 没有sass基础请移步:【Sass-学习笔记【基础篇】】http://www.cnblogs.com/padding1015/articles/7056323.html 最底部附结构图(实在是结构图太长了没办法)2017-07-07  20:17:17  正文 一、Sass的控制命令  2017-06-22  09:1
xing.org1^
2018/05/17
3.4K0
基于Vue、ElementUI的换肤解决方案
换肤这个功能,不能算是很常见,但是也是有需求的,所以这里提供几种前端的换肤解决方案,供大家参考。
零式的天空
2022/03/27
5.4K2
基于Vue、ElementUI的换肤解决方案
相关推荐
Sass-学习笔记【进阶篇】
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文