什么是css原子化,有什么用?


Posted in HTML / CSS onApril 24, 2022

一、背景

近期因为一些交接事项和后续需求,接触到了之前没有接触过的xx领域。在上手后发现,与之前主要负责的方向相比,样式的比重明显增加,在css上更小的颗粒度和密集度让我觉得有些吃力,尤其是少数文件还应用了某种我不熟悉的带前缀的类名,而在全局却无法对其进行检索,让我陷入了疑惑。在询问得知这是css原子化的写法之后,看了相关文档我也并没有很快的理解。但渐渐有了一些理解和兴趣。我发现之前自己上手困难并不是css原子化有高的上手门槛,而是缺少相关理解和更快速上手的指引。

为了更好的将css原子化作为技术储备,在之后合适的情况下产生效果,这里通过两篇文章分别专注分析探究和后续开发快速上手进行讲解,以让大家对原子化css产生理解,并且解决文档缺乏和上手慢的问题。

本文主要从开发效率和包体积两方面展开分析,并最后选择框架windicss,在此之前先进行一些铺垫

二、什么是css原子化,又有什么用?

1.含义分析

其实相关的概念很简单,先用一种官方些的描述是这样的 “原子化 CSS 是一种 CSS 的架构方式,它倾向于小巧且用途单一的 class,并且会以视觉效果进行命名。”

我个人大概可以根据这个话从三个方面开始介绍。

  • 原子化 CSS 是一种 CSS 的架构方式
    • 可能大多数同学对此并不是很熟悉,其实说起它的架构方式,并没有一些很严格的门类。但大家应该都知道相关的一些css方案,比如一直在用的css预处理器,他可以让我们更效率地书写样式,还有css-in-js等
    • 过去以更加组件化和整体工具类的方向作为css的最佳实践,原子化css算是一个不同的声音。关于各种css方案更详细的一些我就不清楚了,大家明白的可以与我交流
  • 它倾向于小巧且用途单一的 class
    • 在最初看到每个引用的类里面只有一个单一的功能,很小巧的时候,并没有完全明白
    • 但其实这就是 “原子” 的精髓,它的原子化可以让我们无比的灵活
    • 就像这样,如果一个类里包含两个功能那么他就不是原子css了
    • 比如这样
