CSS3 Test
CSS3Test
如何判定一个浏览器对css3的支持情况呢
有这么一个站点http://css3test.com 可以测试浏览器对CSS3的支持情况 对应的Github在这里
原理
实际上浏览器对CSS的支持程度可以使用浏览器的API来得到,而不是运行一个使用了css3的页面来肉眼判断,或者更复杂的使用PhantomCSS(对于不同机型 似乎使用PhantomCSS行不通?)
属性支持
实际上就是对一个遍历一个元素的style属性对象
若一个属性存在于这个style的key中则支持
var dummy = document.createElement('_'),
inline = dummy.style;
if(testProperty in inline) {
return true;
}
选择器支持
利用 document.querySelector('.selector');
如果不支持这个选择器 该语句会报错
try {
document.querySelector(prefixed);
}catch (e) {}
Media query支持
利用matchMedia()
var matches = matchMedia(test);
return matches.media !== 'invalid' && matches.matches;
Keyframe关键帧
利用sytle.sheet.cssRules.length
var style = document.createElement('style');
style.textContent = '@keyframes foo{}'; // Safari 4 has issues with style.innerHTML
if(style.sheet.cssRules.length > 0) {
return _.atrule.cached[atrule] = prefixed;
}
一个测试用例JSON格式
一组测试示例基本JSON结构
'test case name':{
title: 'test case name',
//接下来是test case 类型
//测试浏览器是否支持 xxx:xxx 的css属性
//遍历一个元素的style属性 它是一个对象 若这个key存在于 xxx.style 中则表示支持
properties:{
key: value
},
values:{ //将会组合成key1:value1 key1:value2 key2:value1 key2:value2 也是判断浏览器是否支持xxx:xxx的属性
properties:[key1,key2],
cate1:[value1, value2]
},
//根据docoument.querySelector('xxx')判断是否支持 若不持支持这种选择器该语句将报错
selectors: {
'name': 'selector'
'name': ['selector','...']
},
//根据matchMedia 函数 matchMedia(mq).media 有值则支持
'Media queries':{
'category name': ['mediaquery value', '...']
},
//向style标签中写入值 style.textContent = 'xxx' 再根据style.sheet.cssRules.length 判断
"@rules": {
"@keyframes": "@keyframes foo"
}
}
可以看出测试一共分为5个类型
- properties 看浏览器是否支持这个属性以及其属性值
- values 和properties同样 只不过属性以及属性值是由
values中的properties和其他值组合而成 - selectors 选择器
- media query mediaquery表达式支持
- @rules 自定义keyframe支持
CSS3Test 代码逻辑
主要分为4个文件
- csstest.js 程序执行的入口 可以认为就是 main.js
- test.js 测试用例
- utopia.js 创建元素的util.js
- support.js 用于判断浏览器是否支持该属性
csstest.js
Score{} 计分, 存放所有测试用例的个数, 和通过测试用例个数
Test{} 测试类
Test.group 每一类测试对应的处理
入口函数

