您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > CSS

如何优雅的实现网页多主题风格换肤功能?

时间:2023-02-04 14:09:28  来源:今日头条  作者:程序媛最幽默

 

 

对于网页换肤,例如最常见的深色、浅色风格已经是很常见的一个需求了。一直以来也有很多的实现方案,这里我主要介绍一下基于 css variable的实现方式

简单列举下一些其它实现方式

1、把不同风格样式写到不同的类名下面,通过切换类名来实现换肤

这种方式没啥明显的优点,只是单纯的实现了此需求。反而增加了css样式文件代码冗余且会造成大量重复代码,样式代码不利于拓展维护,且开发效率低下

2、实现多套主题样式文件,通过 link 标签动态加载不同的样式文件

这种方式的优点大概是做到了按需加载吧,但同时也造成了需要拷贝大量重复代码来单独修改,也算是做到了样式隔离,相比上一种方式稍稍提高了一点可维护性吧

在多个样式文件切换的时候,可能会有加载延迟。这时候可以考虑使用 alternate 来解决

3、通过less或sass的变量方式实现

这种方式我们可以将所有风格变量抽离出来,在样式代码中直接使用该变量,是一种比较推荐的方式。极大提高了代码的拓展性和维护性

CSS variable的实现方式

 

如图所示,目前主流浏览器都已经支持css variable,我们尽管放心使用

CSS variable 允许我们在 css 里面声明变量,在变量前加上两根小横线即可(--)

body {
  --foo: #000;
  --bar: #fff;
}

需要注意的是css vars变量声明,区分大小写--foo 与 --Foo 是两个不同的变量

var() 函数

使用var()函数来读取变量

p{
    color:var(--foo)
}

var()函数支持第二个参数,用于表示变量的默认值,如果变量值不存在,则以默认值为准

