我们为什么不使用CSS框架

2020 年 7 月 20 日

我们为什么不使用CSS框架

在最近一次 ReactiveConf 会议上,Scott Tolinski为这样一种观点做了辩护:考虑到 CSS 语言最近增加的东西,开发人员可能不再需要使用成熟的 CSS 框架。Tolinski 进一步演示了不需要支持 IE11 的开发人员如何利用 CSS 变量来实现一个自定义设计系统,而其开销明显小于使用框架。


CSS变量使开发人员可以表示生成目标布局的 CSS 属性之间的动态关系。CSS 变量,也称为 CSS 自定义属性,是通过在它们的名字前面加上(比如--background )来声明的。CSS 变量有一个值,可以使用var()函数在其他 CSS 声明中使用。变量可以通过 CSS 或 JavaScript 进行更新。当发生这样的更新时,所有的因变量都会相应的更新。CSS 变量的作用域限定在声明它们的元素上并参与级联


借助显式的、命名的、限定范围的变量和用户定义的函数计算(var()),开发人员可以用更接近于图灵完备语言(如 JavaScript)的方式表达自定义算法。虽然 CSS 最初被设计用来描述静态数据(标记语言)而不是计算(编程语言),但是,由于需要采用一种经济的方式描述布局的动态变化,使得 CSS 越来越接近于一种常规编程语言,同时保持了其声明性本质。


Tolinski 给出了一个具体的演示。该演示是对一个教程网站的完全重新设计,用户可以从六个主题中选择一个,使用户界面的外观发生相应的改变。实现该功能所需的 JavaScript 只包含对一个类的更改。例如,oled主题与oled-mode类关联,该类配置了以下 CSS 变量:


.oled-mode {  --bg-color: var (--darkPurp)  --sheetHover: var (--black-20)  --sheetTextColor: var (--white)  ...}
复制代码


注意一下,在上述代码中,变量(例如bg-color)如何从其他变量(例如darkPurp)计算出来,从而创建了一个显式依赖的列表。相应的 CSS 代码更容易维护:更容易更改,也更容易限定需要更改的内容。这里,修改深紫色值将自动反映到所有需要修改的地方,而修改黑色肯定不会修改背景颜色。


Tolinski 继续说明 CSS 变量是如何帮助设计整个设计系统的。出于演讲需要,Tolinski 将设计系统简化为使该设计独一无二的关键组件:颜色、类型、间距、字符、高度和元素(例如卡片或手风琴折叠菜单)。


调色板可以用 CSS 变量进行编码。例如,现有的工具可以从一些基本颜色和对比度目标生成自适应调色板。定义好颜色之后,Tolinski 继续介绍他所说的颜色意向(例如--bgColorlineCo lor)。


在排版方面,Tolinski 建议利用现有的工具来可视化字体及其比例。下面是一个由type-scale.com自动生成的用于复制粘贴的示例代码:


@import url('https://fonts.googleapis.com/css?family=Poppins:400|Poppins:400');html {font-size: 100%;} /*16px*/body {  background-color: white;  font-family: 'Poppins', sans-serif;  font-weight: 400;  line-height: 1.65;  color: #333;}p {margin-bottom: 1.15rem;}h1, h2, h3, h4, h5 {  margin: 2.75rem 0 1.05rem;  font-family: 'Poppins', sans-serif;  font-weight: 400;  line-height: 1.15;}h1 {  margin-top: 0;  font-size: 3.052em;}h2 {font-size: 2.441em;}h3 {font-size: 1.953em;}h4 {font-size: 1.563em;}h5 {font-size: 1.25em;}small, .text_small {font-size: 0.8em;}
复制代码


接下来,Tolinski 使用 CSS 变量替换了生成的值:


  --baseFontSize: 1rem  --baseNavSize: 0.64rem  ...  --xtra-big-ass-heading: 3.052rem  --xtra-heading: 2.441rem  ...  --heading-one: 1.953rem  ...  --heading-four: var(--baseFontSize)  --heading-five: var(--smallFontSize)  ...  --headingFont: 'Poppins', sans-serif;  --bodyFont: 'Raleway', sans-serif;  ...  
复制代码


附加的排版资源包括modularscaleFigma排版建议vertical-rhythm-reset


Tolinski 建议使用margin-leftmargin-rightmargin-upmargin-down)来避免边距重叠的陷阱,但不能同时使用。


