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的更多相关文章

  1. 纯CSS3实现的一些酷炫效果

    之前在网上看到一些用纯CSS3实现的酷炫效果,以为实现起来比较困难,于是想看看具体是怎么实现的. 一.笑脸猫动画 实现效果如下: 这个实现起来确实比较麻烦,很多地方需要花时间,有耐心地调整. 1.先看 ...

  2. CSS3 border-radius边框圆角

    在CSS3中提供了对边框进行圆角设定的支持,可对边框1~4个角进行圆角样式设置. 目录 1. 介绍 2. value值的格式和类型 3. border-radius 1~4个参数说明 4. 在线示例 ...

  3. CSS3 3D立方体效果-transform也不过如此

    CSS3系列已经学习了一段时间了,第一篇文章写了一些css3的奇技淫巧,原文戳这里,还获得了较多网友的支持,在此谢过各位,你们的支持是我写文章最大的动力^_^. 那么这一篇文章呢,主要是通过一个3D立 ...

  4. 三分钟学会用 js + css3 打造酷炫3D相册

    之前发过该文,后来不知怎么回事不见了,现在重新发一下. 中秋主题的3D旋转相册 如图,这是通过Javascript和css3来实现的.整个案例只有不到80行代码,我希望通过这个案例,让正处于迷茫期的j ...

  5. 使用CSS3实现一个3D相册

    CSS3系列我已经写过两篇文章,感兴趣的同学可以先看一下CSS3初体验之奇技淫巧,CSS3 3D立方体效果-transform也不过如此 第一篇主要列出了一些常用或经典的CSS3技巧和方法:第二篇是一 ...

  6. Web大前端时代之:HTML5+CSS3入门系列

    准备来一波新技术,待续.... Old: 联系源码:https://github.com/dunitian/LoTHTML5 文档下载:https://github.com/dunitian/LoTD ...

  7. 07. Web大前端时代之:HTML5+CSS3入门系列~H5 地理位置

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 源码:https://github.com/duniti ...

  8. 前端制作动画的几种方式(css3,js)

    制作动态的网页是是前端工程师必备的技能,很好的实现动画能够极大的提高用户体验,增强交互效果,那么动画有多少实现方式,一直对此有选择恐惧症的我就总结一下,以便在开发的时候选择最好的实现方式. 1.css ...

  9. 原生js+css3实现图片自动切换,图片轮播

    运用CSS3transition及opacity属性 制作图片轮播动画 自己这两天根据用js来控制触发CSS3中transition属性,从而写出来的以CSS3动画为基础,js控制过程的图片轮播 运用 ...

  10. css3线条围绕跑马+jquery打字机效果

    原文地址:css3线条围绕跑马+jquery打字机效果 有图有真相,今天偶然看到了一种效果,仔细看了下,发现它是用css的clip+css3的动画实现的,简直叼.于是自己拿来了前一阵子写的打字机效果, ...

随机推荐

  1. linux 日志查看总结

    1 grep "ERROR" catalina.log -a 20 -b 10 查看 catalina.log 中error的唯一 一行的后20行 前10行这种情况一般要唯一确定. ...

  2. Servlet 浅谈(一)

    Servlet 的生命周期 类加载.实例化,init方法,service方法,destroy方法.关于这点,后面会有详细介绍. 什么是容器? 因为Servlet没有main方法,所以它受控于另一个Ja ...

  3. excel文件后台代码

    很多情况下,我们都需要从Excel中获取数据来创建Word报表文档.首先在Excel中分析数据,然后将分析结果导出到Word文档中发布.技术实现方式:1.创建Word模板,用来作为数据分析结果发布平台 ...

  4. js第四章作用域

    一.动态的属性 //创建了一个变量并且保存在了变量person中 var person = new Object(); //为该对象添加了一个名为name的属性,将字符串值‘NiCholas’赋值给n ...

  5. 第一个MVC模型

    根据慕课网的视频自学来的. 关于MVC的简介和一些常识:http://www.cnblogs.com/jobscn/archive/2011/11/08/2240725.html MVC模式 : MV ...

  6. UML-类图,包图

    UML构造设计模型   一.类图  二.包图   三.组件图   四.部署图   一.类图     1.类:类由三格表示:类名,类的属性,类的操作              类名: 首字母大学     ...

  7. struts2中 ServletActionContext与ActionContext区别

    1. ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息, ...

  8. Is life always hard?

    原文来自我的独立blog: http://www.yuanyong.org/blog/midnightsun/is-life-always-hard 和两个朋友聊天. 小L在考研,打电话过去的时候小L ...

  9. python-多线程(原理篇)

    多线程的基本概念 语言学习总是绕不过一些东西,例如多进程和多线程,最近越来越发现,上来看几个实例练习一下过几天就不知其所以然了.所以还是先看看原理,在看实例练习吧! 线程的概念 概念:线程是进程中执行 ...

  10. Log4Net不生成日志文件

    可能没有初始化配置,在Global文件Application_Start添加 log4net.Config.XmlConfigurator.Configure(); 或者输出日志进行初始化,如(Log ...