2019独角兽企业重金招聘Python工程师标准>>>

随着HTML5和CSS3的飞速发展,越来越多语义化的标签和炫酷的特性被应用到web应用开发中来,各大浏览器厂商纷纷开始支持这些新特性,web开发人员也都兴趣十足地试用这些新特性开发出更绚丽有趣的应用,但是各大浏览器对这些新特性参差不齐地支持(尤其是令人头疼的IE)所带来的版本兼容性问题始终都是萦绕在开发人员心头的噩梦。传统的使用习惯使得我们很难摒弃老版本浏览器,开发人员只能选择令人厌烦的手工测试,测试,再测试。

为了解决这一难题,Modernizr应运而生了。它的名字听起来有点像Modernize, 确实,该名字起源于使得开发体验能够更现代化的目的,但它并非试图使旧的浏览器现代化,也就是使它支持这些新特性(尽管你确实可以通过添加shim/polyfill脚本来让浏览器支持某些不支持的新特性,后面会介绍)。

Modernizr是一个检测浏览器对HTML5和CSS3特性支持的开源的js库,著名的HTML5/CSS3浏览器兼容性网站FindmeByIP就是基于该框架实现的。我们能够利用它来检测浏览器是否支持某种新特性,甚至可以额外加载script脚本,满足你根据不同的情况动态加载不同的js文件来减少下载量提高性能的需求。

Modernizr提供development和production两个版本,development版本包含了对所有HTML5和CSS3新特性的检测,适用于学习和测试,对于刚开始使用Modernizr的新手来说,bella建议你使用这个版本。当你熟悉了Modernizr的工作原理后,你就可以使用production这个自定义版本,你可以只下载任意数量的你需要检测的特性从而大大减小下载量,这在某种程度上是能小幅提高你程序的性能的。你可以在http://modernizr.com/download/上下载这两个版本,点击该页面上的development version链接,就可以下载development版,或者,你已经看到了如下的特性显示页面

你可以勾选任意你想要测试的HTML5或CSS3特性,但是默认情形下,Extra分类将会选中如下三项:

a) HTML5 Shiv v3.6:它添加了一个脚本— HTML5 shim 它会迫使迫使 IE6-8 正确地设计并打印 HTML5 元素。如果你打算使用新的 HTML5 语义标签,例如 <header>、<footer>、 <nav>、<section>、<article>等等,那么你需要选这个选项。

b) Modernizr.load(yepnope.js):它添加了一个不包含在 development 版本中的可选择的脚本加载器。它增加了3KB 的下载量,所以如果你不需要它,你可以放弃选择它。

c) Add CSS Classes: 它将 Modernizr 类添加到开始的标签。如果你想检测对 CSS3 功能支持,那么你必须选择这个选项。

Modernizr的使用方法很简单,当你下载了如development版本后只需在页面中引入js库文件即可,如:

1 <script type="”text/javascript”" src="“js/modernizr.js”"></script>

添加完Modernizr引用后,js程序运行的时候它会在html元素上添加一批CSS的class名称,这些class名称标记当前浏览器支持哪些特性和不支持哪些特性,如果支持会显示相应的特性名,不支持的话就显示no-特性名。例如,如果检测的浏览器支持boxshadow这个CSS3属性,Modernizr就会在标签上添加boxshadow类,否则,就会添加no-boxshadow类。下图显示的是在chrome 23.0.1271.64版本上的HTML5和CSS3新特性支持情况。

然后,你只需要在你的CSS样式表中定义相应的样式信息即可,你可以像下面这样定义:

1 .boxshadow #MyContainer {
2   bordernone;
3   -webkit-box-shadow: #666 1px 1px 1px;
4   -moz-box-shadow: #666 1px 1px 1px;
5 }
6 .no-boxshadow #MyContainer {
7   border2px solid black;
8 }

由于浏览器会忽略不支持的CSS3特性,如果当前的浏览器版本不支持boxshadow属性,它会忽略掉boxshadow类,转而引用no-boxshadow类中定义的样式,省去了你在js程序中检测浏览器名称的麻烦逻辑。

当然,当你的应用场景需要你在程序中判断是否支持某种新特性而给出不同的处理逻辑时,你也可以利用Modernizr很容易地进行判断,此时,你需要用到Modernizr创建的一个命名为”Modernizr”的全局对象,其内容是为每一个检测完的特性给出的布尔值结果所组成的列表,如果浏览器支持boxShadow属性,那么Modernizr.boxShadow的值就是true,否则为false,所以引入库文件后,你也可以使用此种方法来检测浏览器对该特性的支持情况。这个js对象针对某些功能还包含了更为详细的信息,如”Modernizr.video.h264”会告诉你浏览器是否支持这个特殊的编解码器,”Modernizr.inputtypes.search”会告诉你当前浏览器是否支持新的search input类型。