设计系统的下一个组件是元素,它是有样式的组件,例如<Card /><div class="card">。 元素应该简单、明确、难以分开且可扩展。Tolinski 在这里推荐了类似于Heydon Pickering所提倡的技术,即封闭组件以通用的方式将布局属性强加于其子组件。例如,通用Stack布局原语通过元素之间共同的父元素在它们之间加入边距,如下所示:


.stack > * + * {  margin-top: 1.5rem;  }
复制代码


相关文章详细介绍了这种模式的优点,并介绍了其他可以使用类似通配符的技术实现的通用布局(例如侧边栏Cover等)。


最后,Tolinski 提出了以下建议:


框架有带宽和加载开销。[……]以变量为基础,只写你需要的。

对于任何颜色、字体、间距都要使用变量,这样你的整个网站就可以一下子更新或配置。如果所有组件都使用自定义属性,则不必为创建独特的组件而担心。


ReactiveConf 是面向开发人员的年度会议,讨论软件开发的最新技术和趋势。由于 Covid-19 的原因,ReactiveConf 2020 被推迟到 2021 年的前三个月。与此同时,演讲亦会定期在网上播放。Tolinski 的演讲已经在网上提供,其中有更多的例子和技术细节。


原文链接:


Why We Don’t Use a CSS Framework - Scott Tolinksi, Reactive Conf


2020 年 7 月 20 日 11:511868

评论

发布
暂无评论
发现更多内容

跟随杠精的视角一起来了解Redis的主从复制

detectiveHLH

redis redis高可用 redis主从

为了让你面试不再害怕线程池,5亿脱发大军从此有了我

linux亦有归途

Linux 程序人生 线程池 C/C++ 后端开发

美团T8级架构师剖析Spring Boot源码:日志、缓存、消息、Web服务等

Java架构追梦

Java 源码 架构 微服务 springboot

学Linux到底学什么?未来职业到底是怎么样的?

Linux服务器开发

Linux 后端开发 Linux服务器 底层应用开发 web服务器

《机器学习》By:周志华,PDF免费下载

计算机与AI

学习

盖洛普

成周

甲方日常 60

句子

工作 随笔杂谈 日常

Spring 源码学习 03:创建 IoC 容器的几种方式

程序员小航

spring 源码 ioc 源码阅读

万字长文深度剖析面向对象的javascript

程序那些事

Java nodejs 程序那些事 面向对象js

智能视频监控的发展和优势

anyRTC开发者

安全 监控 音视频 WebRTC RTC

精心总结C++智能指针用法详解(完整版)附带视频讲解

ShenDu_Linux

c++ 程序员 指针 智能指针

每一位程序员都应该保存的计算机网络总结,哪怕你刚进大学

996小迁

Java 架构 面试

聊聊OpenAPI Specification(OAS)

尤利西斯的微笑

全栈工程师 软件设计 swagger OpenAPI

智慧公安情报研判系统开发解决方案,微警务系统搭建

WX13823153201

智慧公安情报研判系统开发

PGAS模型编程语言

星际行者

区块链数字物流应用落地解决方案

t13823115967

区块链落地 区块链+ 数字物流应用落地解决方案

AWS IoT Greengrass设计解析

soolaugust

边缘计算 工业4.0 工业物联网 iiot

想了解表格问答,我们先看看TA的前世

华为云开发者社区

数据库 规范 表格

前端: 如何快速将应用封装成js-sdk?

徐小夕

Java 前端 前端训练 前端进阶

写了一套优雅接口之后,领导让我给大家讲讲这背后的技术原理

楼下小黑哥

spring 重构

线程池ForkJoinPool简介

Java老k

Java 线程池 forkjoin

架构师训练营W07作业

Geek_f06ede

一文带你彻底了解Java异步编程

Java老k

Java 响应式编程 reactor 异步编程

《华为数据之道》读书笔记:第 9 章 打造“安全合规”的数据可控共享能力

方志

大数据 数据中台 数据安全

极客大学 - 架构师训练营 第十一周作业

9527

年轻人不讲武德,竟然重构出这么优雅后台 API 接口

楼下小黑哥

重构 Spring MVC

腾讯云TcaplusDB基础能力介绍

TcaplusDB

数据库 nosql 游戏

go-zero 之 rest 实战与原理

Kevin Wan

go RESTful api 网关 microservice

王者荣耀如何使用UDP做到低延迟

linux亦有归途

这次我让你彻底弄懂 RESTful

yes的练级攻略

RESTful

30分钟玩转「正则表达式」

Yano

正则表达式

我们为什么不使用CSS框架-InfoQ