p{
    color:var(--fooo, #ccc)
}

关于var()函数此处不做过多赘述,详情请查阅官方文档

方案落地

大致思路:不管深色或是浅色风格,我们都可以把它视作一个个主题。把每个主题的颜色值、盒子宽高、图片地址等抽离为一个字典对象结构。一个主题对应一个配置文件,再通过切换配置文件来实现主题风格的变化

一、和UI设计师沟通好各主题的色阶

一个主题对应一份配置文件,所以我们需要提前和UI设计师沟通好各主题对应的色阶,字号,一些通用样式规则等

 


 

css vars变量名称是不变的,变量值随着主题的切换而发生改变

我的UI同事使用的是 figma,然后我发现 figma 右侧的信息栏里面有颜色编号,正好可以使用这个来当做变量名称。在编码阶段,看到这个编号,就知道用什么变量名了,非常方便。

如果你的UI同事使用的是别的设计工具,最好也是提前约定好变量名,使其大家都方便

 

二、将各主题色阶抽离为一个字典对象

dark.js

export default {
  '--grey900': '#EBEEF5',
  '--grey600': '#A7ABC0',
  '--grey500': '#72768D',
  '--grey400': '#5D6177',
  '--grey300': '#404759',
  '--grey200': '#2C323E',
  '--grey100': '#282B32',
  '--grey50': '#171B22',
  '--grey0': '#222730',
}  

white.js

export default {
  '--grey900': '#1F2429',
  '--grey600': '#646C73',
  '--grey500': '#8D9399',
  '--grey400': '#C3C7CB',
  '--grey300': '#E4E6E7',
  '--grey200': '#EFF0F1',
  '--grey100': '#F4F5F6',
  '--grey50': '#F8F9FA',
  '--grey0': '#FFFFFF',
}  

三、通过js设置style变量

这里我们需要用到 document.body.style 的api

// 设置变量
document.body.style.setProperty('--foo', '#666')

// 读取变量
document.body.style.getPropertyValue('--foo')

// 删除变量
document.body.style.removeProperty('--foo')

遍历变量字典对象,根据不同主题,给网页设置对应变量

import C from '@/utils/cssVarMap'

setCssVar (flag) {
  const varList = Object.entries(flag ? C.white : C.dark)
  varList.forEach(([key, val]) => {
    document.body.style.setProperty(key, val)
  })
}

至此,我们已经完成根据不同主题设置不同主题变量了,可以愉快的在样式文件里面使用css vars

 

这种方式操作简单,且极大的提高了代码的拓展性和维护性。之后再有别的主题,也不过是多增加一份配置文件而已,不会增加额外的副作用。

举一反三

1、结合媒体查询

通过结合媒体查询,我们可以实现更复杂的交互场景

body {
  --foo: #fff
}

p {
    color: var(--foo)
}

@media screen and (min-width: 768px) {
  body {
    --foo: #000
  }
}

2、结合js业务逻辑

在一些特殊需求场景下,我们可以结合js业务逻辑,动态追加或编辑 css vars

const docStyle = document.documentElement.style;

document.addEventListener('mousemove', (e) => {
  docStyle.setProperty('--foo', e.clientX);
});

3、存储一些信息

既然是声明变量,那么就有存储信息的功能。我们可以试着将一些信息存储在 css vars 里面,再通过
document.body.style.getPropertyValue('--foo')去读取使用。不过大部分场景应该使用不到这种方法,也算是提供一种思路吧。

css vars是个潜力股,一起来挖掘它更多巧妙的用法吧



Tags:网页   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Google搜索引擎索引的网页数量有多少?谷歌官方提供数据进行参考
Google搜索引擎索引的网页数量有多少?二十世纪九十年代,网页的索引数量成了一个各大搜索引擎相互对比的指标。小编记得2000年谷歌搜索引擎的首页搜索框上方,还标记着谷歌索引的...【详细内容】
2024-03-27  Search: 网页  点击:(20)  评论:(0)  加入收藏
苹果在欧盟又做出重大让步,将首次允许用户通过网页下载 iPhone 应用
3 月 12 日消息,苹果公司今日宣布了针对欧盟开发者的三项新规,赋予开发者更多自由,包括直接通过网页分发应用、自主设计应用内促销活动等。上周,苹果已经在 iOS 17.4 版本中允许...【详细内容】
2024-03-13  Search: 网页  点击:(15)  评论:(0)  加入收藏
如何有效利用CDN提升网页加载速度
 在当今互联网高速发展的时代,网页的加载速度对于用户体验至关重要。一个加载缓慢的网页可能会导致用户流失和访问量下降。为了提升网页的加载速度,许多网站开发者选择使...【详细内容】
2024-02-21  Search: 网页  点击:(41)  评论:(0)  加入收藏
网站如何提高网页的浏览量和受众面
通过精心设计和有针对性的内容,企业可以提高网页的浏览量,并扩大受众面,从而增强品牌影响力。以下是一些关键步骤,以建设具有吸引力的主题企业网站。1. 精心设计网站主题网站的...【详细内容】
2024-01-22  Search: 网页  点击:(65)  评论:(0)  加入收藏
SEO主导的网页设计:践行最佳SEO实践的有效方法
以增加网站在搜索引擎结果页面排名的目标,搜索引擎优化(SEO)在当前数字化时代中变得越来越重要。为了实现最佳的SEO实践,网页设计应积极配合这一目标。SEO主导的网页设计不仅仅...【详细内容】
2024-01-12  Search: 网页  点击:(102)  评论:(0)  加入收藏
访问网页显示“不安全”如何解决?
很多人在经常浏览一些网页时,浏览器会提示“您的连接不安全”。在遇到这样的提示下,您会做出什么选择呢?忽视风险继续访问、直接退出访问、还是更加小心翼翼的访问呢?其实如果出...【详细内容】
2024-01-11  Search: 网页  点击:(37)  评论:(0)  加入收藏
简述网站从域名到网页的访问流程
大家对上网并不陌生,不管是IT人士还是普通大众,不管用电脑还是手机,上网已变成大家生活中的一部分。 什么是上网? 简单点讲就是打开网页,说的详细一点上网就是下载,当你打开一个...【详细内容】
2024-01-10  Search: 网页  点击:(82)  评论:(0)  加入收藏
网站从域名到网页的访问流程
大家对上网并不陌生,不管是IT人士还是普通大众,不管用电脑还是手机,上网已变成大家生活中的一部分。什么是上网?简单点讲就是打开网页,说的详细一点上网就是下载,当你打开一个网址...【详细内容】
2024-01-04  Search: 网页  点击:(81)  评论:(0)  加入收藏
为什么静态/伪静态网页比动态网页好做优化?
静态网页与伪静态网页相较于动态网页在优化方面具有诸多优势。静态网页是指网页的内容在服务器上预先生成,用户访问时服务器直接返回已经生成好的HTML页面;而伪静态网页则是指...【详细内容】
2023-12-26  Search: 网页  点击:(103)  评论:(0)  加入收藏
怎么学习做网页排名
学习如何提高网页在搜索引擎中的排名,通常涉及到搜索引擎优化(SEO)的知识。以下是一些建议,帮助你学习如何提升网页排名: 了解基础概念: 学习搜索引擎优化的基础概念,包括关键字、...【详细内容】
2023-12-24  Search: 网页  点击:(83)  评论:(0)  加入收藏
▌简易百科推荐
12 个超级实用的 CSS 技巧
user-selectuser-select 属性可以用来控制用户是否能够选择文本。<div> <p>You can&#39;t select this text.</p></div><p>You can select this text.</p>CSS:div { width...【详细内容】
2023-12-19  前端充电宝  微信公众号  Tags:CSS   点击:(133)  评论:(0)  加入收藏
原生CSS嵌套使用,你学明白了吗?
如果你是一个前端开发人员,那么你应该使用过CSS预处理器以及预处理器中的嵌套特性。它一直是一个受欢迎的功能,我一直都在使用CSS预处理器。今年所有的主流浏览器都支持原生CS...【详细内容】
2023-12-06  南城大前端  微信公众号  Tags:CSS   点击:(185)  评论:(0)  加入收藏
CSS_Flex 那些鲜为人知的内幕
前言Flex想必大家都很熟悉,也是大家平时在进行页面布局的首选方案。(反正我是!)。不知道大家平时在遇到Flex布局属性问题时,是如何查阅并解决的。反正,我每次记不住哪些属性或...【详细内容】
2023-12-06  前端柒八九  微信公众号  Tags:CSS   点击:(140)  评论:(0)  加入收藏
CSS:这几个伪类,你用了吗
## :root 伪类:root 伪类是匹配文档的根元素,很多时候,根元素也就是 html 元素,用 root 伪类来匹配根元素,目的就是解决根元素不是 html 的场景,比如根元素是 svg 的时候。 root...【详细内容】
2023-11-30  读心悦  微信公众号  Tags:CSS   点击:(170)  评论:(0)  加入收藏
让你开发更舒适的 Tailwind 技巧
免费体验 Gpt4 plus 与 AI作图神器,我们出的钱 体验地址:体验使用 Tailwind CSS,我避免了在 React 项目中复制大量 CSS 文件的麻烦,使网页开发变得更加迅速高效。虽然 Tailwind...【详细内容】
2023-11-28  大迁世界  微信公众号  Tags:Tailwind   点击:(178)  评论:(0)  加入收藏
Display和Visibility的区别,你了解了吗?
采用CSS实现元素隐藏的方法有很多种,比如定位到屏幕之外、透明度变换等。而常见的两种方式是将元素设置为display:none或者visibility:hidden。元素样式设置为display:none当...【详细内容】
2023-11-27  读心悦  微信公众号  Tags:Display   点击:(174)  评论:(0)  加入收藏
新 CSS Math方法:Rem() 和 Mod()
CSS 添加了许多新的数学函数来补充旧有的函数(如 calc() 和最近的 clamp() )。这些函数最终都表示一个数值,但其工作原理的细微差别并不总是一开始就很清楚。本文介绍每个函数...【详细内容】
2023-11-23  大迁世界  微信公众号  Tags:CSS   点击:(255)  评论:(0)  加入收藏
CSS 新功能:让编码更高效
CSS 是一种不断发展的语言。每一次迭代,它都会变得越来越好。因此,了解最新的 CSS 功能非常重要,这样你才能在项目中使用它们,减少对第三方库的依赖。本文将介绍一些即将推出的...【详细内容】
2023-11-16  大迁世界  微信公众号  Tags:CSS   点击:(167)  评论:(0)  加入收藏
使用 CSS Grid 的响应式网页设计:消除媒体查询过载
前言你是否厌倦了在实现响应式网站时需要管理多个媒体查询?说再见复杂的代码,拥抱更简单的解决方案吧:CSS Grid。在这篇文章中,我们将踏上一场激动人心的 CSS Grid 之旅,发现它如...【详细内容】
2023-11-10  前端YUE  微信公众号  Tags:CSS   点击:(280)  评论:(0)  加入收藏
2024年了,别只使用React,需要学习一下Vue,不然没出路了
最近,我的朋友因为不熟悉 Vue.js 而未能通过面试。她平时工作中大部分时间都在使用React,所以也懒得去了解其他前端框架。世界上所有的前端框架我们都应该熟悉吗?不,这是极其不...【详细内容】
2023-11-08  web前端开发  微信公众号  Tags:Vue   点击:(299)  评论:(0)  加入收藏
站内最新
站内热门
站内头条