【技术控请进】华为云DevCloud深色模式开发解读
引言
主题切换器开发
- CSS自定义属性使用
<!--html--> <div><p>text</p></div> /* css */ div { --my-color: red; border: 1px solid var(--my-color); } p { color: var(--my-color); }
- Sass/Less支持

- 使用媒体查询
// css @media (prefers-color-scheme: light) { :root{--变量1: 色值1;--变量2: 色值2; ……} } @media (prefers-color-scheme: dark) { :root{--变量1: 色值3; --变量2: 色值4; ……} }
// js function isDarkSchemePreference(){ return window.matchMedia('screen and (prefers-color-scheme: dark)').matches; }
- 主题切换服务
// theme.ts export class Theme { id: ThemeId; name: string; data: { [cssVarName: string]: string }; } // theme-service.ts class ThemeService { contentElement; eventBus; // …… applyTheme(theme: Theme) { this.currentTheme = theme; if (!this.contentElement) { const styleElement = document.getElementById('devuiThemeVariables'); if ( styleElement) { this.contentElement = <HTMLStyleElement>styleElement; } else { this.contentElement = document.createElement('style'); this.contentElement.id = 'devuiThemeVariables'; document.head.appendChild(this.contentElement); } } this.contentElement.innerText = ':root { ' + this.formatCSSVariables(theme.data) + ' }'; document.body.setAttribute('ui-theme', this.currentTheme.id); // 通知外部主题变更 this.notify(theme, 'themeChanged'); } formatCSSVariables(themeData: Theme['data']) { return Object.keys(themeData).map( cssVar => ('--' + cssVar + ':' + themeData[cssVar]) ).join(';'); } private notify(theme: Theme, eventType: string) { if (!this.eventBus) { return; } this.eventBus.trigger(eventType, theme); } //
深色模式开发
- 语义化色彩变量

图1 语义化变量示意
- 使用统一语义变量控制组件表现

图2 使用变量对组件进行规约
- 提供暗黑主题色值

图3 通过色值的切换实现深色主题切换
- 图片的处理
// css body[ui-theme-mode='dark'] img { opacity: 0.8; }
// css body[ui-theme-mode='dark'] .dark-mode-image-overlay { position: relative; } body[ui-theme-mode='dark'] .dark-mode-image-overlay::before { content: ''; display: block; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: rgba(50, 50, 50, 0.5); }
- 提供主题变化订阅应对第三方组件场景
// theme/interface.ts export interface IEventBus { on(eventName: string, callbacks: Function): void; off(eventName: string, callbacks: Function): void; trigger(eventName: string, data: any): void; }
降级支持和使用脚本腻子
- 降级PostCSS插值脚本
// postcss-plugin-add-var-value.js var postcss = require('postcss'); var cssVarReg = new RegExp('var\\\\(\\\\-\\\\-(?:.*?),(.*?)\\\\)', 'g'); module.exports = postcss.plugin('postcss-plugin-add-origin-css-var-value', () => { return (root) => { root.walkDecls(decl => { if (decl.type !== 'comment' && decl.value && decl.value.match(cssVarReg)) { decl.cloneBefore({value: decl.value.replace(cssVarReg, (match, item) => item) }); } }); } });

- css-vars-ponyfill 使 IE9+ 和 Edge 12+支持上主题切换
// polyfill.ts import cssVars from 'css-vars-ponyfill'; cssVars({ watch: true, silent: true});
一些问题的探讨
- 什么网站需要开发深色模式?
- 有没有更简单的深色模式映射切换?比如使用HSL替代RGB色值。

图4 一种白色的存在切换主题的多种映射
- Sass/Less使用var变量后变成字符串管理,无法对颜色进行变换计算?