.bw-2x {

border-width: 2px;
}
.bss {
  border-style: solid;
.sans {
  font-style: sans-serif;
  • 并且会以视觉效果进行命名
    • 不知道你有没有在某些时候被去起一个类名被停顿过,特别是在有大量模版的时候,这有的时候还是挺难的
    • 直接用框架封装好的类,就不用考虑这个问题了,并且根据视觉的类名,你可以很容易的举一反三

2.方案选择

css原子化的思想有了之后,具体的发展其实如果也是有一段路程的

试想一下,如果你想要有十个类,去承载一个数字对应的margin尺寸,是否就需要手写十个类呢?这是太重复的操作了吧!很难让人忍受。如果用scss的能力的话看上去会好一点,去写一个循环

@for $i from 1 through 10 {
  .m-#{$i} {
    margin: $i / 4 rem;
  }
}

这样就有十个以等加排列的margin类了,但如果我们最后只用到了其中的五个,这就直接浪费了一半的空间,因为其余五个类是无用的。这样大家应该明白,单纯的css原子化,我们自己也可以去实现,我们可以去预备的书写大量的原子类。但如果我们想要项目中更合理的去使用,我们无疑需要框架帮助。

它可以帮我们解决掉那些麻烦,一个早已做大做强的css原子化框架Tailwind最初是这么做的,Tailwind 通过使用purgecss来扫描产物并删除你不需要的规则。这得以使其在生产环境中 CSS 文件缩减为几 KB。但是有个问题!!这个清除操作仅在生成构建下有效,而开发环境下仍要使含了所有规则巨大的 CSS 文件。能够按需生成无疑是更好的选择

所以windicss从零到一解决了这个问题,因为我很关注的开源开发者  Anthony Fu 是其重要的成员,这也让我更加对windicss进行了了解。虽然之后Tailwind也有了相关按需加载的功能,但windicss新出的属性化模式等功能我觉得很棒,并且它更轻量,所以之后的方案我选择继续沿用winding-css

css原子化可以不断发展,受众越来越多,Anthony Fu在内的很多开发者都对其爱不释手,它有着它的优越性,当然也有着它的缺点。如果想在工作环境中使用,必须经过客观的分析

三、开发体验可行性

优点

1.开发的效率和舒适

预定义功能类的简洁舒适,下边放一个赏心悦目的例子,来自tailwind,其实和我平时写小程序基本一样的

<div class="chat-notification">
  <div class="chat-notification-logo-wrapper">
    <img class="chat-notification-logo" src="/img/logo.svg" alt="ChitChat Logo">
  </div>
  <div class="chat-notification-content">
    <h4 class="chat-notification-title">ChitChat</h4>
    <p class="chat-notification-message">You have a new message!</p>
</div>
<style>
  .chat-notification {
    display: flex;
    max-width: 24rem;
    margin: 0 auto;
    padding: 1.5rem;
    border-radius: 0.5rem;
    background-color: #fff;
    box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
  }
  .chat-notification-logo-wrapper {
    flex-shrink: 0;
  .chat-notification-logo {
    height: 3rem;
    width: 3rem;
  .chat-notification-content {
    margin-left: 1.5rem;
    padding-top: 0.25rem;
  .chat-notification-title {
    color: #1a202c;
    font-size: 1.25rem;
    line-height: 1.25;
  .chat-notification-message {
    color: #718096;
    font-size: 1rem;
    line-height: 1.5;
</style>

再看一下应用了原子化的文件呢?

<div class="p-6 max-w-sm mx-auto bg-white rounded-xl shadow-md flex items-center space-x-4">
  <div class="flex-shrink-0">
    <img class="h-12 w-12" src="/img/logo.svg" alt="ChitChat Logo">
  </div>
  <div>
    <div class="text-xl font-medium text-black">ChitChat</div>
    <p class="text-gray-500">You have a new message!</p>
</div>

怎么样,是不是很清爽!但可能有的同学不这么觉得,好多不认识的类名,一团糟的样子。但是等我们了解了它的使用之后,这些类名也会变的一目了然,再存在大量样式的情况下,它的开发体验真的很赞,我觉得你百分之九十会和我一样喜欢它的效率

其实它在使用上还有更多爽快的方法,比如@apply,自动值推导,属性话模式等。但这些过于使用层面的功能在之后使用方面的文章写更合适,你现在只要记得,多样式场景,会很爽就足够了

2.灵活和可维护

有的同学是否会担心?我用了很多定制化的原子类,是不是就无法随心所欲的定制我们的样式了?

这个其实不用担心,虽然实际上就算单单只用原子化css我们就可以满足90%以上的场景,但是毕竟一些复杂的样式效果还是需要简单学习下的。所以我们要知道,我们去在模版里所添加的原子类,都只是在盒子上挂载的普通类名,这意味着就算我们不是熟练的windicss使用者,我们也可以用原子类和自定义类混合的方式,我们自定义的样式是更高的。我们可以只顾着爽地去快速解决绝大部分样式,就算剩下的样式你还没有掌握如何去用windicss书写,你也靠可以自己完成

缺点

1.仍存在的上手门槛

虽然我相信,在你看过我的使用篇后,会很快的上手开发。但是在初见之时,这确实需要接受的过程,所以如果并不觉得样式多的让你感觉到压力的话,你可以只是了解一下~

2. 小程序使用windicss受到阉割

目前的工作场景,很多样式复杂场景都是在小程序端的,但因为wxss的选择器选择比较有限,windicss的一些功能在小程序端是用不了的,这个在使用篇会细说。但是实际上,我认为也不算是明显的缺点,一些常用的功能已经足够了。

四、包体积可行性

熟悉小程序的应该都知道,当我们开发一个小程序,特别是是一个大型,复杂的小程序的时候,包体积是多么的重要。作为一个深度参与着包体积治理的开发,并且曾经遭受过包体积溢出的苦,我想我对包体积一直是有着敏感性的。如果此方案能够对包体积起到效果的话,确实是它的一大优势。

据说facebook用css原子化缩减了首页80%的css体积?虽然肯定也会增加html体积,也并不是很清楚其中细节,但这种消息也很让人诱惑,哈哈

优点

1.对wxss文件的有效缩减

为了亲自探究引入windicss是否对样式体积有着缩减,通过分包,分组等进行分类。我找出了目前项目中引用了少量windicss的版本,和之前的版本。在把他们的report.json进行比对之后,重点关注了几个除了换用windicss,没有其他明显变化的文件。

这几个文件都是多样式,并且以windicss的使用为变量的文件。虽然只有零点几kb的缩减,但在小程序紧张的包体积中,这已经是很有价值的修改了,这只是少部分文件而已

缺点

尽管windicss的按需引入已经做得很不错了,但是毕竟也是有一点额外体积的。所以如果你并没有多少冗余的样式需要去淘汰的话。windicss在包体积方面,并不能对你有多少帮助

五、 总结

经过以上介绍和分析,我相信在合适的场景下还是非常适合饮用原子化css的相关概念的。

到此这篇关于css原子化项目落地可行性分析和探究的文章就介绍到这了,更多相关css原子化项目落地可行性分析内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
HTML / CSS 相关文章推荐
CSS3伪类选择器:nth-child()
Apr 02 HTML / CSS
使用before和:after伪类制作css3圆形按钮
Apr 08 HTML / CSS
用css3实现当鼠标移进去时当前亮其他变灰效果
Apr 08 HTML / CSS
CSS3 中的@keyframes介绍
Sep 02 HTML / CSS
CSS3中线性颜色渐变的一些实现方法
Jul 14 HTML / CSS
无需JS和jQuery代码实现CSS3鼠标浮动放大图片
Nov 21 HTML / CSS
css3 实现圆形旋转倒计时
Feb 24 HTML / CSS
HTML5手机端弹出遮罩菜单特效代码
Jan 27 HTML / CSS
HTML5之tabindex属性全面解析
Jul 07 HTML / CSS
HTML5给汉字加拼音收起展开组件的实现代码
Apr 08 HTML / CSS
使用layui实现左侧菜单栏及动态操作tab项的方法
Nov 10 HTML / CSS
纯html+css实现奥运五环的示例代码
Aug 02 HTML / CSS
css3 文字断裂效果
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
Apr 19 #HTML / CSS
开发微信小程序之WXSS样式教程
Apr 18 #HTML / CSS
CSS中float高度塌陷问题的四种解决方案
Apr 18 #HTML / CSS
HTML5基础学习之文本标签控制
Mar 25 #HTML / CSS
CSS实现渐变色边框(Gradient borders)的5种方法
Mar 25 #HTML / CSS
关于CSS自定义属性与前端页面的主题切换问题
You might like
PHP中全局变量global和$GLOBALS[]的区别分析
2012/08/06 PHP
基于PHP的简单采集数据入库程序【续篇】
2014/07/30 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
用YUI做了个标签浏览效果
2007/02/20 Javascript
使用 JScript 创建 .exe 或 .dll 文件的方法
2011/07/13 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
js接收并转化Java中的数组对象的方法
2016/08/11 Javascript
炫酷的js手风琴效果
2016/10/13 Javascript
js实现漫天星星效果
2017/01/19 Javascript
vue.js+Echarts开发图表放大缩小功能实例
2017/06/09 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
详解vue挂载到dom上会发生什么
2019/01/20 Javascript
vue通过video.js解决m3u8视频播放格式的方法
2019/07/30 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
React+Redux实现简单的待办事项列表ToDoList
2019/09/29 Javascript
javascript中正则表达式语法详解
2020/08/07 Javascript
用python删除java文件头上版权信息的方法
2014/07/31 Python
实例讲解Python中的私有属性
2014/08/21 Python
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
Django实现分页功能
2018/07/02 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
2019/02/22 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
Python networkx包的实现
2020/02/14 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
python高级特性简介
2020/08/13 Python
详解CSS3弹性伸缩盒
2020/09/21 HTML / CSS
《尊严》教学反思
2014/02/11 职场文书
2014年销售助理工作总结
2014/12/01 职场文书
第二次离婚起诉书
2015/05/18 职场文书
服务行业标语口号
2015/12/26 职场文书
2016银行招聘自荐信
2016/01/28 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python
React列表栏及购物车组件使用详解
2021/06/28 Javascript
python如何查找列表中元素的位置
2022/05/30 Python