此外,如果Modernizr中并不包含你需要检测的特性,你可以调用Modernizr封装的addTest函数来测试,针对不同的HTML5和CSS3特性,我们可以在github(由于某种原因,Modernizr被封,该项目现托管在github上)上找到很多已经写好的addTest函数。我们还是一起来看一个简单的例子,如果你想测试浏览器是否支持getusermedia这个API(WebRTC新技术中的API),你可以编写下面这样的addTest函数来测试:

1 Modernizr.addTest('getusermedia', !!Modernizr.prefixed('getUserMedia', navigator));

相信简单的介绍之后,你已经初步体会到了Modernizr能为开发带来的便利之处了。了解了Modernizr的功能和如何使用Modernizr后,看看它的源码熟悉它的实现原理同样能学习到不少新知识。Bella在这方面虽然是菜鸟一个,但是还是跟大家分享一点看源码的心得。

前面bella提到过Modernizr这个全局对象,具体它在Modernizr里是怎样创建的呢?我们来看下面源码:

1 window.Modernizr = (function( window, document, undefined) {
2   var ...;
3   Modernizr = {};
4   ...
5   return Modernizr;
6 })(thisthis.document);

这部分代码用异步函数产生了一个命名空间(虽然js中并没有真正意义上的命名空间),函数返回了一个Modernizr对象,而这个对象被分配到了window.Mordernizr下,这样,其他的js程序就可以直接使用window.Modernizr或Modernizr对象。函数被调用时传入的参数this指的是函数执行的上下文环境,也即window这个全局对象。

Modernizr是如何测试对CSS3新特性的支持程度的呢?原来Modernizr会先创建一个DOM对象,然后利用这个对象下的style属性来测试是否支持各CSS3新特性。代码如下:

1 var mod = 'modernizr',
2     modElem = document.createElement(mod),
3     mStyle = modElem.style;

对浏览器而言,无论它是否能够识别我们新创建的html标签,我们都可以给它设定样式,所以我们可以给这里新创建的标签设置样式。假设我们想测试浏览器是否支持CSS中用hsla来定义颜色,我们可以先写一个应用了hsla属性的样式放到标签下,然后检查样式的值是否含有hsla的字符串,如果浏览器不支持,就不会有hsla字符串(因为将应用了hsla属性的样式放到modernizr标签下的动作根本就不会生效)。我们可以编写如下代码:

1 tests['hsla'] = function() {
2   setCss(‘background-color:hsla(120,40%,100%,.5)’);
3   return contains(mStyle.backgroundColor, 'rgba') ||
4   contains(mStyle.backgroundColor, 'hsla');
5 };

这里由于有些浏览器会将hsla的表示法转成rgba,所以同时检查是否有rgba这个字符串。

而对于带有供应商前缀的CSS属性,我们还需给出不同的处理。回到boxShadow属性上,Modernizr会去测试上面创建的mStyle变量下是否有boxShadow、WebkitBoxShadow、MozBoxShadow、OBoxShadow、msBoxShadow或KhtmlBoxShadow属性,如果有则表示浏览器支持该属性。这里主要用到了两个Modernizr封装的函数,一个是testProp(),一个是testAllProps()。Modernizr.testProp(str)会返回一个给定的样式属性是否能被识别,而Modernizr.testAllProps(str)会返回一个给定的样式属性,或者是任意带有供应商前缀的样式属性是否能被识别。

有关更多的源码知识,等bella以后有更深入的研究后再跟大家介绍吧。bella相信如果你熟悉了Modernizr的原理和使用方法,它一定能够帮助你提高开发效率。

最后,bella简单总结了一些可供大家学习Modernizr的资料:

1. Modernizr官网: http://modernizr.com/docs/ 你可以在上面学习到Modernizr知识,源码和下载Modernizr。

2. Modernizr Test Suite网址:http://modernizr.github.com/Modernizr/test/index.html 你可以在上面查询到各浏览器对HTML5和CSS3特性支持情况,查询方法:

点击该页面下方的Show the Ref Tests from Caniuse and Modernizr,然后任意单击一个测试的HTML5或CSS3特性的Table链接,即可看到各浏览器支持情况。

3. shim/polyfill脚本的相关信息: https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills

