Css技巧: 模块化编码
原生Js因jQuery的"write less,do more"变得极简, Html因语义化编码变得简明, 那么, 有没有一种方式让Css也更加的高效精致呢? 当然有, 那便是模块化编码.
Css的模块化,我们可以理解成(抑或本身就是)OOP思想, 重用性、灵活性、可扩展性便是它终极的目标, "类"便是它的核心, OOP的多用组合少用继承一样是它的基本原则. Css模块化是一个新颖高效的Css编码方式, 若有接触过YUI Css的朋友肯定对这种方式有所了解.
如何Css模块化, 我想这才是大家真正关心的. 我所理解的Css模块化, 应该从两大块去区分.
第一大块, 从整站全局模块化. 这一点大家并不陌生, 时常用到的reset css便是模块化的一部分, 全局通用的字体样式, 链接样式, 以及通用头部底部及主体容器等等这些我们已经熟知, 另外诸如定义文字排版(如.f12{font-size:12px})、定位(如.tl{text-align:left})、长度高度(如.w10{width:10px})、边距(如.m10{margin:10px})等页面中会常用到的样式,这一类,我们称之为Css通用原子类(哈,与类扯上关系了,那就权当成类吧).通用原子类有两个特点: 通用性和原子性, 任何页面都可以随意使用它们, 且他们只表现最基础的样式, 一个通用原子类只设置一个样式,不可再分. 关于整站全局模块化不再详述, 本文后面我会贴出阿当的《Web前端开发修炼之道》一书中常用通用原子类样式.
第二大块, 是从视觉效果上模块化, 在视觉上样式和功能相对独立稳定的部分即可视为模块. 拆分这些模块, 应该尽量遵循一个原则: 模块与模块之间尽量不要包含相同的部分, 若有相同部分就再拆出来独立成一个模块.
下图是我画的一个简易的页面视觉图:
看到上图, 菜鸟的Css编码一般是为1~4定义四个类名,为他们写各自的样式; 明智一点的写法是为1~4定义四个类名, 用.a .b .c .d{...}方式定义共同样式, 然后再为各自定义不同部分的样式; 但是, 还有一种完美的方式, 那便是模块化. 下面我就以上图为例做个简单的模块化分析.
第一步, 分析整个视觉共用部分. 可以看出,1~4中,标题背景,标题文字,内容文字这三个部分的样式都是相同的, 所以, 我们可以为这个四个区块定义一个类名, 将共同的样式写给这个类名:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ... < div class="box"> < h2 >倒霉松鼠再出山</ h2 > < p >20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集...</ p > </ div > < div class="box"> < h2 >倒霉松鼠再出山</ h2 > < p >20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集...</ p > </ div > < div class="box"> < h2 >倒霉松鼠再出山</ h2 > < p >20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集...</ p > </ div > < div class="box"> < h2 >倒霉松鼠再出山</ h2 > < p >20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集...</ p > </ div > ... </ div > |
第二步, 分析出不同部分, 并权衡高效使用. 可以看出, 不同部分, 主要是内容背景色和区块宽度两部分. 先说背景色, 背景色有三种, 淡黄(1个), 白色(2个), 灰色(1个), 遵从"模块与模块之间尽量不要包含相同的部分, 若有相同部分就再拆出来独立成一个模块"的原则, 我们要把2个白底的样式提出来, 另两个单独定义, 而根据Css优先原则, 我们可以把白底默认定义到第一步中的box样式中, 另两种背景色可做重定义处理. 再来看看宽度与定位, 2,4宽度等同且都右浮动, 所以, 我们可以把这部分提出来模块化, 而浮动一般可以直接调用通用原子类, 所以, 我们仅仅需要定义一个宽度样式中(若这个宽度在通用原子类中也有就更好了). 如此以来, Html可以这样写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ... < div class="box bg_y"> < h2 >倒霉松鼠再出山</ h2 > < p >20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集...</ p > </ div > < div class="box fr right_w"> < h2 >倒霉松鼠再出山</ h2 > < p >20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集...</ p > </ div > < div class="box"> < h2 >倒霉松鼠再出山</ h2 > < p >20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集...</ p > </ div > < div class="box fr right_w bg_g"> < h2 >倒霉松鼠再出山</ h2 > < p >20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集...</ p > </ div > ... |
或许, 这样的结构对Html页面来说, 会显的有些臃肿, 但Css文件因为重用性的提高而大大的减小了. Css模块化是一个比较实用但也需要去领悟的思想, 实际使用中也需要全面的分析, 过多的模块也会导致维护性的降低, 如同OOP编程一样, 我们也要考虑"公有属性"与"私有属性". 本文通过一个简单的例子解析了Css模块化的基本思想, 更多关于Css模块化的知识, 可以看YUI Css或者其他网络上的资源. do write, less more...Css也可以做到. 附: 阿当《Web前端开发修炼之道》一书中分享的通用原子类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | /*文字排版*/ .f 12 { font-size : 12px } .f 13 { font-size : 13px } .f 14 { font-size : 14px } .f 16 { font-size : 16px } .f 20 { font-size : 20px } .fb{ font-weight : bold } .fn{ font-weight : normal } .t 2 { text-indent : 2em } .lh 150 { line-height : 150% } .lh 180 { line-height : 180% } .lh 200 { line-height : 200% } .unl{ text-decoration : underline ;} .no_unl{ text-decoration : none ;} /*定位*/ .tl{ text-align : left } .tc{ text-align : center } .tr{ text-align : right } .bc{ margin-left : auto ; margin-right : auto ;} .fl{ float : left ; display : inline } .fr{ float : right ; display : inline } .cb{ clear : both } .cl{ clear : left } .cr{ clear : right } .clearfix:after{ content : "." ; display : block ; height : 0 ; clear : both ; visibility : hidden } .clearfix{ display :inline- block }* html .clearfix{ height : 1% }.clearfix{ display : block } .vm{ vertical-align : middle } .pr{ position : relative } .pa{ position : absolute } .abs- right { position : absolute ; right : 0 } .zoom{zoom: 1 } . hidden { visibility : hidden } . none { display : none } /*长度高度*/ .w 10 { width : 10px } .w 20 { width : 20px } .w 30 { width : 30px } .w 40 { width : 40px } .w 50 { width : 50px } .w 60 { width : 60px } .w 70 { width : 70px } .w 80 { width : 80px } .w 90 { width : 90px } .w 100 { width : 100px } .w 200 { width : 200px } .w 250 { width : 250px } .w 300 { width : 300px } .w 400 { width : 400px } .w 500 { width : 500px } .w 600 { width : 600px } .w 700 { width : 700px } .w 800 { width : 800px } .w{ width : 100% } .h 50 { height : 50px } .h 80 { height : 80px } .h 100 { height : 100px } .h 200 { height : 200px } .h{ height : 100% } /*边距*/ .m 10 { margin : 10px } .m 15 { margin : 15px } .m 30 { margin : 30px } .mt 5 { margin-top : 5px } .mt 10 { margin-top : 10px } .mt 15 { margin-top : 15px } .mt 20 { margin-top : 20px } .mt 30 { margin-top : 30px } .mt 50 { margin-top : 50px } .mt 100 { margin-top : 100px } .mb 10 { margin-bottom : 10px } .mb 15 { margin-bottom : 15px } .mb 20 { margin-bottom : 20px } .mb 30 { margin-bottom : 30px } .mb 50 { margin-bottom : 50px } .mb 100 { margin-bottom : 100px } .ml 5 { margin-left : 5px } .ml 10 { margin-left : 10px } .ml 15 { margin-left : 15px } .ml 20 { margin-left : 20px } .ml 30 { margin-left : 30px } .ml 50 { margin-left : 50px } .ml 100 { margin-left : 100px } .mr 5 { margin-right : 5px } .mr 10 { margin-right : 10px } .mr 15 { margin-right : 15px } .mr 20 { margin-right : 20px } .mr 30 { margin-right : 30px } .mr 50 { margin-right : 50px } .mr 100 { margin-right : 100px } .p 10 { padding : 10px ;} .p 15 { padding : 15px ;} .p 30 { padding : 30px ;} .pt 5 { padding-top : 5px } .pt 10 { padding-top : 10px } .pt 15 { padding-top : 15px } .pt 20 { padding-top : 20px } .pt 30 { padding-top : 30px } .pt 50 { padding-top : 50px } .pb 5 { padding-bottom : 5px } .pb 10 { padding-bottom : 10px } .pb 15 { padding-bottom : 15px } .pb 20 { padding-bottom : 20px } .pb 30 { padding-bottom : 30px } .pb 50 { padding-bottom : 50px } .pb 100 { padding-bottom : 100px } .pl 5 { padding-left : 5px } .pl 10 { padding-left : 10px } .pl 15 { padding-left : 15px } .pl 20 { padding-left : 20px } .pl 30 { padding-left : 30px } .pl 50 { padding-left : 50px } .pl 100 { padding-left : 100px } .pr 5 { padding-right : 5px } .pr 10 { padding-right : 10px } .pr 15 { padding-right : 15px } .pr 20 { padding-right : 20px } .pr 30 { padding-right : 30px } .pr 50 { padding-right : 50px } .pr 100 { padding-right : 100px } |
原文发布于Mr.Think的博客: http://mrthink.net/css-tips-oopcoding/, 转载请注明.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?