很多程序猿认为 —— 最蛋疼的工作不在于重写或创新,而是“修改前任程序猿留下的代码”……
对前端工程师来说,若不进行彻底的网页重构,而只是修补现有网页的代码(多是之前由 后端工程师 乃至 只会点儿 DreamWeaver 的运维网管 写的),再加上浏览器兼容性的工作特性(特别是 **IE 8-**),简直是“英年早逝”的节奏……
你能想象一个 HTML 文件中全是大量乱七八糟、东拼西凑的 标签结构 和 CSS 规则 吗?不仅如此,<link rel="stylesheet" />、<style />、<script /> 也是随时随地出现;很多 HTML 元素都由不止一个 CSS 文件中的多个毫无逻辑联系的规则 叠加影响;文件命名、目录结构也超乱…… “大海捞针”、“牵一发而动全身”便是再贴切不过的形容了……
若能用工具清理一遍 CSS,那我们的工作就搞定一半了~
原创小工具
这里先分享一下我原创的一个 BookMarkLet 形式的 网页 CSS 规则使用率检测工具 ——
(function(BOM, DOM, $) {
  var CSS_File = DOM.styleSheets,
    CopyRight = '(C)2014-2015  [email protected]';
  if (!$) {
    BOM.alert(
      'Please run This Tool in IE 8+ (Standard Mode) or a Modern Web Browser.' +
        '\n\n' +
        CopyRight
    );
    return false;
  } else if (!console) {
    BOM.alert(
      'Please run This Tool with JavaScript Console opened.' +
        '\n\n' +
        CopyRight
    );
    return false;
  }
  function URL_Path(URL) {
    if (URL.match(/^\w+:\/\//)) {
      URL = URL.split('/').slice(3);
      URL.unshift('.');
      URL = URL.join('/');
    }
    return URL;
  }
  function SelectorCheck(Selector) {
    Selector = Selector.split(',');
    var _NU_ = [];
    for (var k = 0; k < Selector.length; k++)
      if (!$(Selector[k].trim().split(':')[0]).length) _NU_.push(Selector[k]);
    return _NU_;
  }
  function CSS_Rule_Each(CSS_Rule_Group) {
    try {
      var CSS_Rule = CSS_Rule_Group.cssRules || CSS_Rule_Group.rules;
    } catch (Err) {}
    var Selector = '',
      NoUsage = [],
      Test_Result = {
        media: CSS_Rule_Group.media.mediaText,
        mediaRules: [],
        fontsRules: []
      };
    if (CSS_Rule) {
      for (var j = 0, _Rule_; j < CSS_Rule.length; j++) {
        _Rule_ = CSS_Rule[j];
        switch (_Rule_.type) {
          case 1:
            {
              //  CSSStyleRule
              _Rule_ = SelectorCheck(_Rule_.selectorText);
              if (_Rule_.length) NoUsage.push(_Rule_);
            }
            break;
          case 4: //  CSSMediaRule
            Test_Result.mediaRules.push(arguments.callee(_Rule_)[0]);
            break;
          case 5: //  CSSFontFaceRule
            Test_Result.fontsRules.push({
              fontFamily: _Rule_.style.fontFamily,
              src: _Rule_.style.src
            });
        }
      }
      Test_Result.WasteRate = ((NoUsage.length / j) * 100).toFixed(2) + '%';
    }
    return [Test_Result, NoUsage];
  }
  for (var i = 0, _File_, _Result_ = []; i < CSS_File.length; i++) {
    _Result_[i] = CSS_Rule_Each(CSS_File[i]);
    var _File_ = _Result_[i].shift();
    _File_.href = CSS_File[i].href;
    if (_File_.WasteRate && _File_.href) _File_.href = URL_Path(_File_.href);
    _File_.element = CSS_File[i].ownerNode;
    console.log(_File_);
  }
  console.log(_Result_);
})(self, self.document, self.document.querySelectorAll);
安装版代码
javascript: (function(a,b,c){function f(a){return a.match(/^\w+:\/\//)&&(a=a.split("/").slice(3),a.unshift("."),a=a.join("/")),a}function g(a){var b,d;for(a=a.split(","),b=[],d=0;d<a.length;d++)c(a[d].trim().split(":")[0]).length||b.push(a[d]);return b}function h(a){var b,e,f,i,h;try{b=a.cssRules||a.rules}catch(c){}if(e=[],f={media:a.media.mediaText,mediaRules:[],fontsRules:[]},b){for(h=0;h<b.length;h++)switch(i=b[h],i.type){case 1:i=g(i.selectorText),i.length&&e.push(i);break;case 4:f.mediaRules.push(arguments.callee(i)[0]);break;case 5:f.fontsRules.push({fontFamily:i.style.fontFamily,src:i.style.src})}f.WasteRate=(100*(e.length/h)).toFixed(2)+"%"}return[f,e]}var j,i,k,d=b.styleSheets,e="(C)2014-2015  [email protected]";if(!c)return a.alert("Please run This Tool in IE 8+ (Standard Mode) or a Modern Web Browser.\n\n"+e),!1;if(!console)return a.alert("Please run This Tool with JavaScript Console opened.\n\n"+e),!1;for(i=0,k=[];i<d.length;i++)k[i]=h(d[i]),j=k[i].shift(),j.href=d[i].href,j.WasteRate&&j.href&&(j.href=f(j.href)),j.element=d[i].ownerNode,console.log(j);console.log(k)})(self,self.document,self.document.querySelectorAll);
工具特性
- 扫描当前网页中所有内置/外置的 CSS,在控制台显示各 CSS 标签/文件中哪些规则对本页无用、共占比多少
- 外置 CSS 会显示文件相对路径
- 内置 CSS 会显示其对应的 HTML 元素,便于在调试器显示的 DOM 树上定位
- CSS 媒体查询、字体的规则会在显示的对象中有独立分支
- 暂不支持 CSS 选择符中间有 伪类、伪元素的情况,只支持它们出现在 选择符链的最后端(这是与下文提及的专业工具之有效比计算有误差的主要原因)
- 跨域的 CSS 文件无法扫描(它们一般都是 CDN 通用库 或 部署环境中的静态文件服务器托管的压缩版,本来就不是用于调试的)
FireBug 插件 —— CSS Usage
现在比较成熟的 CSS 有效性检查工具 当属 CSS Usage 了,它不仅能用彩色的富文本显示每个 CSS 标签/文件中每条规则在当前网页中的使用率,还能生成过滤后的 CSS 文本,可以直接复制粘贴到代码编辑器中保存、使用~
至于它的安装,和 FireBug 一样,在 FireFox 的附加组件管理界面中搜索、下载、安装、重启,在 FireBug 主界面上端的选项卡最后就能看到它了~
 
                        
                        