前端使用原子类的优劣?

作者:于江水
链接:https://www.zhihu.com/question/22110291/answer/20328000
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

《编写高质量代码 Web前段开发修炼之道》一书中,提倡并提供了一套原子类,于是我就开始在个人和外包的项目中开始使用原子类。

用的多了,你就会明白原子类的优劣以及如何使用了。下面是我的几点感悟:

原子类的缺点:

1,维护困难。类似 m20(表示 margin 20px ) 这样的超级常用的原子类,会遍布网页中的很多 div,如果你想让他们变成 margin 15px,要么替换 .m20{} 中的 margin 20px (失去 m20 本身的意义),要么把 html 中的 m20 批量替换成 m15 。再给你一个要求,把一部分替换成 m15。恐怕只能一个一个粘贴复制了吧?

2,代码冗余。包括题主给出的和《编写高质量代码》一书中给出的原子类实例一样,为了灵活,把常用的字体都定义成了 f*、常用的尺寸都定义了 m* 和 p* 等。但实际上只会用到其中的几个,剩下的都是冗余代码。这对于中度代码洁癖的我来说,是很难受的,虽然只是几十行代码。

3,控制困难。当我第一次接触原子类并且用此重写了我一个非常简单的 WordPress 主题的时候,我几乎开始膜拜原子类。那个主题实在是简单,所以我几乎没有写 CSS ,只是在 模版文件 中的 div 中添加了众多的原子类就完成了布局。但是当我打算修改某个元素的样式时,有点崩溃,我究竟要用原子类的方式,还是传统的选择器?

1)如果用原子类,那么我需要定义新的原子类(通常不能随便修改之前的原子类),然后将新的原子类写到 html 标签的后面,来覆盖之前的样式。这样,就会遇到类似 <div class="aa bb cc dd ab ad cd sd">...</div> 的标签,Great!
2)用原子类构造选择器。这样就不用定义新的原子类了,但是你的 CSS 选择器看起来会像下面这样:.aa .bb .cc .ad.ab .ce{} 你确定不会眼花?
3)没办法,只能针对要修改的元素设置一个对应的类,例如 <h1 class="mb20 f14 fb post-title">...</h1> 然后对 .post-title 来定义要指定的特殊样式,然后将 post-title 类添加到所有需要的 h1 标签中。这时你会发现,我为什么不把前面的 mb20 f14 fb 原子类里面的三条语句一块写进 post-title 类中?这样修改的话只需要修改这一个类就可以了,而不需要找到 html 中,增删原子类。

就像 CSS 禅意花园那样,最好的 CSS 代码,是与 HTML 无关的,而原子类,让你在修改编写 CSS 的时候,增加了很多 HTML 的操作,这是最大的缺陷。

原子类的优点:

原子类也有相当多的优点,但是并不是所有的原子类。

1,便于抽出复用代码,提高代码复用程度。clearfix 类就是最好的一个例子,将一段用来清除浮动的 CSS 编写成 clearfix 类,在需要清除浮动的 元素 中,增加这个类就可以。类似的还有其他使用场景。

2,CSS 框架的应用。很多前端框架的 CSS 部分,特别是网格系统,都是原子类的具体应用。

原子类的实际应用:

原子类其实不是一种工具,而是一种编写 CSS 的思想,即:抽出高度复用的样式模块,独立成一个原子类,为对应的模块添加。

CSS 前端框架做的就非常好。对于一个前端项目,按钮部分来说,可以定义一个 btn 类作为按钮初始化(将 a 或者 button 、input 初始化,加圆角、去边框、加 cursor 等),然后定义诸如 btn-blue 、 btn-red 这样的类来细化按钮的样式。那么对于整个项目的所有按钮,就只需要加两个类就可以实现样式。

=============下面是我自己的一个不正式的用法================

另一个应用场景,就是代替命名。在近期的一些项目中,主体部分往往分两栏并且有多种主体样式(假设 .main-blog .main-page )。所以我定义了 .left .right 类,默认属性分别为 float:left float:right 。针对不同的主体样式,就可以构造如下的 CSS 代码:

