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文件大小,还提高了样式加载速度,淘宝就是这么干的。
  • 相关阅读:
    【校招面试 之 C/C++】第23题 C++ STL(五)之Set
    Cannot create an instance of OLE DB provider “OraOLEDB.Oracle” for linked server "xxxxxxx".
    Redhat Linux安装JDK 1.7
    ORA-10635: Invalid segment or tablespace type
    Symantec Backup Exec 2012 Agent for Linux 卸载
    Symantec Backup Exec 2012 Agent For Linux安装
    You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1
    YourSQLDba介绍
    PL/SQL重新编译包无反应
    MS SQL 监控数据/日志文件增长
  • 原文地址:https://www.cnblogs.com/sky903700252/p/5408864.html
Copyright © 2011-2022 走看看