【技术控请进】华为云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”,为开发者提供包括项目管理,代码托管,代码检查,编译构建,测 ...
随机推荐
- Linux账号密码安全运维
前言 随着云计算厂商的兴起,云资源如ECS不再只有企业或者公司才会使用,普通人也可以自己买一台ECS来搭建自己的应用或者网站.虽然云计算厂商帮我们做了很多安全相关的工作,但并不代表我们的机器资源就绝对 ...
- 为何 DevOps 会给开发人员带来压力和倦怠?
企业正在享受 DevOps 实施带来的好处,但这也是有代价的.开发人员需要承担额外的责任,可能会导致他们感到疲惫不堪.因此我们可以采取一些方法来确保 DevOps 工程师的满意度. DevOps 的支 ...
- Qt5 学习积累
目录 1.cout/cin 2.随机数 3.QSting. string.QChar,.char等的转换 4.退出 5.Qt::tr() 6.QFrame::shape,shadow 7.QCombo ...
- Kafka 集群如何实现数据同步?
哈喽大家好,我是咸鱼 最近这段时间比较忙,将近一周没更新文章,再不更新我那为数不多的粉丝量就要库库往下掉了 T﹏T 刚好最近在学 Kafka,于是决定写篇跟 Kafka 相关的文章(文中有不对的地方欢 ...
- C#中LINQ的使用知多少?LINQ常功能整理,实例源代码解析
LINQ(Language-Integrated Query)是C#语言中的一个强大的查询技术,它提供了一种统一的查询语法,可以用于查询和操作各种数据源,包括集合.数据库.XML等.下面详细描述了LI ...
- StackGres 1.6 数据库平台工程集群配置管理(K8S Pods/PostgreSQL/PgBouncer)
Postgres 配置 PostgreSQL 的配置在 SGPostgresConfig CRD 中指定.如果在创建集群时没有指定自定义配置,StackGres 将创建一个默认配置,您可以在 这里 看 ...
- 生命体征监测VSM
参考来源:ADI官网技术文章.知乎(hxl695822705.深圳加1健康科技 ) 缩写 全称 翻译 VSM Vital Signs Monitor 生命体征监测 ECG ElectroCardioG ...
- Springboot+shiro,完整教程,带你学会shiro
您的第一个 Apache Shiro 应用程序 引入依赖: <?xml version="1.0" encoding="UTF-8"?> <p ...
- 吉特日化MES实施--三种浪费
在实施吉特日化MES系统的过程中,遇到各种问题,包括自身问题以及甲方问题,导致项目滞后延期的主要问题分析,汇总三种浪费: (1) 信息传递的浪费: 这个在甲方产品设计以及生产过程中出现的问题,也是我 ...
- MybatisPlus高级特性之SimpleQuery工具类
1.是很么? SimpleQuery可以对selectList查询后的结果使用Stream流进行操作,使其可以返回指定的结果,简洁了api的调用 2.怎么玩? 案例演示 (1) list操作 /** ...