【技术控请进】华为云DevCloud深色模式开发解读的更多相关文章
- 科技感满满,华为云DevCloud推出网页暗黑模式
近期,华为云DevCloud推出了暗黑模式,让用户在网页端也可以体验到桌面级应用才有的特性. 深色模式(Dark Mode),俗称暗黑模式.是近2年以来用户呼声最高的功能之一,一些国外顶级厂商都将 ...
- 古有七步成诗,今有六步完成DevOps上华为云DevCloud实践
引言: 在“DevOps能力之屋(Capabilities House of DevOps)”中,华为云DevCloud提出(工程方法+最佳实践+生态)×工具平台=DevOps能力.华为云DevClo ...
- AI如何驱动软件开发?华为云DevCloud 权威专家邀你探讨
近期,国际著名咨询公司Gartner 在一份研究报告中将 "AI-Driven Development" 列为 2019 年的 Top 10 Strategic Technolog ...
- 华为云DevCloud为开发者提供高效智能的可信开发环境
在HUAWEI CONNECT 2019期间,在华为云云服务开发者分论坛上,华为云布道师做了<CloudIDE:开发者的高效.智能的可信开发环境>专题演讲,主要介绍了华为云DevCloud ...
- 华为云DevCloud一枝独秀
DevOps,是Development和Operations的组合词,是指一组过程.方法与系统的统称,用于促进开发.技术运营和质量保障部门之间的沟通.协作与整合.DevOps是一种重视“软件开发人员( ...
- 一图看懂华为云DevCloud如何应对敏捷开发的测试挑战
作为敏捷开发中测试团队的一员,在微服务测试过程中,你是不是也遇到同样困惑:服务不具备独立验证能力.自动化用例开发效率很低等? 华为云DevCloud API全场景测试技术来支招~围绕API的全场景,打 ...
- 【华为敏捷/DevOps实践】7. 敏捷,DevOps,傻傻不分清楚【华为云技术分享】
文:姚冬(华为云DevCloud首席技术布道师,资深DevOps与精益/敏捷专家,金融解决方案技术Leader,中国DevOpsDays社区核心组织者) 前言 敏捷是什么?DevOps是什么?两者有什 ...
- 中国DevOps平台市场,华为云再次位居领导者位置
摘要:华为云软件开发生产线DevCloud在市场份额和发展战略两大维度均排名第一,再次位居领导者位置. 9月21日 ,国际权威分析师机构IDC发布<IDC MarketScape: 中国 Dev ...
- DevOps on DevCloud|如何采用流水线践行CI/CD理念【华为云技术分享】
[摘要] 持续集成/持续交付(CI/CD,Continuous Integration/Continuous Deployment)在DevOps CMALS理念中具有支柱性地位,因而CI/CD流水线 ...
- 【华为云实战开发】9.如何进行PHP项目的快速搭建并实现CICD?【华为云技术分享】
1 概述 1.1 文章目的 本文主要想为研发PHP项目的企业或个人提供上云指导,通过本文中的示例项目 “workerman-todpole”,为开发者提供包括项目管理,代码托管,代码检查,编译构建,测 ...
随机推荐
- win10系统单独编译和使用WebRTC的回声消除(AEC)、音频增益(AGC)、去噪(NS)模块
一.简介 本人想单独编译并使用WebRTC的音频回声消除模块,奈何技术有限,于是在百度的海洋里大海捞针,发现了https://www.cnblogs.com/mod109/p/5827918.html ...
- 入手react的 第一坑
npm verb cli /usr/local/bin/node /usr/local/bin/npm npm info using npm@9.8.1 npm info using node@v18 ...
- 网络层IP数据包
网络层 功能 选择数据通过网络(IP地址)的最佳路径 协议字段 版本号(4bit):指IP协议版本.并且通信双方使用的版本必须一致,目前我们使用的是IPv4,表示为0100 十进制 是4 首部长度(4 ...
- 语雀崩了,免费送VIP6个月,赶紧薅!!
一.前言 在一个无聊的周一,下午浑浑噩噩的时候,一条公众号信息引起我的关注. 什么东西?语雀这种量级的产品也能崩? 看了一下还真是官方公众号发的!! 心里不由得出现,完蛋整个团队要打包遣散了. 其实小 ...
- 如何使用DALL-E 3
如何使用 DALL-E 3:OpenAI 图像生成指南 DALL-E 3 是 OpenAI 图像生成器的高级版本,它可以理解自然语言提示来创建详细图像. 它克服了以前版本的方形图像限制,现在支持各种宽 ...
- YbtOJ 「动态规划」第5章 状压DP
犹豫了许久还是决定试试始终学不会的状压 dp.(上一次学这东西可能还是两年前的网课,显然当时在摸鱼一句都没听/kk 果然还是太菜. 例题1.种植方案 设 \(f_{i,j}\) 表示第 \(i\) 行 ...
- [Python急救站]密码判断
用Python做一个密码判断,用户输入注册密码,需要6位以上,包含数字.大写字母.小写字母. import re a = re.compile('[a-z]') b = re.compile('[A- ...
- 关于Anolis8/Centos8系统重启后ip地址丢失的原因
关于Anolis8/Centos8系统重启后ip地址丢失的原因 #.今天把之前在VMware安装的Anolis8系统重启了,启动之后发现Xshell连接不上.在VMware上登录后执行ip a命令发现 ...
- 神经网络入门篇:详解随机初始化(Random+Initialization)
当训练神经网络时,权重随机初始化是很重要的.对于逻辑回归,把权重初始化为0当然也是可以的.但是对于一个神经网络,如果把权重或者参数都初始化为0,那么梯度下降将不会起作用. 来看看这是为什么. 有两个输 ...
- 【web实验报告】实验二
一.实验目的 通过一个小型网站的开发,掌握JSP基础知识,加深对session,request,response,cookie等对象的理解,掌握其使用方法,进一步深入掌握HTML.CSS和JavaSc ...