zoukankan      html  css  js  c++  java
  • 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文件大小,还提高了样式加载速度,淘宝就是这么干的。
  • 相关阅读:
    PHP全栈学习笔记3
    PHP全栈学习笔记3
    JavaScript基础系列
    JavaScript基础系列
    Java语言
    Java语言
    HTML基础系列
    HTML基础系列
    PHP全栈从入门到精通1
    PHP全栈从入门到精通1
  • 原文地址:https://www.cnblogs.com/sky903700252/p/5408864.html
Copyright © 2011-2022 走看看