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. 详解JOIN

    根据连接中使用的操作符不同,连接条件可分为:等连接,不等连接   连接本身分为: 内连接(INNER JOIN) (1)INNER JOIN 方式(INNER可以省略) 取两表的交集. (2)并表查询 ...

  2. 利用SQL语句产生分组序号

    partition  by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition  by用于给结果集分组,如果没 ...

  3. 关于C语言指针几个容易混淆的概念

    前言: 大多数学习过C/C++或者正在学习的同学在对指针概念把握时,总是感觉不太明了,小弟我也不例外啊,于是翻开资料复习整理一下,并把自己的学习心得拿出来供大家分享,讨论. 基本概念掠过,主要来探讨一 ...

  4. Permutations,Permutations II,Combinations

    这是使用DFS来解数组类题的典型题目,像求子集,和为sum的k个数也是一个类型 解题步骤: 1:有哪些起点,例如,数组中的每个元素都有可能作为起点,那么用个for循环就可以了. 2:是否允许重复组合 ...

  5. oracle distinct 去除重复,同时按某字段排序

    SELECT distinct supplier_id, min(evidence_date) as evidence_date FROM TD_SUPPLIER_EVIDENCE_INFO wher ...

  6. div模拟textarea以实现高度自适应实例页面

    作为多行文本域功能来讲,textarea满足了我们大部分的需求.然而,textarea有一个不足就是不能像普通div标签一样高度可以跟随内容自适应.textarea总是很自信地显摆它的滚动条,高度固执 ...

  7. tabBar中tabBarItem选中颜色自定义设置

    1.在storyBoard中,选中tabBarController,设置tabBar中KeyPath中的(selectedImageTintColor)如图 2. 直接代码设置 tabBarContr ...

  8. DenyHosts 安装及配置详解

    DenyHosts是Python语言写的一个程序,它会分析sshd的日志文件(/var/log/secure),当发现重 复的攻击时就会记录IP到/etc/hosts.deny文件,从而达到自动屏IP ...

  9. 如何修改Struts2 FiledError样式

    有时候,使用Struts2的<s:fielderror />标签还是比较好的.但是这个标签本来的样式实在很难看,不但换行,而且有个大大的黑点.一看就知道用了<ui><li ...

  10. MFC 双缓冲加载背景

    首先定义DCmemDc和Bitmap CDC DCmemDc: CBitmap memBitmap; CBitmap *oldBitmap; 然后创建一个适应当前内存的DCmemDc CDC * dc ...