.main-blog .left{ .... }
.main-blog .right { .... }
.main-page .left{ .... }
.main-page .right { .... }

这虽然涉及了前面所说的 缺点3 中的内容,但是解决了程序员最大的难题:命名。而且语义还算比较清晰,用起来感觉还不错,可以试用一下。

时间: 2024-10-05 04:45:45

前端使用原子类的优劣?的相关文章

并发编程的艺术第七章-13个原子类介绍

java中的13个原子类操作 13个原子类操作主要分为四大类:原子更新基本类型,原子更新数组,原子更新引用,原子更新属性(字段) atomic 的类基本都是unsafe类的包装类 原子更新基本类型包括: atomicBoolean atomicIneger atomicLong 这里注意lazyset方法,Doug Lea大神已经在oracle官网解释了,原文如下 "As probably the last little JSR166 follow-up for Mustang, we adde

java多线程系类:JUC原子类:04之AtomicReference原子类

概要 本章对AtomicReference引用类型的原子类进行介绍.内容包括:AtomicReference介绍和函数列表AtomicReference源码分析(基于JDK1.7.0_40)AtomicReference示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3514623.html AtomicReference介绍和函数列表 AtomicReference是作用是对"对象"进行原子操作. AtomicReference函数列

java多线程系类:JUC原子类:03之AtomicLongArray原子类

概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似.本章以AtomicLongArray对数组类型的原子类进行介绍.内容包括:AtomicLongArray介绍和函数列表AtomicLongArray源码分析(基于JDK1.7.0_40)AtomicLongArray示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3514604.html

java多线程系类:JUC原子类:05之AtomicIntegerFieldUpdater原子类

概要 AtomicIntegerFieldUpdater, AtomicLongFieldUpdater和AtomicReferenceFieldUpdater这3个修改类的成员的原子类型的原理和用法相似.本章以对基本类型的原子类进行介绍.内容包括:AtomicLongFieldUpdater介绍和函数列表AtomicLongFieldUpdater示例AtomicLongFieldUpdater源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.com

java 线程 原子类相关操作示例 thinking in java4 目录21.3.4

java 线程  原子类相关操作示例 package org.rui.thread.volatiles; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; /** * 原子类,

Java并发编程-非阻塞同步方式原子类(Atomic)的使用

非阻塞同步 在大多数情况下,我们为了实现线程安全都会使用Synchronized或lock来加锁进行线程的互斥同步,但互斥同步的最主要的问题就是进行线程的阻塞和唤醒所带来的性能问题,因此这种阻塞也称作阻塞同步.从处理问题的方式上说,互斥同步属于一种悲观的并发策略,总是认为只要不去做正确的同步措施,那就肯定会出现问题,无论共享数据是否真的会出现竞争,它都会进行加锁.用户态核心态转换.维护锁的计数器和检查是否有被阻塞的线程需要被唤醒等操作. 随着硬件指令集的发展,我们有了另一个选择:基于冲突检测的乐

JAVA并发API源码解析:原子类

在JAVA API的java.util.concurrent.atomic包下提供了一系列以基本类型包装类为基础的并发情况下不需要同步的类(借助硬件相关指令实现). 首先看一个例子AutomicInteger: public class AtomicInteger extends Number implements java.io.Serializable { private static final long serialVersionUID = 6214790243416807050L; p

Java8 更快的原子类:LongAdder

更快的原子类:LongAdder 大家对AtomicInteger的基本实现机制应该比较了解,它们是在一个死循环内,不断尝试修改目标值,知道修改成功,如果竞争不激烈,那么修改成功的概率就很高,否则,修改失败的概率就很高,在大量修改失败时,这些原子操作就会进行多次循环尝试,因此性能就会受到影响 那么竞争激烈的时候,我们应该如何进一步提高系统性能呢?一种基本方案就是可以使用热点分离,将竞争的数据进行分解.基于这个思路,打击应该可以想到一种对传统AtomicInteger等原子类的改进方法,虽然在CA

java 线程 原子类相关操作演示样例 thinking in java4 文件夹21.3.4

java 线程  原子类相关操作演示样例 package org.rui.thread.volatiles; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; /** * 原子类