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 相关文章推荐
javascript与asp.net(c#)互相调用方法
Dec 13 Javascript
Jquery实战_读书笔记1—选择jQuery
Jan 22 Javascript
DLL+ ActiveX控件+WEB页面调用例子
Aug 07 Javascript
Eval and new funciton not the same thing
Dec 27 Javascript
随窗体滑动的小插件sticky源码
Jun 21 Javascript
浅谈JavaScript函数参数的可修改性问题
Dec 05 Javascript
如何在MVC应用程序中使用Jquery
Nov 17 Javascript
理解javascript中的严格模式
Feb 01 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
Apr 07 Javascript
vuejs使用FormData实现ajax上传图片文件
Aug 08 Javascript
Angular 项目实现国际化的方法
Jan 08 Javascript
解决layui下拉框监听问题(监听不到值的变化)
Sep 28 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
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
PHP中的正则表达式函数介绍
2012/02/27 PHP
一漂亮的PHP图片验证码实例
2014/03/21 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
2016/03/23 PHP
java模拟PHP的pack和unpack类
2016/04/13 PHP
深入浅析yii2-gii自定义模板的方法
2016/04/26 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
php版微信公众号接口实现发红包的方法
2016/10/14 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
js左右弹性滚动对联广告代码分享
2014/02/19 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
解决React Native端口号修改的方法
2017/07/28 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
node 版本切换的实现
2020/02/02 Javascript
python实现中文转换url编码的方法
2016/06/14 Python
TensorFlow安装及jupyter notebook配置方法
2017/09/08 Python
对python 通过ssh访问数据库的实例详解
2019/02/19 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
20行python代码实现人脸识别
2019/05/05 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
详细分析Python垃圾回收机制
2020/07/01 Python
Nike台湾官方商店:Nike.com (TW)
2017/08/16 全球购物
数据员岗位职责
2013/11/19 职场文书
全陪导游欢迎词
2014/01/17 职场文书
大学生就业意向书范文
2014/04/01 职场文书
经济贸易系毕业生求职信
2014/05/31 职场文书
领导干部群众路线个人对照检查材料思想汇报
2014/09/30 职场文书
学校运动会加油词
2015/07/18 职场文书
关于Javascript闭包与应用的详解
2021/04/22 Javascript
Python - 10行代码集2000张美女图
2021/05/23 Python
MySQL删除和插入数据很慢的问题解决
2021/06/03 MySQL
Elasticsearch 聚合查询和排序
2022/04/19 Python
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers