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. iOS 9适配技巧(更新版)

    转自:   http://www.cocoachina.com/ios/20150929/13598.html 中文快速导航: 1.iOS9网络适配_ATS:改用更安全的HTTPS(见Demo1) i ...

  2. OC-类

    1.关于头文件 #include <stdio.h>     #import <Foundation/Foundation.h> 区别:#import指令导入更快更有效率.#i ...

  3. hdu2243考研路茫茫——单词情结

    Problem Description 背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如&q ...

  4. PHP中实现异步调用多线程程序代码

    本文章详细的介绍了关于PHP中实现异步调用多线程方法,下面我们以给1000个用户发送一封推荐邮件,用户输入或者导入邮件账号了提交服务器执行发送来讲述. 比如现在有一个场景,给1000个用户发送一封推荐 ...

  5. python 初学笔记 (一)

    初学python第一天,希望自己真正了解计算机语言,并且做出成效. 写下学习笔记,记录学习进度,娱乐学习,不断成长. python详细介绍: python是什么?运用到哪里?有哪些在使用它? pyth ...

  6. delete 指针

    #include<iostream>using namespace std;class human{public: human(){cout<<"构造";} ...

  7. 安装程序时出现错误代码0x80070422

    通过win10应用商店,下载应用,安装时出现错误代码0x80070422. 需要打开services.msc,将windows update服务打开.

  8. USB 3.1 Type-C

    [時報記者任珮云台北報導]微軟.英特爾.蘋果今年將新款PC介面升級至USB 3.1規格,Wintel陣營今年新款PC產品亦將全面採用USB 3.1介面,里昂證出具最新的報告指出,在新趨勢帶動下,台廠的 ...

  9. android TextView 带滚动条,和ScrollView 用法(暂时觉得ScrollView滑动速度比较快)

    本来是想做一个显示文字信息的,当文字很多时View的高度不能超过一个固定的值,当文字很少时View的高度小于那个固定值时,按View的高度显示.因为ScrollView没有maxHeight,无法满足 ...

  10. Android UI ActionBar功能-在 Action Bar 上添加按钮

    在ActionBar上添加按钮实现某些功能最常见的Application的功能如:在ActionBar上添加一个搜索按钮: 首先官方文档说明:http://wear.techbrood.com/tra ...