找回密码
 立即注册
千家悦IoT开放平台 IoT资讯 前端开发 CSS 查看内容

CSS技巧: 模块化编码

2019-10-25 00:00| 发布者: adminiot| 查看: 491| 评论: 0

  原生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模块化视觉样例  看到上图, 菜鸟的CSS编码一般是为1~4定义四个类名,为他们写各自的样式; 明智一点的写法是为1~4定义四个类名, 用.a .b .c .d{…}方式定义共同样式, 然后再为各自定义不同部分的样式; 但是, 还有一种完美的方式, 那便是模块化. 下面我就以上图为例做个简单的模块化分析.

  第一步, 分析整个视觉共用部分. 可以看出,1~4中,标题背景,标题文字,内容文字这三个部分的样式都是相同的, 所以, 我们可以为这个四个区块定义一个类名, 将共同的样式写给这个类名:

01 ...
02 div class="box"
03 h2倒霉松鼠再出山/h2
04 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p
05 /div
06 div class="box"
07 h2倒霉松鼠再出山/h2
08 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p
09 /div
10 div class="box"
11 h2倒霉松鼠再出山/h2
12 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p
13 /div
14 div class="box"
15 h2倒霉松鼠再出山/h2
16 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p
17 /div
18 ...
19 /div

  第二步, 分析出不同部分, 并权衡高效使用. 可以看出, 不同部分, 主要是内容背景色和区块宽度两部分. 先说背景色, 背景色有三种, 淡黄(1个), 白色(2个), 灰色(1个), 遵从”模块与模块之间尽量不要包含相同的部分, 若有相同部分就再拆出来独立成一个模块”的原则, 我们要把2个白底的样式提出来, 另两个单独定义, 而根据CSS优先原则, 我们可以把白底默认定义到第一步中的box样式中, 另两种背景色可做重定义处理. 再来看看宽度与定位, 2,4宽度等同且都右浮动, 所以, 我们可以把这部分提出来模块化, 而浮动一般可以直接调用通用原子类, 所以, 我们仅仅需要定义一个宽度样式中(若这个宽度在通用原子类中也有就更好了). 如此以来, HTML可以这样写:

01 ...
02 div class="box bg_y"
03 h2倒霉松鼠再出山/h2
04 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p
05 /div
06 div class="box fr right_w"
07 h2倒霉松鼠再出山/h2
08 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p
09 /div
10 div class="box"
11 h2倒霉松鼠再出山/h2
12 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p
13 /div
14 div class="box fr right_w bg_g"
15 h2倒霉松鼠再出山/h2
16 p20世纪福克斯将为卖座动画片《冰河世纪》(Ice Age内地译做《冰川时代》)再次开拍续集.../p
17 /div
18 ...

  或许, 这样的结构对HTML页面来说, 会显的有些臃肿, 但CSS文件因为重用性的提高而大大的减小了.CSS模块化是一个比较实用但也需要去领悟的思想, 实际使用中也需要全面的分析, 过多的模块也会导致维护性的降低, 如同OOP编程一样, 我们也要考虑”公有属性”与”私有属性”.

  本文通过一个简单的例子解析了CSS模块化的基本思想, 更多关于CSS模块化的知识, 可以看YUI CSS或者其他网络上的资源.

  do write, less more…CSS也可以做到.

  附: 阿当《Web前端开发修炼之道》一书中分享的通用原子类:

