20行代码实现的一个CSS覆盖率测试脚本


Posted in Javascript onJuly 07, 2013

document.styleSheets里保存了当前页面上所有CSS规则的集合。通过它可以遍历出页面<style>里定义的所有selector,访问selectorText属性可得选择器的匹配规则。然后将规则规则传递给 document.querySelectorAll 即可获取页面内匹配此规则的元素列表。
这里我们只求CSS规则的覆盖率,所以访问 querySelectorAll().length 即可。通过排序就可看出各个CSS使用情况。
代码很简单。

var usage = [];
var sheets = document.styleSheets;
for(var i = sheets.length - 1; i != -1; i--) {
    var rules = sheets[i].rules;
    for(var j = rules.length - 1; j != -1; j--) {
        var rule = rules[j];
        var text = rule.selectorText;
        usage.push({name: text, count: document.querySelectorAll(text).length});
    }
}
usage.sort(function(a, b){return a.count - b.count});
for(var i = usage.length - 1; i != -1; i--) {
    console.log("选择器:" + usage[i].name + "\n\t匹配数:" + usage[i].count);
}

呼出F12,把代码粘到console里回车即可。

当然由于权限问题,外部导入的CSS无论如何都访问不到,暂时先不考虑了。至于不支持styleSheets的破IE嘛,可以考虑用expression或者behaviour.htc,改天试试看。
纯JS实现就到此。以后配合本地程序实现外部CSS的分析。

顺便贴个测试结果:

20行代码实现的一个CSS覆盖率测试脚本

哪些CSS没用到一目了然:

20行代码实现的一个CSS覆盖率测试脚本

当然,0匹配并不代表它就是没用的。最典型的例子就是:hover,只有鼠标移上去才会匹配。还有通过className控制,[attr=],#动态ID,动态元素。。。。等等等等的样式都不是轻易能匹配到。

所以以上代码意义并不大,而且目前主流浏览器都内置Profiles功能,并且能实时跟踪选择器匹配的元素数,所以做个IE版本的才有些意义:)

Javascript 相关文章推荐
Jquery ajaxsubmit上传图片实现代码
Nov 04 Javascript
IE6下CSS图片缓存问题解决方法
Dec 09 Javascript
javascript避免数字计算精度误差的方法详解
Mar 05 Javascript
node.js中的buffer.slice方法使用说明
Dec 10 Javascript
详解JavaScript的流程控制语句
Nov 30 Javascript
探究Vue.js 2.0新增的虚拟DOM
Oct 20 Javascript
详解使用fetch发送post请求时的参数处理
Apr 05 Javascript
linux 后台运行node服务指令方法
May 23 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
Aug 25 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
Jun 22 Javascript
在微信小程序中使用mqtt服务的方法
Dec 13 Javascript
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
Apr 03 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
Jul 07 #Javascript
JQuery表格内容过滤的实现方法
Jul 05 #Javascript
JS动态创建Table,Tr,Td并赋值的具体实现
Jul 05 #Javascript
Javascript实现动态菜单添加的实例代码
Jul 05 #Javascript
javascript实现跳转菜单的具体方法
Jul 05 #Javascript
JavaScript获取和设置CheckBox状态的简单方法
Jul 05 #Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
Jul 05 #Javascript
You might like
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
php导出word格式数据的代码实例
2013/11/25 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
JavaScript类和继承 prototype属性
2010/09/03 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
jquery插件开发之实现md5插件
2014/03/17 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
AngularJS开发教程之控制器之间的通信方法分析
2016/12/25 Javascript
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
2017/09/19 Javascript
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
Python实现全角半角转换的方法
2014/08/18 Python
实例讲解Python的函数闭包使用中应注意的问题
2016/06/20 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
2016/09/18 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
Python实现简单猜数字游戏
2021/02/03 Python
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
求网格中的黑点分布
2013/11/06 面试题
海南地接欢迎词
2014/01/14 职场文书
美德好少年事迹材料
2014/01/19 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
薪资证明范本
2015/06/19 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python