css架构探索

css架构探索
 
在我最初接手并网项目时,一个页面,甚至整个项目中,一条样式属性会在css文件中出现无数次,比如:
1 .test{float: left;margin-top: 10px;color: #525252;font: 14px/20px "Microsoft YAHEI"}
2 .demo{float: left;margin-top: 10px;background: #ececec;}

html调用类名:

1 <p class="test"></p>
2 <div class="demo"></div>
从上面的示例代码可以看出,float:left 和 margin-top:10px 出现了两次,而整个项目中,这样的情况出现了很多次,其实,这样做真的很LOW。
高效的css应该具备:简洁、模块化、低耦合三个特点。显然,我一直不曾做到。。。
 
此处从css样式的分离开始一步一步写出一个高效的css代码
 
上面.test的样式可以这样拆分:
1 .fl-l{float: left;}
2 .mg-t{margin-top: 10px;}
3 .col{color: #525252;}
4 .f14{font-size: 14px;}
5 .f-m{font-family: "Microsoft YAHEI";}
6 .lh20{line-height: 20px;}

这时候调用样式就变成:

1 <p class="fl-l mg-t col f14 f-m lh20"></p>
2 <div class="fl-l mg-t bg-ece"></div>
前后对比,单从css来看,分离后的css使用效率更高了,没有重复声明的属性出现,不过,再看看html结构却发现,好像变得有点糟糕了,分离后的css在html中的调用导致了html结构异常复杂,每一个class都带有多个类名(三四个是可以接受的,但五六七八个就有点说不过去了),虽然上面的修改使得html结构压力倍增,可是css分离的优点的确凸显了啊,那么只要再做一番其他的工作来弥补html结构上的压力就能达到我们最初想要提高css架构效率的目的了。
 
分离必然是核心思想,但仅仅有分离是绝对不够的,我们还需要合并
下面来看一段比较长的css代码:
 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title></title>
 5     <meta charset="utf-8" />
 6     <script type="text/javascript" src="script/jquery-1.11.1.min.js"></script>
 7     <script type="text/javascript" src="script/jquery.dropkick-min.js"></script>
 8     <script type="text/javascript" src="script/laydate.js"></script>
 9     <link rel="stylesheet" type="text/css" href="style/dropkick.css">
10     <link rel="stylesheet" type="text/css" href="style/laydate.css">
11     <link rel="stylesheet" type="text/css" href="style/molv/laydate.css">
12     <style type="text/css">
13     *{    margin: 0;padding: 0;list-style: none;}
14     html,body{    height: 100%;}
15     .head_form{    width: 100%;height: 45px;}
16     .chart_show_box{width: 100%;position: absolute;    top: 45px;bottom: 0;}
17     .chart_show_main{width: 100%;}
18     .content_show{width: 100%;height: 470px;}
19     .left_show{width: 100%;position: absolute;top: 470px;bottom: 0px;background: #000;}    
20     .chose_select{margin-top: 5px;}
21     .head_form label{display: inline-block;    margin-top: 5px;margin-left: 10px;font:14px/30px "Microsoft YAHEI"; }
22     .head_form input{height: 24px;line-height: 24px;}    
23     </style>    
24 </head>
25 <body>
26     <div class="head_form">
27         <form action="">
28             <select class="chose_select">
29                 <option value="1">这是选项1</option>
30                 <option value="2">这是选项2</option>
31                 <option value="3">这是选项3</option>
32                 <option value="4">这是选项4</option>
33                 <option value="5">这是选项5</option>
34                 <option value="6">这是选项6</option>
35             </select>
36             <label for="">
37                 <span>预测日期:</span>
38                 <input type="text"  id="date_one">
39             </label>
40             <label for="">
41                 <span>参考日期:</span>
42                 <input type="text"  id="date_two">
43             </label>
44             <button>修正</button>
45             <button>全部修正</button>
46         </form>
47     </div>
48     <div class="chart_show_box">
49         <div class="chart_show_main">
50             <div class="content_show" style="position:relative">
51                 <iframe src="http://www.baidu.com" frameborder="0" width="100%" height="100%"></iframe>
52             </div>
53             <div class="left_show">
54                 
55             </div>
56         </div>
57     </div>
58 </body>
59 </html>

但看上面的css,会发现如width、position、bottom、margin-top等属性都是被反复声明的,此时可以作如下修改。

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title></title>
 5     <meta charset="utf-8" />
 6     <script type="text/javascript" src="script/jquery-1.11.1.min.js"></script>
 7     <script type="text/javascript" src="script/jquery.dropkick-min.js"></script>
 8     <script type="text/javascript" src="script/laydate.js"></script>
 9     <link rel="stylesheet" type="text/css" href="style/dropkick.css">
10     <link rel="stylesheet" type="text/css" href="style/laydate.css">
11     <link rel="stylesheet" type="text/css" href="style/molv/laydate.css">
12     <style type="text/css">
13     *{    margin: 0;padding: 0;list-style: none;}
14     html,body{    height: 100%;}
15     .w100p{width: 100%;}
16     .pos-a{position: absolute;}
17     .mg-t{margin-top: 5px;}
18     .b{bottom: 0;}
19     .head_form{height: 45px;}
20     .chart_show_box{top: 45px;}
21     .content_show{height: 470px;}
22     .left_show{top: 470px;background: #000;}    
23     .normal-label{display: inline-block;    margin-top: 5px;margin-left: 10px;font:14px/30px "Microsoft YAHEI"; }
24     .normap-input{height: 24px;line-height: 24px;}    
25     </style>    
26 </head>
27 <body>
28     <div class="head_form w100p">
29         <form action="">
30             <select class="chose_select mg-t">
31                 <option value="1">这是选项1</option>
32                 <option value="2">这是选项2</option>
33                 <option value="3">这是选项3</option>
34                 <option value="4">这是选项4</option>
35                 <option value="5">这是选项5</option>
36                 <option value="6">这是选项6</option>
37             </select>
38             <label for="" class="normal-label">
39                 <span>预测日期:</span>
40                 <input type="text"  id="date_one" class="normap-input">
41             </label>
42             <label for="" class="normal-label">
43                 <span>参考日期:</span>
44                 <input type="text"  id="date_two" class="normap-input">
45             </label>
46             <button>修正</button>
47             <button>全部修正</button>
48         </form>
49     </div>
50     <div class="chart_show_box w100p pos-a b">
51         <div class="chart_show_main w100p">
52             <div class="content_show w100p" style="position:relative">
53                 <iframe src="http://www.baidu.com" frameborder="0" width="100%" height="100%"></iframe>
54             </div>
55             <div class="left_show w100p pos-a b">
56                 
57             </div>
58         </div>
59     </div>
60 </body>
61 </html>
经过样式分离,发现css样式减少了很多,而html除了主体结构调用类名较多以外其他地方并没有过多调用。而前面提到的width、position、bottom、margin-top等属性都被单独抽取出来,做公用样式处理。
注意:此处设想label和input在页面中使用通用样式,那么此处label和input就不再适合被拆分,而应该独立声明一个整体样式。
 
可拆分的属性:非公用组件或者布局框架样式,如标题栏,圣杯布局的div块等等。
合并属性:公用组件和布局框架,如按钮、文本框、下拉列表、label、标题栏、icon图片等等
 
是否每一个元素都需要有class类名?
按照上面分离与合并的思维,是否所有html元素都拥有一个类名就对了呢?来看看这样的示例:
 1 <ul>
 2         <li class="a"><span class="b"></span></li>
 3         <li class="a"><span class="b"></span></li>
 4         <li class="a"><span class="b"></span></li>
 5         <li class="a"><span class="b"></span></li>
 6         <li class="a"><span class="b"></span></li>
 7         <li class="a"><span class="b"></span></li>
 8         <li class="a"><span class="b"></span></li>
 9         <li class="a"><span class="b"></span></li>
10     </ul>
可以想想,一个项目中列表何其多,难道每一个都要这么做么?这简直是噩梦,而且,无端的增加了html结构的复杂性。
我们在实际工作中,拿到设计稿的第一时间并非打开你的sublime,而应该是拿起一支笔和一张纸,或者任何可以作记录的东西,仔细观察设计稿中的通性元素,比如你可能发现三个一样的列表、十个一个的标题、六个相同段落,而这些元素中可能包含li、span、i等等元素,我们完全没有必要为每一个元素都添加class,他是一个整体,合理使用后代声明规则可以实现我们想要的效果。
 
到现在,我们应该如何实现一个初步的模块化css架构呢?
首先,仔细观察页面设计稿内部的公用元素和组件,在书写页面的时候刻意合并公用元素的样式,这样直接调用即可实现。
其次,在页面构建完成后抽取部分可分离样式,css文件最上层cssReset之后就是分离样式的书写,切记同类型样式要书写在一起,比如:
1 .w100p{width: 100%;}.w120{width: 120px;}.w78{width: 78px;}.w200{width: 200px;}
2 .pos-a{position: absolute;}.pos-r{position: relative;}
3 .mg-t5{margin-top: 5px;}.mg-r7{margin-right: 7px}.mg-b6{margin-bottom: 6px}
这样书写的好处在于同类型样式在一起,从维护到后期修改都能一目了然。
最后,如果页面中存在某一个单独的样式(不存在于别的页面),请直接书写在<style></style>标签对中,这么做的好处不仅仅是减少了css文件大小,还提高了样式加载速度,淘宝就是这么干的。
原文地址:https://www.cnblogs.com/sky903700252/p/5408864.html