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 CHECKBOX全选,取消全选,反选方法三
Aug 30 Javascript
js触发asp.net的Button的Onclick事件应用
Feb 02 Javascript
javascript抖动元素的小例子
Oct 28 Javascript
javascript页面渲染速度测试脚本分享
Apr 15 Javascript
javascript实现的一个带下拉框功能的文本框
May 08 Javascript
浅谈JavaScript中小数和大整数的精度丢失
May 31 Javascript
JavaScript中push(),join() 函数 实例详解
Sep 06 Javascript
原生js封装的一些jquery方法(详解)
Sep 20 Javascript
浅谈JavaScript的函数及作用域
Dec 30 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
Mar 26 Javascript
vue瀑布流组件实现上拉加载更多
Mar 10 Javascript
Openlayers实现测量功能
Sep 25 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
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
中国的第一台收音机
2021/03/01 无线电
桌面中心(四)数据显示
2006/10/09 PHP
打造计数器DIY三步曲(中)
2006/10/09 PHP
php中filter函数验证、过滤用户输入的数据
2014/01/13 PHP
thinkPHP中create方法与令牌验证实例浅析
2015/12/08 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
基于jQuery选择器的整理集合
2013/04/26 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
document.getElementBy(&quot;id&quot;)与$(&quot;#id&quot;)有什么区别
2013/09/22 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
简单实现js选项卡切换效果
2016/02/03 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
工作中常用到的ES6语法
2018/09/04 Javascript
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
[07:52]2014DOTA2 TI逗比武士游V社解说背后的故事
2014/07/10 DOTA
python聊天程序实例代码分享
2013/11/18 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
Pytorch之Variable的用法
2019/12/31 Python
Python selenium自动化测试模型图解
2020/04/15 Python
Python 添加文件注释和函数注释操作
2020/08/09 Python
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
使用C#编写创建一个线程的代码
2013/01/22 面试题
什么是封装
2013/03/26 面试题
厨师长岗位职责
2014/03/02 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
分家协议书范本
2016/03/22 职场文书
python 算法题——快乐数的多种解法
2021/05/27 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
2022/04/11 Python
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers