CSS自定义属性与前端页面的主题切换

h5 App 适配-移动前端自适应适配布局解决方案(亲测可用) 1.网易h5 App 适配 先来看看网易在不同分辨率下,呈现的效果: 从上面几张图可以看出,随着分辨率的增大,页面的效果会发生明显变化,主要体现在各个元素的宽高与间距。375680的比320680的导航栏明显要高。能够达到这种效果的根本原因就是因为网易页面里除了font-size之外的其它css尺寸都使用了rem作为单位,比如你看导航栏的高度设置代码: 可是在本文第1部分提到,使用rem布局结合在html上根据不同分辨率设置不同font-size有很多不好解决的麻烦,网易是如何解决的呢?最根本的原因在于, 阅读详情

Python微信订餐小程序课程视频

https://edu.youkuaiyun.com/course/detail/36074

Python实战量化交易理财系统

https://edu.youkuaiyun.com/course/detail/35475
基于级联变量的CSS自定义属性,已经出来很多年了。
虽然有less、sass等预处理器大行其道,但是自定义属性也有它的特点和用处,诸如在js中读写、作用域设置等等,在处理UI主题切换等功能上也发挥着很大的作用。

自定义属性

CSS自定义属性(Custom Properties),在一个css选择器内部进行定义,使用两个短横连接线 -- 作为开头命名的名称即被称为自定义属性。
可以给该自定义属性设置任意css属性值。
该自定义属性赋值后,将可以作为变量赋值给css样式属性,会立马生效。

定义:--custom-property-name: custom-property-value。

示例:

body {
  /* 声明自定义属性 */
  --bg-color: #f00;
  /* 使用 */
  background-color: var(--bg-color);
}

上面的代码,即在body下定义了一个名为 --bg-color 的自定属性,并设置值为红色的颜色值 #f00。
被body的背景色 background-color 引用后,则整个页面将会呈现为红色背景。

在使用自定义属性给css样式赋值时,需要使用var()函数,见后文。

命名规则