4. 各种检测HTML5和CSS3新特性的addTest函数下载地址:

https://github.com/Modernizr/Modernizr/tree/master/feature-detects

转载于:https://my.oschina.net/u/867090/blog/202709

Modernizr:HTML5和CSS3的开发利器相关推荐

  1. 零基础学HTML5和CSS3前端开发第一课

    课程目标: 使用HTML5进行网站布局 使用CSS3进行网站美化 开发精美的商业网站 第一章 HTML5基础 概念: 网页 :互联网的基础,网络页面,网页:文字.图片.声音.视频.VR虚幻等:网站:淘 ...

  2. HTML5和CSS3 介绍开发实战需要的(二)

    文章目录 1.HTML5相较于HTML 1.1HTML5新增的语义化标签 1.1.1语义化标签总结 1.2 HTML5新增的多媒体标签 1.2.1多媒体标签总结 1.3 HTML5新增的input属性 ...

  3. 使用Modernizr 检测HTML5和CSS3浏览器支持功能

    http://www.adobe.com/cn/devnet/dreamweaver/articles/using-modernizr.html 传统浏览器目前不会被完全取代,令你难以将最新的 CSS ...

  4. Modernizr.js-检测浏览器对HTML5和CSS3的支持程度

    为什么80%的码农都做不了架构师?>>>    传统浏览器目前不会被完全取代,令你难以将最新的 CSS3 或 HTML5 功能嵌入你的网站. Modernizr 正是为解决这一难题应 ...

  5. 用HTML5/CSS3/JS开发Android/IOS应用

    现在人人都想成为安卓/IOS应用开发工程师.其实,安卓/IOS应用可以用很多种语言来实现.由于我们前端开发工程师,对HTML5/CSS/JavaScript的网络编程已经相当熟悉了.所以,今天大家将会 ...

  6. Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)

    转载:http://www.cnblogs.com/lhb25/p/must-read-links-for-web-designers-and-developers-volume-12.html 20 ...

  7. Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】

    2012年12月12日,[<Web 前端开发人员和设计师必读文章>系列十二]和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HT ...

  8. 使用modernizr.js检测浏览器对html5以及css3的支持情况

    使用modernizr.js检测浏览器对html5和css3的支持情况 详情请看主页:modernizr主页 1. modernizr 是什么? modernize 是一个js库----一个用于检测当 ...

  9. modernizr 支持html5,使用modernizr.js检测浏览器对html5以及css3的支持情况

    使用modernizr.js检测浏览器对html5和css3的支持情况 1.modernizr 是什么? modernize 是一个js库----一个用于检测当前浏览器对html5&css3 ...

最新文章

  1. php中处理xml文件的类 simpleXML
  2. 如何优化网站结构才促使网站排名“节节高”?
  3. SQL基础--完整性约束
  4. [转]配置子报表和钻取报表
  5. Spring Cloud一站式的微服务架构解决方案
  6. 学习Java编程到底是为了什么,该具备什么样的能力
  7. 微力同步linux,云端同步软件-微力同步下载 v2.4.3 官方版 - 下载吧
  8. 算法图解学习笔记02:递归和栈
  9. UITextInputMode
  10. 树莓派安装系统并设置中文界面
  11. Ubuntu环境下Android反编译apk教程
  12. 十位博客专家极力推荐的 谷歌浏览器插件,用过都说好
  13. Google推出GDrive免费云存储服务
  14. 图片转ascii字符画C语言,将图片转为ASCII字符画
  15. 用flash做连线题(线的一端跟随鼠标)
  16. 智商一般学计算机,IQ最高的十大专业公布 智商不高慎选
  17. Java 面试题大全(一篇足以,建议收藏)
  18. UWB/蓝牙/WiFi/红外/Zigbee/LoRa Edge…….室内定位技术的百家争鸣时代
  19. 学习USART自闭实录(stm32F411RE)Stm32cubemx
  20. 破解西胍无水印视频,实现完美下载

热门文章

  1. win 对比工具-Araxis Merge
  2. ORA-09817:Write to audit file failed
  3. jsp验证身份证号并自动计算年龄和出生日期
  4. 读《实战 GUI 产品的自动化测试》之:第二步,构建利于维护的自动化测试系统...
  5. 《The C Programming Language》(2nd Ed) Introduction 翻译
  6. AI让交通管理省时、省心、省力
  7. 常用和不常用端口一览表收藏
  8. unity3d EasyTouch滑动屏幕移动相机观看场景
  9. C#Winform窗体中传值
  10. 移动基于Percona XTRADB Cluster的大数据解决方式