好吧,好久没有聊CSS3了,今天我们来讲讲CSS3的最新特性。
在Chrome最新的动态里,添加了对CSS.supports()方法的支持,而许多关注浏览器发展的朋友也可能已经了解到Firefox和Opera开始支持@supports规则。CSS.supports()和@supports看起来非常相似,它们之间有什么关联,它们的前世今生究竟是怎么一回事呢?
为了应付浏览器分裂的CSS3支持情况、支持渐进增强式设计,我们之前经常采用[Modernizr](http://modernizr.com/)这个库来判断浏览器对于HTML5、CSS3的支持情况,以便有针对性的设计网站界面和功能。
也许很快我们不再需要[Modernizr](http://modernizr.com/),因为浏览器本身将会告诉我们这些信息。
**@supports的源起**
@supports其实来源于W3C的这份工作草案:《[CSS Conditional Rules Module Level 3](http://www.w3.org/TR/css3-conditional/#at-supports)》,即CSS的条件规则模块:允许我们在不同条件下来定义CSS样式。众所周知,CSS2.1支持@media条件规则,可以根据不同的媒介来加载不同的样式表,这个功能虽然出发点很好,但是使用起来并不方便,因为开发者需要写多个样式表来对应不同的媒介,非常麻烦。这份新的规范扩展了@media规则,允许在一个CSS样式文件里根据不同的媒介来定义样式。同时此规范增加了另外一个群众呼声很高的条件规则,即@supports。在浏览器CSS新特性越来越常见、更新越来越迅速,网站功能越来越前卫的今天,它允许我们可以根据浏览器对CSS特性的支持情况来定义不同的样式。这对我们来说非常重要。
W3C网站上的官方代码示例如下:
~~~
@supports ( display: flexbox ) {
body, #navigation, #content { display: flexbox; }
#navigation { background: blue; color: white; }
#article { background: white; color: black; }
}
~~~
上面的规则表示,当浏览器支持弹性盒子布局时,括号里的所有样式将会生效。而且@supports还支持简单的逻辑操作符,例如“not”,“and”、“or”等。例如,一个可能的规则如下(请注意我们是如何来为各浏览器提供兼容的):
~~~
@supports ( box-shadow: 2px 2px 2px black ) or
( -moz-box-shadow: 2px 2px 2px black ) or
( -webkit-box-shadow: 2px 2px 2px black ) or
( -o-box-shadow: 2px 2px 2px black ) {
.outline {
color: white;
-moz-box-shadow: 2px 2px 2px black;
-webkit-box-shadow: 2px 2px 2px black;
-o-box-shadow: 2px 2px 2px black;
box-shadow: 2px 2px 2px black; /* unprefixed last */
}
}
~~~
这篇规范里还提到了一个DOM API,即CSS.supports(),它是作为@supports的另一种形式出现的,供JavaScript调用来获得CSS属性的支持情况。顺便提一句,window.CSS这个命名空间将会包含多个CSS相关的常用方法(可以想想作为开发者来说,你需要哪些方法?)。
它的定义如下,我们可以传入CSS属性的key和value或者一串字符来得到结果。
~~~
interface CSS {
static boolean supports(DOMString property, DOMString value);
static boolean supports(DOMString conditionText);
}
~~~
**浏览器支持情况**
规范总是要落地的,我们来看看浏览器的支持情况。
Chrome已经在2月份最新的27版本里提供了对CSS.supports()的支持,详见[这里](https://bugs.webkit.org/show_bug.cgi?id=100324)。
Firefox在去年8月份[支持了@supports](http://mcc.id.au/blog/2012/08/supports),在12月份[支持了CSS.supports](http://mcc.id.au/blog/2012/12/css-supports-api%20CSS.support)()。对照W3C标准,在Firefox的示例里,CSS.supports()的调用方式有如下两种:
~~~
// 方法1
if (CSS.supports("display", "flex")) {
// do something relying on flexbox
}
// 方法2
if (CSS.supports("(display: flex) and (display: grid)")) {
// do something relying on flexbox and grid layout
}
~~~
而Opera在去年11月就[添加了对@supports的支持](http://dev.opera.com/articles/view/native-css-feature-detection-via-the-supports-rule/),顺带还提供了一个3D Transform的渐进增强式演示供大家体验。[这里](http://dev.opera.com/static/articles/2012/supports/example-with-supports/two-faced-cheek-supports.html)是使用@supports的方案,而[这里](http://dev.opera.com/static/articles/2012/supports/example-with-modernizr/two-faced-cheek-modernizr.html)是使用[Modernizr](http://modernizr.com/)的方案,感兴趣的朋友可以尝试对比一下。
![](https://box.kancloud.cn/2016-08-09_57a9aa58c6dcd.jpg)
Opera提供的@supports演示
主流浏览器已经或者正在支持@supports,这对我们来说是好消息。
**使用@supports的好处**
我们为什么要用@supports,它比起[Modernizr](http://modernizr.com/)来说有什么优势呢?**
1、 速度
@supports采用浏览器本地方法实现、速度更快、效率更高。
2、效率
避免引入JavaScript库,让开发更简单快捷;另外因为不需要加载JavaScript库,能减少HTTP请求量和服务器流量。
3、 功能
@supports支持多种逻辑操作符,可以很好的满足各种需求。
**方案的选择**
那我们该何时使用[Modernizr](http://modernizr.com/)呢?
1、 浏览器不支持CSS.supports()和@supports时;
2、 需要用它来判断HTML5的支持情况时(其实你也可以自己手写这部分代码)。
**@suppprts in Action**
实际上,[Modernizr](http://modernizr.com/)自身也在计划未来使用@supports来[替代自身的检测方法](http://www.broken-links.com/2012/08/06/firefox-supports-supports-gets-my-support/#comment-72122)。
所以,现在你就应该立即使用@supports,正确的步骤是先检测是否支持CSS.supports()和@supports,如果不支持,再加载[Modernizr](http://modernizr.com/),这样你的网站从始至终会有一个很好的兼容性。下面是实现代码:
~~~
if ( !(window.supportsCSS || (window.CSS && window.CSS.supports) )) load_modernizr();
~~~
我预计@supports将会在网站中得到广泛的使用,@supports in Action now!
原创文章,转载请注明来自[蒋宇捷的博客](http://blog.csdn.net/hfahe)(http://blog.csdn.net/hfahe)
参考文章:
《[CSS Conditional Rules Module Level 3](http://www.w3.org/TR/css3-conditional/#at-supports)》
《[why use supports instead of modernizr](http://my.opera.com/ODIN/blog/why-use-supports-instead-of-modernizr)》
《[Use Tomorrow's Web Standards Today WithCSS '@Supports'](http://www.webmonkey.com/2012/11/use-tomorrows-web-standards-today-with-css-supports/)》
- 前言
- AutoPager的简单实现
- 利用CSS3特性巧妙实现漂亮的DIV箭头
- IE9在Win7下任务栏新特性简介
- 浏览器九宫格的简单实现
- Raphael js库简介
- 使用CSS3构建Ajax加载动画
- 用CSS3创建动画价格表
- 用CSS3实现浏览器的缩放功能
- 用纯CSS3实现QQ LOGO
- 用CSS3创建旋转载入器
- 使用Javascript开发移动应用程序
- 用HTML5创建超酷图像灰度渐变效果
- 使用CSS3创建文字颜色渐变(CSS3 Text Gradient)
- 仅用CSS创建立体旋转幻灯片
- 如何创建跨浏览器的HTML5表单
- 用CSS3实现动画进度条
- HTML5 Guitar Tab Player
- 奇妙的HTML5 Canvas动画实例
- 谈HTML5和CSS3的国际化支持
- 实现跨浏览器的HTML5占位符
- 前端开发必备工具:WhatFont Bookmarklet-方便的查询网页上的字体
- 使用HTML5和CSS3来创建幻灯片
- HTML5之美
- 如何使用HTML5创建在线精美简历
- 以小见大、由浅入深-谈如何面试Javascript工程师
- 快速入门:HTML5强大的Details元素
- 用CSS3实现图像风格
- HTML5视频字幕与WebVTT
- 用纯CSS3实现Path华丽动画
- 用3个步骤实现响应式网页设计
- 遇见CSS3滤镜
- 关于CSS3滤镜的碎念
- 用纯CSS3绘制萌系漫画人物动态头像
- CSS3新的鼠标样式介绍
- 用HTML5献上爱的3D玫瑰
- 对HTML5 Device API相关规范的解惑
- 如何使用HTML5实现拍照上传应用
- 2012第一季度国外HTML5移动开发趋势
- HTML5新特性:范围样式
- 百度开发者大会-《用HTML5新特性开发移动App》PPT分享
- Chrome 19对于HTML5最新支持的动态:电池状态API,全屏API,震动API,语音API
- 遇见Javascript类型数组(Typed Array)
- 用HTML5 Audio API开发游戏音乐
- 用HTML5实现人脸识别
- 用Javascript实现人脸美容
- Chrome 20对于HTML5最新支持的动态:颜色输入,网络信息API,CSS着色器
- 用HTML5实现手机摇一摇的功能
- 用HTML5实现iPad应用无限平滑滚动
- 用非响应式设计构建跨端Web App
- 了解SVG
- HTML5图像适配介绍
- HTML5安全:内容安全策略(CSP)简介
- HTML5安全:CORS(跨域资源共享)简介
- 用CSS3 Region和3D变换实现书籍翻页效果
- 谈谈移动App的思维误区
- Chrome新特性:文件夹拖拽支持
- 《关注HTML5安全》
- HTML5安全风险详析之一:CORS攻击
- HTML5安全风险详析之二:Web Storage攻击
- HTML5图像适配最新进展:响应式图片规范草案
- HTML5移动Web App相关标准状态及路线图
- HTML5安全风险详析之三:WebSQL攻击
- Chrome引入WebRTC支持视频聊天App
- HTML5安全风险详析之四:Web Worker攻击
- HTML5安全风险详析之五:劫持攻击
- HTML5安全风险详析之六:API攻击
- HTML5安全攻防详析之七:新标签攻击
- 在iOS Safari中播放离线音频
- 使用WebRTC实现远程屏幕共享
- Firefox、Android、iOS遇见WebRTC
- HTML5光线传感器简介
- HTML5安全攻防详析之八:Web Socket攻击
- HTML5安全攻防详析之完结篇:HTML5对安全的改进
- 激动人心!在网页上通过语音输入文字 - HTML5 Web Speech API介绍
- Web滚动性能优化实战
- 用CSS3设计响应式导航菜单
- 用HTML5构建高性能视差网站
- 漫谈@supports与CSS3条件规则
- HTML5下载属性简介
- 如何开发优秀的HTML5游戏?-迪斯尼《寻找奥兹之路》游戏技术详解(一)
- 如何开发优秀的HTML5游戏?-迪斯尼《寻找奥兹之路》游戏技术详解(二)
- 趋势:Chrome为打包应用提供强大新特性
- 从HTML5移动应用现状谈发展趋势
- 基于HTML5的Web跨设备超声波通信方案