自定义属性的的命名规则,具体的如下:

  • 可以使用数字[0-9]、字母[a-zA-Z]、下划线[_]和短横线[-]组合
  • 可以使用中文等文字字符
  • 不能使用 $、[、^、(、% 等字符
  • 大小写敏感
div {
  --1: #0f0;
  --背景: yellow;
  --Fontsize: 20px;
  color: var(--1);
  font-size: var(--Fontsize, 30px);
  background-color: var(--背景);
}

如上,使用数字、中文等方式定义,都能生效。

值

在自定义属性声明的时候,需要给属性赋值,可以使用任意css样式属性值支持的格式。
如 #000、12px、center、字符串、数字等等。

{
  --1: #0f0;
  --2: center;
  --f: '测试';
  --n: 22;
  --z: 12px;
}

作用域

css自定义属性存在作用域,即它声明时候所处的css选择器。

  • 当自定义属性属性声明在某个css选择器内的时候,则该选择器的元素和它的所有子元素,都可以使用该自定义属性。
  • 当声明在 :root 下的时候,则全文档范围内皆可使用。

:root 是一个伪类选择器,用来匹配文档的根元素。而在 HTML 中,根元素即为 元素,但:root优先级更高,其他则相同。

:root {
  --color: red;
}
body {
  --bg-color: #ddd;
  color: --color;
  background-color: var(--bg-color);
  width: var(--width); /*自定义属性变量无效*/
}
body .header {
  --width: 1000px;
  color: var(--color);
  background-color: var(--bg-color);
  width: var(--width);
}

上面的示例代码,:root中声明的全局变量,将可以使用在任何地方,而body中的可以被body以及.header引用,在.header中声明的则不能被body引用。

使用自定义属性,必须要使用var()函数,下面我们将了解var()函数。

var()函数

var()函数会返回所引用自定义属性对应的值,并被应用到相应的CSS属性上。
var()函数只能作为属性的值使用,而且是可以代替样式属性中的值的任何部分。
var()函数不能作为属性名、选择器或除属性值外的其他值,如果这样做,只会产生无效语法或无效值。

定义:var(custom-property-name, value)。

  • custom-property-name 必需,自定义属性的名称。
  • value 可选,默认回退值。
div {
  --1: #0f0;
  --border-color: yellow;
  color: var(--1);
  border: 1px solid var(--border-color);
}

--border-color 作为border属性的颜色部分被引用。

默认值参数

var()函数的第二可选参数,表示默认回退值;如果该自定义属性不存在,就会使用这个默认参数值作为属性值。

div {
  font-size: var(--Fontsize, 30px);
}

如上面的代码,当 --Fontsize 不存在时,则 font-size 属性的值就为 30px。

需要注意:只有当我们的自定义属性没有定义时,才会使用默认回退值。
如果自定义属性的值是错误值或不合法的,就不会使用默认值,而是会用样式属性的缺省值代替。
如果默认值也是是错误的值,则会使用属性的缺省值。

<div style="--text-color: 11px;">
  <span style="color: var(--text-color, #f00);">欢迎进入我们的网站span>
  <span style="color: var(--1color, #f00);">今天是星期天span>
  <span style="color: var(--1color, 22px);">晴到多云span>
div>

image

如上面的代码所示,color属性的缺省值是黑色 #000,几段文字中:

  • “欢迎进入我们的网站” 因为 --text-color 的值不是颜色值,所以默认值不起作用,显示黑色;
  • “晴到多云” 因为 --1color 不存在, 并且默认值 22px 不是颜色值,所以也显示缺省值黑色;
  • “今天是星期天” 因为 --1color 不存在, 默认值 #f00 红色有效,所以显示为红色。

不同值的使用情况

var()函数变量在使用时,有几种特殊的情况,需要注意。

用于自定义属性的值

var() 函数变量还能应用于自定义属性声明中,作为值被引用,使用方式一样。

div {
  --1: #0f0;
  --背景: var(--1);
  color: var(--1);
  border: 1px solid var(--背景);
}

--背景 属性使用了 -1 属性来进行赋值。

用于字符串组合

当自定义属性的值是字符串的时候,可以与样式属性值的字符串直接拼接,多用于content属性,如下:

:root {
  --wait-copy: ',请复制';
}
div:after {
  content: '正文'var(--wait-copy);
}

这样就能在页面上显示拼接的 content:正文,请复制。

用于calc()数字计算

当自定义属性的值是数字的时候,除了可以用于 opacity、z-index等使用数字的css属性以外,还可以使用calc函数进行计算处理。
如下所示:

:root {
  --size: 5;
  --width: calc(100px * 5);
}
.div {
  width: var(--width);
  font-size: calc(var(--size) * 10px);
}

可以通过calc计算改变样式属性。

行内样式中的使用

自定义属性和一般的css属性一样,我们同样可以在元素的行内样式中使用这些属性。
如下所示:

<div style="--text-color: red;">
  <span style="color: var(--text-color);">欢迎进入我们的网站span>
  <span class="week">今天是星期天span>
div>

.week {
  color: var(--text-color);
}

在 div 元素的行内样式中声明了一个颜色属性 --text-color,在div的子元素中,通过行内样式和类样式都可以引用生效。

在SVG中使用

svg在html中的使用,既可以像jpg、png等一样以图片形式使用,也可以直接以标签的形式使用。
当我们在页面上以标签形式使用svg的时候,就可以直接引用自定变量属性,和在html中一样使用,如下所示:

:root {
  --color: red;
}
body {
  --color: green;
  --bg-color: #ddd;
  background-color: var(--bg-color);
}

<svg width="32" height="32" xmlns="http://www.w3.org/2000/svg">
  <g fill="none" fill-rule="evenodd">
    <circle stroke="var(--color)" cx="16" cy="16" r="12"/>
    <path d="M16.5 21.5c.672 0 1.5-.084 1.5-.5V11a1 1 0 0 0-1-1h-3.5a.5.5 0 0 0-.5.5v1.112c0 .223.18.404.404.404.135 0 .667.161 1.596.484V21c0 .416.828.5 1.5.5Z" fill="var(--color)" fill-rule="nonzero"/>
  g>
svg>

而图片形式引用的svg图标,则无法使用自定义属性。如果确实想要修改svg图标的颜色,可以使用drop-shadow。

drop-shadow 修改svg图标颜色

给icon加样式 (利用原图标的阴影区域进行处理):

  • 给svg图标icon元素加上transform属性,移动到视觉区域以外隐藏
  • 给icon元素加上filter属性,利用drop-shadow阴影值的方式处理,阴影位移与translateX移动距离要一样
  • 给父元素加上overflow属性,隐藏超出范围的内容,把移动的原图标隐藏掉,显示阴影区域
/*父元素*/
.parent {
  overflow:hidden;
}

/*svg图标*/
img.icon {
  transform: translateX(-80px);
  filter: drop-shadow(red 80px 0);
}

这种方式对于不需要进行事件操作的svg图标较合适。

在javascript中读写

自定义属性变量,可以通过javascript进行读写,就能很方便的进行操作。
这里主要用到样式对象的 setProperty() 和 getPropertyValue() 方法。

  • 操作全局属性
:root {
  --color: red;
}

const root = getComputedStyle(document.documentElement)
// 获取全局属性值
const color1 = root.getPropertyValue('--color').trim()
// 设置属性值
document.documentElement.style.setProperty('--color', 'green')
const color2 = root.getPropertyValue('--color').trim()

console.log(color1, color2) // red green

// 给元素设置样式
const body = document.querySelector('body')
document.querySelector('body').style.backgroundColor = color2
// body的背景色将被设置为绿色

  • 读写元素属性
<div id="welc" style="-text-pos: center;">
div>

// 获取welc元素下定义的属性值,给body设置该值
const welc = document.getElementById('welc')
const align = welc.style.getPropertyValue('--text-pos')
// welc.style.setProperty('--text-pos', 'left')
document.querySelector('body').style.textAlign = align

使用:root主题切换

当我们使用:root选择器定义全局属性,就可以通过该选择器进行主题切换的工作。
这里,我们还需要引入 theme,结合:root选择器和js就可以较好的处理了,具体如下:

  • 定义不同主题的全局属性,如下就是定义了黑色和白色主题:
:root[theme="black"] {
  --color: #000;
}
:root[theme="white"] {
  --color: #fff;
}

  • 在web页面中使用这些自定义属性变量,略过
  • 通过js改变theme的值,就可以切换主题,如下:
const setDocumentTheme = (theme = 'white') => {
  const docElm = document.documentElement
  if (!docElm.hasAttribute('theme')) {
    docElm.setAttribute('theme', theme)
  } else {
    docElm.removeAttribute('theme')
  }
}

通过调用上面的js函数,就可以切换主题,改变web页面的UI样式。

兼容性

大部分主流浏览器都能使用,当然,除了IE。

image

也可以使用js进行检测,ie下支持这种方式检测:

// 是否支持自定义属性
window.CSS && window.CSS.supports && window.CSS.supports('--a', 0)

也可以使用css的 @supports 进行判断,但ie不支持该css特性,所以几乎没用:

@supports ((--a: 0)) {
  /* 支持 */
}
@supports (not (--a: 0)) {
  /* 不支持 */
}

【高频考点精讲】CSS变量实战指南:如何用CSS自定义属性实现主题切换和动态样式 CSS变量,官方名称叫"自定义属性"(Custom Properties),它允许你在CSS中定义可复用的值。想象一下,你装修房子时把所有颜色都记在一个小本本上,需要时直接翻本本查色号,而不是每次都要重新调色——CSS变量就是这个"小本本"。/* 定义变量 */:root {/* 全栈老李提示:变量名前面必须带--前缀 *//* 使用变量 */.button {变量命名要有意义,比如--main-text-color比--color-gray更好。 阅读详情

相关推荐

【高频考点精讲】CSS变量与JavaScript交互:如何实现动态主题切换?

CSS变量与JavaScript的配合为我们打开了一扇新的大门,让动态样式控制变得前所未有的简单。这种技术不仅简化了主题切换的实现,更重要的是它代表了一种思维方式的变化——将样式控制权部分交还给运行时。下次当你需要实现主题切换功能时,不妨试试这个方法。你会发现,原来那些复杂的主题系统,现在用几十行代码就能搞定。(全栈老李原创文章,转载请注明出处)

全栈老李的博客 1059

纯css主题切换,简单易懂 document.documentElement.setAttribute(‘data-theme‘, ‘light‘);

纯css主题切换,贼简单

Li_Ning21的博客 2705

网站前端模板实战:从零搭建静态多页面项目骨架与CSS变量换肤

在网页开发中,静态多页面站点始终占据重要场景,而高效搭建页面骨架是前端工程师的基础能力。通过原生HTML、CSS与JavaScript组合,无需构建工具即可实现完整的企业站或落地页。模板设计遵循组件化思路,利用BEM命名规范组织样式,配合Flexbox与Grid混排完成响应式布局,而CSS自定义属性(变量)则让全局换肤变成修改配置而非改动代码。这种零依赖的多页面组织方式降低了部署与学习成本,尤其适合个人开发者快速交付小型项目,也便于前端新手理解页面结构与样式分离的原理。从本地启动静态服务器,到导航交互、表单

weixin_29014237的博客 318

attr() ,css() ,setAttribute 三者的区别与使用

JQuery 的attr() 与css() 的区别

weixin_40620651的博客 831

HTML5大作业模板:二十四节气主题页面从零搭建指南

在网页前端开发的学习路径中,课程设计是检验综合能力的重要环节。很多学生面对HTML5大作业时,往往困惑于如何将静态页面做得有层次、有交互、有工程感。CSS Grid布局、JavaScript数据驱动渲染、CSS自定义属性等现代前端基础技术,恰恰是解决这类问题的核心工具。理解这些技术的原理与应用场景,不仅能让页面结构清晰、视觉统一,还能实现温度可视化、卡片悬浮动效等交互功能,显著提升作品完成度。本文以中国传统文化中的二十四节气为内容载体,完整演示了从文件结构搭建、数据与展示分离、四季配色方案到答辩准备的全过程

weixin_31115195的博客 263

纯HTML+CSS+JS实现生鲜电商:前端筑基实战指南

HTML语义化、CSS Flex/Grid布局、原生JavaScript交互是前端开发的三大基石概念。其原理在于通过标准DOM操作与浏览器渲染机制协同工作,保障页面结构清晰、样式可控、行为可靠;技术价值体现在零框架依赖下对性能、可访问性与跨端兼容性的深度掌控;典型应用场景包括教育实训、团队新人培养及框架前的能力验证。本文以‘天天生鲜’项目为载体,系统实践语义化标签组织、响应式布局实现、localStorage购物车持久化及requestAnimationFrame轮播优化等核心技能,覆盖真实电商需求中的无障

weixin_33100393的博客 269

js动态设置css主题(Style-setProperty)

定义的参考色,在开发的过程中希望后端人员能遵循// 用于按钮点击颜色num

zarek_jiamu的博客 1187

HTML模板工程化:从静态页面到可维护前端资产

HTML模板是前端开发的入门载体,也是静态站点构建的基础形态。其本质是一组语义化HTML、层叠样式表与轻量脚本的组合,遵循W3C标准且无需运行时依赖。通过原生浏览器能力启动、CSS自定义属性实现主题可配置、Jekyll等静态站点生成器赋能SEO与部署,HTML模板可升级为具备工程化特性的可复用资产。它适用于快速原型验证、个人作品集发布、营销落地页等轻量但需长期维护的场景。本文聚焦‘各种漂亮的HTML模板’如何摆脱ZIP包快照式使用,走向结构清晰、样式可控、部署自动、SEO就绪的工业级实践路径。

weixin_34326429的博客 381

创建uni-app项目

创建uni-app项目 1. 2.

atu1111的博客 4578

绿色主题WAP响应式博客资讯网站模板(含多页面组件与SEO优化)

CSS自定义属性(Custom Properties)是构建绿色主题动态切换架构的基石,其价值远超传统预处理器变量——它支持运行时计算、继承链传播与JavaScript实时操控,使绿色主题真正具备“活态”特征。该架构采用三层变量设计:基础色板层(Base Palette)定义不可变的绿色基准(如),语义映射层(Semantic Mapping)将基础色转换为功能角色(如),上下文修饰层(Contextual Modifiers)根据组件状态动态调整(如。

weixin_42522857的博客 310

S32DS IDE调试技巧:如何用Attach功能高效定位汽车电子MCU的Bootloader问题

本文详细介绍了在汽车电子MCU开发中,如何利用S32DS IDE的Attach调试模式高效定位Bootloader与应用程序的协同问题。通过对比常规调试与Attach模式的本质差异,并深入讲解工程配置、镜像合并及实战调试流程,帮助开发者在不复位、不重新下载程序的前提下,实时分析系统状态,快速解决内存映射冲突、中断向量表重定向等疑难杂症。

weixin_29168393的博客 272

404模板源码解析:暗色/亮色灯光切换背后的CSS与jQuery实现原理

本文以开源项目 **404**(404 Page Not Found 页面模板)为例,拆解"暗色/亮色灯光切换"背后的 CSS 与 jQuery 实现原理:如何用一行 `toggleClass` 和几段 CSS,做出点击开关"一键亮灯"的炫酷 404 错误页效果。适合前端新手快速理解 CSS 主题切换的经典套路 🔦 ## 这个 404 页面模板能做什么? 这是一个开箱即用的 404 错误页模

gitblog_00865的博客 113

UVM(5)-TLM通信

TLM是一种基于事务 (transaction) 的通信方式,通常在高抽象级语言例如SystemC或者SV/UVM中作为模块之间的通讯方式。

2301_76431006的博客 2106

用CSS变量实现日间/夜间主题切换:零基础自学第四天实录

CSS自定义属性(CSS Variables)是现代前端样式管理的基础能力,它允许开发者将颜色、间距等设计令牌集中定义,再通过作用域继承实现全局复用。当页面需要支持日间与夜间两种主题时,利用CSS变量与属性选择器相结合,只需切换根元素的data-theme属性,即可让所有组件自动响应新的颜色变量,无需逐一修改样式。这种模式不仅减轻了维护成本,也为JavaScript介入样式控制提供了简洁的桥梁,配合localStorage还可持久化用户偏好。在个人主页、管理后台、内容社区等场景中,暗色模式已成为基础体验需求

weixin_31556767的博客 228

std::map看来可以被淘汰了?可以用vector来替代,而且更好

vector的优势在于内存连续,可以先std::sort,然后std::lower_bound,或者std::binary_search。而std::map,insert的时候,需要new出内存。

tumu_C的博客 1020

VSAN数据救援实战:当26个虚拟机突然不可访问时我们做了什么?

本文深度复盘了一次由运维操作失误引发的VMware vSAN存储危机,导致26个虚拟机数据不可访问的实战救援过程。文章详细剖析了vSAN脑裂状态的诊断方法,分享了在官方支持受限时,如何结合社区智慧与自主分析,通过精准的底层命令干预和状态推理,最终成功恢复全部数据的破局思路与操作细节,为vSAN数据救援提供了宝贵经验。

weixin_35749786的博客 239

Tailwind CSS v4 主题化实践入门(自定义 Theme + 主题模式切换)✨

Tailwind v4引入了@theme指令,简化了主题变量的定义,并支持CSS变量,使得主题设计更加灵活。此外,@custom-variant指令允许开发者自定义变体,如暗黑模式或侧边栏模式,而@layer指令则用于管理自定义样式的层级,确保样式优先级。通过这些新特性,开发者可以更高效地实现主题切换和UI设计,提升前端开发体验。

sunbyte带你学 3785

RDKit实战:5分钟搞定药物分子相似性分析(附Python代码)

本文提供了一套基于RDKit的快速药物分子相似性分析实战指南。通过Python代码演示,从环境搭建、分子指纹(如Morgan指纹)计算到Tanimoto相似性排序与可视化验证,帮助研究者在5分钟内完成从海量化合物库中精准筛选潜在活性分子的全流程,提升药物发现效率。

weixin_29193359的博客 316

前端主题切换方案详解

现在我们经常可以看到一些网站会有类似暗黑模式/白天模式的主题切换功能,效果也是十分炫酷,在平时的开发场景中也有越来越多这样的需求,这里大致罗列一些常见的主题切换方案并分析其优劣,大家可根据需求综合分析得出一套适用的方案。本文共讲解了5个方案,以及优缺点对比,请耐心查看。

2401_83384536的博客 1761

告别懵圈!用CANoe 5640手把手带你跑通SomeIP TC8测试(附脚本思路)

本文详细解析了基于CANoe 5640的SomeIP TC8测试全流程,从环境搭建到结果分析,特别针对车载以太网测试中的SomeIP协议测试难点提供实战指南。通过典型测试用例SOMEIP_TEST_61,手把手教你配置CANoe工程、编写CAPL脚本,并解决常见问题,助力开发者高效完成协议验证。

weixin_30791095的博客 363

LVGL开发新选择:深度对比NXP GUI Guider与SquareLine Studio,免费版够用吗?

本文深度对比了LVGL开发中两款主流工具NXP GUI Guider与SquareLine Studio的核心差异,包括功能定位、设计能力、代码生成质量和硬件适配等方面。针对不同项目需求,分析了免费版工具的适用性,帮助开发者根据预算和功能需求做出明智选择。特别关注了GUI设计工具在嵌入式开发中的实际应用效果。

weixin_26976635的博客 433

前端网站主题切换原理与实践:CSS 类名切换方案

现代Web开发中,主题切换功能通过CSS变量和JavaScript实现,提升用户体验。核心原理是动态切换HTML元素的CSS类名,从而应用不同样式。实现方案包括:定义主题CSS变量、创建切换控件HTML结构、使用JavaScript管理主题切换逻辑。关键技术涉及CSS变量、平滑过渡动画、localStorage持久化存储以及系统主题检测。进阶功能支持多主题扩展和组件级定制,最佳实践强调渐进增强和无障碍访问。这种方案既灵活又高效,能显著改善用户界面体验。

尽日寻春不见春,芒鞋踏遍陇头云。归来笑拈梅花嗅,春在枝头已十分。 745

uniapp - Invalid value “iife” for option “output.format” - UMD and IIFE output formats are not suppo

Invalid value “iife” for option “output.format” - UMD and IIFE output formats are not supported for code-splitting builds. uniapp 编译报错,vite vue3 Hbuilder 中编译报错,uniapp 打包 App 报错(vue3)hbuilder提示错误,uniapp运行到手机/模拟器 App 报错(vue3)uniapp项目启动报错,如何解决这个问题,安卓app,苹果app

🏆 前端领域优质创作者 3967
上一篇: dotnet 委托的实现解析
下一篇: # 数值计算:三角形积分
pythonxxoo
博客等级 码龄5年 337粉丝 670原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值