001 /*文字排版*/
002 .f12
{font-size:12px}
003 .f13
{font-size:13px}
004 .f14
{font-size:14px}
005 .f16
{font-size:16px}
006 .f20
{font-size:20px}
007 .fb
{font-weight:bold}
008 .fn
{font-weight:normal}
009 .t2
{text-indent:2em}
010 .lh150
{line-height:150%}
011 .lh180
{line-height:180%}
012 .lh200
{line-height:200%}
013 .unl
{text-decoration:underline;}
014 .no_unl
{text-decoration:none;}
015
/*定位*/
016 .tl
{text-align:left}
017 .tc
{text-align:center}
018 .tr
{text-align:right}
019 .bc
{margin-left:auto;margin-right:auto;}
020 .fl
{float:left;display:inline}
021 .fr
{float:right;display:inline}
022 .cb
{clear:both}
023 .cl
{clear:left}
024 .cr
{clear:right}
025 .clearfix:after
{content:".";display:block;height:0;clear:both;visibility:hidden}
026 .clearfix
{display:inline-block}* html .clearfix{height:1%}.clearfix{display:block}
027 .vm
{vertical-align:middle}
028 .pr
{position:relative}
029 .pa
{position:absolute}
030 .abs-right
{position:absolute;right:0}
031 .zoom
{zoom:1}
032 .hidden
{visibility:hidden}
033 .none
{display:none}
034
/*长度高度*/
035 .w10
{width:10px}
036 .w20
{width:20px}
037 .w30
{width:30px}
038 .w40
{width:40px}
039 .w50
{width:50px}
040 .w60
{width:60px}
041 .w70
{width:70px}
042 .w80
{width:80px}
043 .w90
{width:90px}
044 .w100
{width:100px}
045 .w200
{width:200px}
046 .w250
{width:250px}
047 .w300
{width:300px}
048 .w400
{width:400px}
049 .w500
{width:500px}
050 .w600
{width:600px}
051 .w700
{width:700px}
052 .w800
{width:800px}
053 .w
{width:100%}
054 .h50
{height:50px}
055 .h80
{height:80px}
056 .h100
{height:100px}
057 .h200
{height:200px}
058 .h
{height:100%}
059
/*边距*/
060 .m10
{margin:10px}
061 .m15
{margin:15px}
062 .m30
{margin:30px}
063 .mt5
{margin-top:5px}
064 .mt10
{margin-top:10px}
065 .mt15
{margin-top:15px}
066 .mt20
{margin-top:20px}
067 .mt30
{margin-top:30px}
068 .mt50
{margin-top:50px}
069 .mt100
{margin-top:100px}
070 .mb10
{margin-bottom:10px}
071 .mb15
{margin-bottom:15px}
072 .mb20
{margin-bottom:20px}
073 .mb30
{margin-bottom:30px}
074 .mb50
{margin-bottom:50px}
075 .mb100
{margin-bottom:100px}
076 .ml5
{margin-left:5px}
077 .ml10
{margin-left:10px}
078 .ml15
{margin-left:15px}
079 .ml20
{margin-left:20px}
080 .ml30
{margin-left:30px}
081 .ml50
{margin-left:50px}
082 .ml100
{margin-left:100px}
083 .mr5
{margin-right:5px}
084 .mr10
{margin-right:10px}
085 .mr15
{margin-right:15px}
086 .mr20
{margin-right:20px}
087 .mr30
{margin-right:30px}
088 .mr50
{margin-right:50px}
089 .mr100
{margin-right:100px}
090 .p10
{padding:10px;}
091 .p15
{padding:15px;}
092 .p30
{padding:30px;}
093 .pt5
{padding-top:5px}
094 .pt10
{padding-top:10px}
095 .pt15
{padding-top:15px}
096 .pt20
{padding-top:20px}
097 .pt30
{padding-top:30px}
098 .pt50
{padding-top:50px}
099 .pb5
{padding-bottom:5px}
100 .pb10
{padding-bottom:10px}
101 .pb15
{padding-bottom:15px}
102 .pb20
{padding-bottom:20px}
103 .pb30
{padding-bottom:30px}
104 .pb50
{padding-bottom:50px}
105 .pb100
{padding-bottom:100px}
106 .pl5
{padding-left:5px}
107 .pl10
{padding-left:10px}
108 .pl15
{padding-left:15px}
109 .pl20
{padding-left:20px}
110 .pl30
{padding-left:30px}
111 .pl50
{padding-left:50px}
112 .pl100
{padding-left:100px}
113 .pr5
{padding-right:5px}
114 .pr10
{padding-right:10px}
115 .pr15
{padding-right:15px}
116 .pr20
{padding-right:20px}
117 .pr30
{padding-right:30px}
118 .pr50
{padding-right:50px}
119 .pr100
{padding-right:100px}

鲜花
鲜花
握手
握手
雷人
雷人
路过
路过
鸡蛋
鸡蛋

相关分类