优维低代码:Theme & Mode 页面主题和模式

全网最详细的vue2实现暗黑模式(深色主题与浅色主题切换)入门级即可学会@非常简单 vue2实现暗黑模式【深色与浅色】 阅读详情

优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。


连载第三十一期

《高级指引:Theme & Mode 页面主题和模式》

▽

⊙ NOTE

Brick Next 从 2.7.1 开始支持页面主题和模式。

Brick Next 支持两种主题:light 和 dark(默认为 light),以及两种模式:default 和 dashboard(默认为 default)。

在 dark 深色主题下,页面框架及构件将以深色背景样式显示。而在 dashboard 大屏模式下,系统的页面顶栏及侧栏将消失,同时配合 basic-bricks.micro-view 开启 dashboardMode: true 可以实现大屏效果。

目前主要在“大屏”场景下使用,注意该场景需要同时启用深色主题和大屏模式。

# 微应用编排:切换主题和模式

例如在 Storyboard 编排中,希望某个按钮点击后切换到“深色+大屏”场景,可以如下配置:

brick: "your-button"
events:
  click:
    - action: "theme.setDarkTheme"
    - action: "mode.setDashboardMode"

每当页面初始进入、或发生跳转并重新渲染前,系统将自动切回浅色主题和默认模式,但系统开放了一个窗口期 onBeforePageLoad,以支持页面可以设置初始化为深色主题及大屏模式。

例如假设我们希望 URL 中携带参数 mode=dashboard 时自动使用深色主题和大屏模式,可以如下配置:

brick: "basic-bricks.micro-view"
lifeCycle:
  onBeforePageLoad:
    - if: "<% QUERY.mode === 'dashboard' %>"
      action: "theme.setDarkTheme"
    - if: "<% QUERY.mode === 'dashboard' %>"
      action: "mode.setDashboardMode"
properties:
  dashboardMode: "<% QUERY.mode === 'dashboard' %>"

注意 basic-bricks.micro-view 构件在大屏模式下会多一个退出按钮,点击后将发出 mode.dashboard.exit 事件,需要用户自行配置退出大屏需要执行的动作。例如通常应添加如下事件配置:

brick: "basic-bricks.micro-view"
events:
  mode.dashboard.exit:
    - target: "_self"
      properties:
        dashboardMode: false
    - action: "theme.setLightTheme"
    - action: "mode.setDefaultMode"

不内置退出动作的原因是,用户可以通过其他方式退出大屏,例如通过 history.pushQuery 跳转重置 mode=dashboard 参数来实现退出大屏模式:

brick: "basic-bricks.micro-view"
events:
  mode.dashboard.exit:
    - action: "history.pushQuery"
      args:
        - mode: null

⊙ IMPORTANT

不要在编排中为构件配置固定的颜色值,而应使用系统预定义的 CSS custom properties,具体可以参考本文下一节内容。

# 构件开发:适配深色主题和大屏模式

系统通过定义一系列 CSS custom properties(又称 CSS variables)来实现主题样式的实时无缝切换,无论在编排或构件开发时应首先尝试使用这些属性。具体属性列表可以参考这里的源码。

系统当前的主题和模式反馈在<html>元素的 data-theme 及 data-mode 属性上,因此仅使用 css 即可完成大部分深色主题和大屏模式的适配。例如:

.your-class {
  color: black;
}


html[data-theme="dark"] .your-class {
  color: white;
}

当使用系统预定义的 CSS custom properties 时,则无需额外配置 html[data-theme="dark"] 样式:

.your-class {
  color: var(--text-color-default);
}

有时候构件需要在 JavaScript 中判断当前主题或模式,例如图表类构件需要根据当前主题来生成不同的颜色列表,对此系统提供了 React Hooks useCurrentTheme 和 useCurrentMode 来获取当前的主题和模式,例如:

import { useCurrentTheme } from "@next-core/brick-kit";


function YourComponent() {
  const theme = useCurrentTheme();


  const colors = theme === "dark" ? ["red", "green"] : ["blue", "orange"];


  return <YourChart colors={colors} />;
}

# 适配公共 UI 规范样式

使用 Less

Brick Next 的 UI 底层基于 Ant Design,在适配我们自己的 UI 规范相关的样式时,应结合 Ant Design 的底层技术 Less 的能力,尽量通过使用或覆盖已有的 Less 预定义变量值来实现样式更新,而不是使用固定的颜色值。例如:

// ✅ Good:
// In `packages/custom-antd-styles/src/var.less`:
@link-hover-color: #0071eb;


