什么是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过渡_动力节点Java学院整理
Jul 11 HTML / CSS
表单button的outline在firefox浏览器下的问题
Dec 24 HTML / CSS
纯css3显示隐藏一个div特效的具体实现
Feb 10 HTML / CSS
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
Oct 15 HTML / CSS
CSS3只让背景图片旋转180度的实现示例
Mar 09 HTML / CSS
html5/css3响应式页面开发总结
Oct 16 HTML / CSS
Canvas 文本转粒子效果的实现代码
Feb 14 HTML / CSS
HTML5制作3D爱心动画教程 献给女友浪漫的礼物
Nov 05 HTML / CSS
HTML5 Canvas中使用用路径描画圆弧
Jan 01 HTML / CSS
html5自定义video标签的海报与播放按钮功能
Dec 04 HTML / CSS
Html5页面获取微信公众号的openid的方法
May 12 HTML / CSS
CSS3实现的水平标题菜单
Apr 14 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
Dedecms常用函数解析
2008/02/01 PHP
PHP二维数组的去重问题解析
2011/07/17 PHP
作为PHP程序员应该了解MongoDB的五件事
2013/06/03 PHP
探讨PHP中this,self,parent的区别详解
2013/06/08 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
2017/03/15 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
js动态引入的四种方法
2018/05/05 Javascript
element-ui中Table表格省市区合并单元格的方法实现
2019/08/07 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
[09:43]DOTA2每周TOP10 精彩击杀集锦vol.5
2014/06/25 DOTA
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
使用Python的Zato发送AMQP消息的教程
2015/04/16 Python
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
Python实现约瑟夫环问题的方法
2016/05/03 Python
python如何对实例属性进行类型检查
2018/03/20 Python
django开发post接口简单案例,获取参数值的方法
2018/12/11 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
python 默认参数相关知识详解
2019/09/18 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
美国宠物护理专家:Revival Animal Health
2020/01/05 全球购物
数据库什么时候应该被重组
2012/11/02 面试题
应用化学专业职业生涯规划书
2014/01/22 职场文书
警察正风肃纪剖析材料
2014/10/16 职场文书
2015年幼儿园中班下学期工作总结
2015/05/22 职场文书
少先队中队工作总结2015
2015/07/23 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
Python OpenCV实现图像模板匹配详解
2022/04/07 Python
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android