在csstest.js中的onload中的一个立即执行函数里面
通过
var test = new Test(Specs[spec], spec, Specs[spec].title);
一个一个的取出Spec中的测试用例来执行测试
该立即执行函数是递归调用的, 所以你看不到循环
算是函数式编程的思想哈, 不用for循环
Test的构造函数即执行了测试, 其中调用了Test.group中对应的函数
for(var id in Test.groups) {
this.group(id, Test.groups[id]);
}
其中Test.groups[id]才是真正执行的函数 并返回执行结果
group函数则是组装要测试的key和value
tests = theseTests[feature];
tests = tests instanceof Array? tests : [tests];
support.js
support.js 顾名思义就是真正来判断浏览器是否支持该CSS的类
最核心的property函数
prefixes: ['', '-moz-', '-webkit-', '-o-', '-ms-', 'ms-', '-khtml-'];
for(var i=0; i<_.prefixes.length; i++) {
var prefixed = _.prefixes[i] + property;
if(camelCase(prefixed) in inline) {
return _.property.cached[property] = prefixed;
}
}
utopia.js
自定义的工具类
根据opt创建元素 还可以append元素, 如果你指定了父元素的话
其他还有一些类型判断type函数 事件处理的bind等
CSS3 Test的更多相关文章
- 纯CSS3实现的一些酷炫效果
之前在网上看到一些用纯CSS3实现的酷炫效果,以为实现起来比较困难,于是想看看具体是怎么实现的. 一.笑脸猫动画 实现效果如下: 这个实现起来确实比较麻烦,很多地方需要花时间,有耐心地调整. 1.先看 ...
- CSS3 border-radius边框圆角
在CSS3中提供了对边框进行圆角设定的支持,可对边框1~4个角进行圆角样式设置. 目录 1. 介绍 2. value值的格式和类型 3. border-radius 1~4个参数说明 4. 在线示例 ...
- CSS3 3D立方体效果-transform也不过如此
CSS3系列已经学习了一段时间了,第一篇文章写了一些css3的奇技淫巧,原文戳这里,还获得了较多网友的支持,在此谢过各位,你们的支持是我写文章最大的动力^_^. 那么这一篇文章呢,主要是通过一个3D立 ...
- 三分钟学会用 js + css3 打造酷炫3D相册
之前发过该文,后来不知怎么回事不见了,现在重新发一下. 中秋主题的3D旋转相册 如图,这是通过Javascript和css3来实现的.整个案例只有不到80行代码,我希望通过这个案例,让正处于迷茫期的j ...
- 使用CSS3实现一个3D相册
CSS3系列我已经写过两篇文章,感兴趣的同学可以先看一下CSS3初体验之奇技淫巧,CSS3 3D立方体效果-transform也不过如此 第一篇主要列出了一些常用或经典的CSS3技巧和方法:第二篇是一 ...
- Web大前端时代之:HTML5+CSS3入门系列
准备来一波新技术,待续.... Old: 联系源码:https://github.com/dunitian/LoTHTML5 文档下载:https://github.com/dunitian/LoTD ...
- 07. Web大前端时代之:HTML5+CSS3入门系列~H5 地理位置
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 源码:https://github.com/duniti ...
- 前端制作动画的几种方式(css3,js)
制作动态的网页是是前端工程师必备的技能,很好的实现动画能够极大的提高用户体验,增强交互效果,那么动画有多少实现方式,一直对此有选择恐惧症的我就总结一下,以便在开发的时候选择最好的实现方式. 1.css ...
- 原生js+css3实现图片自动切换,图片轮播
运用CSS3transition及opacity属性 制作图片轮播动画 自己这两天根据用js来控制触发CSS3中transition属性,从而写出来的以CSS3动画为基础,js控制过程的图片轮播 运用 ...
- css3线条围绕跑马+jquery打字机效果
原文地址:css3线条围绕跑马+jquery打字机效果 有图有真相,今天偶然看到了一种效果,仔细看了下,发现它是用css的clip+css3的动画实现的,简直叼.于是自己拿来了前一阵子写的打字机效果, ...
随机推荐
- Tera Term——访问linux的ssh工具
个人感觉他是一款免费的并且比较好用的ssh工具,下载地址: http://logmett.com/index.php?/products/teraterm.html 下载之后一路下一步就可以了.可以选 ...
- zookeeper_03:Java 客户端(原生API)
环境配置 下载并ZooKeeper的发行版 新建Java project,并导入jar包 创建会话 public class CreateSession implements Watcher { pr ...
- EditPlus 快速去重
- Asp.Net MVC4配置Ext.Net
首先,下载MVC用的DLL包(Ext.NET.MVC.Pro.2.2.0.zip).讲DLL文件拷贝到工程bin目录下,引用进工程. 第二步,配置Views文件夹下的web.config文件(具体文字 ...
- Formiko总结整数十进制转换二进制原理
引子: 为什么十进制转二进制的“辗转相除记录余数倒序输出”的算法是正确的?这个问题陪伴了Formiko半年. 实践: 实践一:把十进制数100转换成二进制数的图 上图和和下图唯一的区别在最后一位上 ...
- 经典排序算法(Java实现)
以下程序均将数据封装于DataWrap数据包装类中,如下所示: //数据包装类 class DataWrap implements Comparable<DataWrap> { int d ...
- Redmine email配置
很简单,先安装sendmail apt-get install sendmail 然后在redmine目录的配置文件conf/configuration.yml中取消几行注释: # ==== Send ...
- 使用Transaction访问数据库(C#,TransactionScope,.NET 2.0)
针对SQL2005和.NET 2.0的事物机制有了新的突破传统数据库事物访问机制,代码如下: 或者这种,其实都差不多 ...
- C++ Primer 学习笔记_85_模板与泛型编程 --模板特化[续]
模板与泛型编程 --模板特化[续] 三.特化成员而不特化类 除了特化整个模板之外,还能够仅仅特化push和pop成员.我们将特化push成员以复制字符数组,而且特化pop成员以释放该副本使用的内存: ...
- poj2503
有关字符串的hash,用黑书上推荐的传说中的ELFhash函数 输入的话,用sscanf处理比較简洁 #include<iostream> #include<cstring> ...