// ❌ Bad:
// In `packages/custom-antd-styles/src/link.less`
a:hover {
  color: #0071eb;
}
// ✅ Good:
// In `bricks/your-brick/src/style.less`:
.your-class {
  color: @link-hover-color;
}


// ❌ Bad:
// In `bricks/your-brick/src/style.less`
.your-class {
  color: #0071eb;
}

Brick Next 的 Antd Less 变量统一管理在 next-core 仓库的
packages/custom-antd-styles/src/var.less 中。

# 使用 CSS Variables

由于 Less 的处理发生在编译阶段,无法在运行时提供切换变量的能力,因此为了实现运行时深色主题的自由切换,我们还需要结合使用 CSS custom properties(又称 CSS variables)。

对于色值一类的样式(例如 color: #fff)通常需要为默认主题和深色主题配置不同的色值,此时,我们可以将 Antd 中对应的 Less 变量设置为 CSS variables,并针对不同主题分别设置不同的色值。例如:

// In `packages/custom-antd-styles/src/var.less`:
@text-color: var(--antd-text-color);
/* In `packages/brick-container/src/styles/variables.css`: */
:root {
  --antd-text-color: rgba(0, 0, 0, 0.85);
}


html[data-theme="dark"] {
  --antd-text-color: #c6cfd9;
}

⊙ NOTE

注意我们统一使用 --antd- 作为前缀加上对应的 Antd Less 变量名作为 Antd 相关的 CSS variable name。

Brick Next 的 CSS variables 统一管理在 next-core 仓库的
packages/brick-container/src/styles/variables.css 中。

# 处理 Less 编译报错

由于 Antd 大量使用了色值计算(例如 darken(...) lighten(...) 等),这些计算无法兼容 CSS variable,因此有时当我们使用 CSS variable 作为 Less 的变量值时,构建 Less 可能会报错,对此的解决方案是使用我们自定义的 LessReplacer 插件,将这些报错的色值计算代码进行替换。

例如:

// In `packages/less-plugin-css-variables/src/LessReplacer.js`:
const rawStringMap = {
  "darken(@item-active-bg, 2%)": "var(--antd-item-active-bg-darken-2)",
};

以上配置将把 Antd Less 文件中所有的 darken(@item-active-bg, 2%) 替换为 var(
--antd-item-active-bg-darken-2),注意变量命名方法为「--antd- 前缀 + Antd Less 变量名 + 方法名 + 参数值」。

又例如:

// In `packages/less-plugin-css-variables/src/LessReplacer.js`:
const variableMap = {
  "table-header-sort-active-bg": true,
};

以上配置将把 Antd Less 文件中所有的 @
table-header-sort-active-bg: **;(假设 ** 为包含色值计算等导致 Less 编译报错的代码)的定义替换为 @
table-header-sort-active-bg: var(--antd-table-header-sort-active-bg)。

注意这些新增的 --antd-* 需要在
packages/brick-container/src/styles/variables.css 中写好定义。

前端夜间模式(换肤)方案 对于上面提到的实现方案,均不涉及持久化,可将对应的模式保存到本地缓存(localStorage)里,然后每次渲染读取缓存的模式值进行渲染,并且切换的时候修改缓存中的模式即可。 阅读详情

相关推荐

低代码如何自定义主题?一文教会你

低代码如何自定义主题?一文教会你

山川软件的博客 1117

Vue + Scss 动态切换主题颜色实现换肤

根据预设的配色方案,在前端实现动态切换系统主题颜色。 大概的思路就是给html根标签设置一个data-theme属性,然后通过js切换data-theme的属性值,Scss根据此属性来判断使用对应主题变量。这里可以选择持久化Vux或接口来保存用户选择的主题。 一、首先需要给项目下载配置Scss 1.安装依赖 npm installnode-sasssass-loader --save-dev 2.找到build中webpack.base.conf.js,在rules中添加scss规则 {..

冰雪为融的博客 5785

Vue3自定义Hooks一键换肤教程

然后我们点击的时候,通过这样就能实现简单的更换肤色功能了什么?你以为这就完了?好戏刚开始。

weixin_64051447的博客 1367

前端应用--工程化主题切换功能

随着各个应用平台和网站都开始支持深色模式,相较于传统的页面配色方案,深色模式具有较好的降噪性,也能让用户的眼睛看内容更加舒适。 那么对于前端开发来说,如何高效的支持深色模式呢?这里的高效指的是工程化、自动化方案,不需要在开发过程中hard coding。 PostCSS原理及相关插件能力 postcss是一款使用JavaScript编写的用于编译css的工具,具有良好的插件性,非常有利于开发者扩展。 原理: PostCSS接受一个css文件,并提供了插件机制,提供给开发者分析、修改css规则,具体实现方式是

xiaobing_hope的专栏 1410

DarkModeToggle:使用html标签的data-theme属性切换主题

黑暗模式切换 在CSS中,元素的颜色是使用预定义的变量设置的。 每个主题本质上只是这些变量的一组不同的值。 在CSS html[data-theme=&quot;dark&quot;]中声明了不同的主题。 在这里,切换键用于更改主题。 可以使用任何其他输入。 JavaScript从切换键获取输入,并更改&lt;html&gt;标记的data-theme属性的值。 这会导致CSS变量的值发生变化,因为深色主题具有不同的值。

深入解析HAL_UART_Receive_IT:如何高效配置串口中断接收

本文深入解析了STM32 HAL库中`HAL_UART_Receive_IT`函数的工作原理与高效配置方法。该函数并非直接接收数据,而是作为中断接收的启动器和配置器,通过开启相关中断,由`UART_Receive_IT`在后台完成数据搬运。文章详细对比了中断与轮询模式的区别,并提供了不定长数据接收的完整实战流程、常见问题避坑指南及高级应用技巧,帮助开发者构建稳定高效的串口通信。

weixin_29162439的博客 640

vue nuxt网站设置黑夜 白天模式切换 自动识别系统主题色变化

主要用到的方法。 document.body.setAttribute("data-theme", 'dark'); window.matchMedia('(prefers-color-scheme: dark)').matches

qq_42176747的博客 2503

【论文+代码】ZS-N2N实现小样本零网络图像去噪

本文涵盖论文原文讲解与代码复现。

weixin_46287760的博客 4002

动态样式+动态主题

【代码】动态样式+动态主题。

记录工作 350

信号系统核心概念:卷积、傅里叶变换与抽样定理的工程实践指南

信号与系统是理解现代电子、通信与数字处理技术的基石。其核心在于通过数学工具对物理世界进行建模与分析,其中卷积运算揭示了线性时不变系统对任意输入的响应可分解为冲激响应的叠加,这一原理极大提升了系统测试与分析的效率。而傅里叶变换则提供了从时域到频域的映射,将复杂的时域卷积运算转化为频域的简单乘法,是实现频谱分析、滤波设计的关键。抽样定理则架起了模拟与数字世界的桥梁,明确了无失真数字化的条件。这些基础理论共同构成了滤波器设计、音频处理、图像分析及通信系统等广泛工程应用的技术支柱。本文聚焦于卷积与傅里叶变换,结合冲

weixin_30788619的博客 629

CarMaker快速入门

本合集是小明师兄推出的CarMaker汽车仿真,CarMaker无论是传统动力学、动力系统开发、底盘系统开发还是目前智能驾驶辅助系统及智能驾驶系统开发有着非常重要的作用,可以有效节省开发周期和开发成本,基于仿真快速实现算法开发和系统验证。...

小明师兄的博客 1万+

记录--Vue3自定义一个Hooks,实现一键换肤

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 核心 使用CSS变量, 准备两套CSS颜色, 一套是在 light模式下的颜色,一套是在dark模式下的颜色 dark模式下的 CSS 权重要比 light 模式下的权重高, 不然当我们给html添加自定义属性[data-theme='dark']的时候, dark模式权重比light低,会一直不起效果 当我们点击 dark ...

林恒的博客 1241

基于Dify与DeepSeek构建中医智能问答工作流:从知识库到精准处方

本文详细介绍了如何利用Dify与DeepSeek构建中医智能问答工作流,实现从知识库构建到精准处方的全流程。通过模型编排和知识检索技术,系统能够结合中医辨证思维与AI推理能力,为基层医师、学生和爱好者提供结构化诊疗建议。文章重点分享了知识库选材、症状标准化处理、智能检索与辨证推理等核心环节的实战经验。

weixin_29062255的博客 253

暗黑模式切换(vue版)

网上很多方法都采用scss,现在用原生css实现一种简单版 mode.vue(随便定义名称): // 在data里面定义mode为false /* * 模式切换 * */ fnChangeMode(){ this.mode = !this.mode; if (this.mode == true) { window.document.documentElement.setAttribute('data-theme', 'dark')

qq_33332184的博客 7060

Ai数字人直播系统搭建,本地源码部署,源码交付--支持OEM系统贴牌

AI 数字人直播系统是利用人工智能技术创建虚拟主播,并通过数字化技术实现直播互动的系统1。以下是其相关介绍:Ai数字人直播系统搭建,本地源码部署,源码交付--支持OEM系统贴牌。

weixin_ggwwsscc的博客 621

Milvus 向量数据库部署方案全景指南:从单机开发到生产级高可用集群

本文系统介绍了Milvus向量数据库的四大部署方案:嵌入式开发利器Milvus Lite、单机简易部署Standalone模式、生产级高可用Cluster模式以及全托管SaaS服务Zilliz Cloud。针对不同应用场景(开发测试、小型应用、大规模生产环境),详细分析了各模式的适用条件、资源配置要求和部署步骤,并提供了关键配置示例。文章强调正确选择部署方案对系统性能至关重要,帮助开发者根据向量规模、QPS和高可用需求,选择最优部署方式,实现资源优化与稳定运行。

reset2021的博客 385

003_颜色主题

1. 最简单的更改全局样式的方式, 是直接采用颜色主题(theme)。 2. ECharts5除了一贯的默认主题外, 还内置了'dark'主题。 3. dark主题例子 3.1. 代码 &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="utf-8" /&gt; &lt;title&gt;dark主题&lt;/title&gt; &lt;!-- 引入echarts.js --&gt; &lt;scri

aihiao的专栏 451

windows exe爬虫:exe抓包

在不知情所拦截应用使用的流量时,所以建议用Wireshark。本文利用python代码,实现自动拦截,写入pcap包,并用代码分析流量的协议。这样会在本地目录下生成capture_inbound.pcap,可以用wireshark分析,也可以利用python代码进行分析,如果使用python代码进行分析,需要借助pyshark或者scapy。使用的python WinDivert的包,当然前提也是需要安装Wireshark软件,设置环境变量,并安装pydirvert包。

youbingchen的博客 618

html5的 data-* 实现主题色

&lt;div class="main" id="main" :data-theme="theme"&gt;&lt;/div&gt; [data-theme='black'] { --content-bg-color: #040506; //中心区域背景色 --content-page-bg-color: #111216; //页面区域背景色 --header-icon-color: #fff; //头部图标 // 标尺 --ruler-shadow-color: rgba(0, 100,.

weixin_45890414的博客 2767

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

vue使用scss方法(报错解决方案),及变换主题色

借鉴链接1(主要看这个) 渐渐链接2 一、首先需要给项目下载配置Scss 1.安装依赖 npm install node-sass sass-loader --save-dev 2.找到build中webpack.base.conf.js,在rules中添加scss规则 { test: /\.scss$/, loaders: ['style', 'css', 'sass'v] } 3.vue中使用 &lt;style lang='scss' scoped&gt; &lt;/style&

weixin_44279016的博客 5125

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

vue2自定义切换主题 dark暗黑主题(暗黑模式)

vue2实现自定义的主题切换方案,例如暗黑主题切换,可自定义颜色和主题的数量,支持修改组件内部的颜色样式,例如Element UI

qq_36828272的博客 5860

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

html5 data-theme 自定义,10分钟打造一款属于自己的Ghsot博客主题,持续更新中.........

就我目前所知,对个人博客感兴趣的有这些群体:学生、作者、程序员、设计师...对于开源的博客框架也有很多种选择,你可以用老牌的 WordPress 、 也可以用 Github + Jekyll 搭一个静态的站点、也可以用二次元码农喜欢的 Hexo , 还有 Hugo 等等,当然还有我们的 Ghost以上的大部分博客框架我都有尝试过,最终还是觉得 Ghost 用得比较顺手。优缺点什么的我这里就不做对比...

weixin_32528123的博客 1093

VUE3中实现主题颜色切换

root{这里定义了两套CSS主题,:root会选择到根元素,也就是会选择到Html元素,所以在Html下的元素都可以引用创建好的变量,实现共用颜色主题,这个文件可以直接在main.ts文件中import引入。

阿琰a_的博客 2524

魔改教程总结(一)

{% folding cyan,点击查看教程 %}非商免字体未经授权仅限个人使用,不得用于商业用途!{% hideBlock 预览效果 %}准备好字体文件后,在/*------------- 自定义字体 ------------------*//* 为载入的字体取名字(随意) *//* 字体文件地址(相对或者绝对路径都可以,/source 为根目录 /) *//* 定义加粗样式(加粗多少) *//* 定义字体样式(斜体/非斜体) *//* 定义显示样式 */

Alonelies的博客 2005

vue3 主题色 换肤

vue3 换肤 主题色

爱玩亚索的程序员 565
上一篇: 优维科技EasyOps®一体化运维平台入选“大信创产品目录”
下一篇: B站:以SLO为核心的可用性观测与质量运营
优维科技EasyOps
博客等级 码龄5年 1483粉丝 395原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值