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学习笔记之jQuery的DOM操作
Dec 22 Javascript
js使用函数绑定技术改变事件处理程序的作用域
Dec 26 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
Oct 27 Javascript
AngularJS中isolate scope的用法分析
Nov 22 Javascript
基于three.js编写的一个项目类示例代码
Jan 05 Javascript
Vue中的无限加载vue-infinite-loading的方法
Apr 08 Javascript
详解js获取video任意时间的画面截图
Apr 17 Javascript
Layui数据表格跳转到指定页的实现方法
Sep 05 Javascript
iview form清除校验状态的实现
Sep 19 Javascript
vue3修改link标签默认icon无效问题详解
Oct 09 Javascript
vue实现图片上传预览功能
Dec 23 Javascript
Vue使用Proxy代理后仍无法生效的解决
Nov 13 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
目录,文件操作详谈―PHP
2006/11/25 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
php MessagePack介绍
2013/10/06 PHP
php使用Cookie实现和用户会话的方法
2015/01/21 PHP
为何说PHP引用是个坑,要慎用
2018/04/02 PHP
Gird事件机制初级读本
2007/03/10 Javascript
javascript 导出数据到Excel(处理table中的元素)
2009/12/18 Javascript
用原生JavaScript实现jQuery的$.getJSON的解决方法
2013/05/03 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
2016/01/18 Javascript
javascript实现用户点击数量统计
2016/12/25 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
详解vue 动态加载并注册组件且通过 render动态创建该组件
2019/05/30 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
react基本安装与测试示例
2020/04/27 Javascript
Python编程实现粒子群算法(PSO)详解
2017/11/13 Python
Python实现求解一元二次方程的方法示例
2018/06/20 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
python三引号输出方法
2019/02/27 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
Django与pyecharts结合的实例代码
2020/05/13 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
自荐信结尾
2013/10/27 职场文书
项目工作说明书
2014/07/29 职场文书
毕业生见习报告总结
2014/11/08 职场文书
2014年学校工作总结
2014/11/20 职场文书
小学教师教学随笔
2015/08/14 职场文书
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
2021/06/13 Python
详解Python为什么不用设计模式
2021/06/24 Python
Jedis操作Redis实现模拟验证码发送功能
2021/09/25 Redis
详解Vue3使用axios的配置教程
2022/04/29 Vue.js