让IE可以变相支持CSS3选择器


Posted in HTML / CSS onJanuary 21, 2010

别误会,IE是不支持CSS3高级选择器,包括最新的IE8,但是CSS选择器的确是很有用的,它可以大大的简化我们的工作,提高我们的代码效率,并让我们很方便的制作高可维护性的页面。

然而IE对高级CSS选择器特别是CSS3选择器的支持让我们一直不能将CSS选择器推广应用。不过,虽然我们无法左右浏览器的市场份额,却可以通过一些技术改善我们的工作。我们也可以使用其它的一些技术,让IE可以变相支持CSS3选择器。

一位来自英国的网页开发工程师Keith Clark开发了一个JavaScript方案来使IE支持CSS3选择器。该脚本支持从IE5到IE8的各个版本。

用法

你只需要下载Robert Nyman的DOMAssistant脚本和ie-css3.js并将它们在你的页面的head标签中导入,如下:


复制代码
代码如下:

<head>
<script type="text/javascript" src="DOMAssistantCompressed-2.7.4.js"></script>
<script type="text/javascript" src="ie-css3.js"></script>
</head>

支持的选择器

  • :nth-child
  • :nth-last-child
  • :nth-of-type
  • :nth-last-of-type
  • :first-child
  • :last-child
  • :only-child
  • :first-of-type
  • :last-of-type
  • :only-of-type
  • :empty

ie-css3的一些限制

  • 样式表必须通过<link>标签引入。页面级的样式表或者内联的样式表将无效。不过你可以在外部样式文件中使用@import 导入其它样式文件;
  • 样式表文件必须和页面放在同一个域名下面;
  • 使用file://路径的样式文件将由于浏览器的安全问题而不起作用;
  • :not()选择器尚不支持;
  • 该方法不是动态的,样式被应用之后再改变DOM,将会无效。

如何工作的?

ie-css3.js下载页面的每一个样式文件并解析它的CSS3伪选择器。如果一个选择器被找到,它就会被替换为同名的CSS class。比如: div:nth-child(2) 将会变成 div._iecss-nth-child-2 。然后,Robert Nyman的DOMAssistant用于寻找匹配元素CSS3选择器的DOM节点然后将相应的CSS类添加给它。

最终,元素的样式表会被新的版本替代,然后用CSS3选择器对相应元素添加对应的样式。

避免IE的CSS解释器

根据W3C的规定,一个浏览器应该无视它不认识的CSS规则。这就出现一个问题——我们需要利用样式表文件中的CSS3选择器,但是IE会将它们丢弃。

为了避免这个问题,每一个样式文件都会通过XMLHttpRequest下载。这允许该脚本绕开浏览器内置的CSS解释器并能够读取原始的CSS文件。

  • 访问项目主页
  • 下载ie-css3.js
  • 下载DOMAssistant

替代方案

显然这个也并非完美的方案,对于Ajax网站来说,它基本上是不能用的,因为在生成的样式表被应用之后再改变DOM,就不会有效了。但是事实上我们可以自己来自定义一个ie-css3的。只是没有它这个这么智能。

使用 cssQuery

cssQuery是由业界大牛Dean Edwards开发的一个Javascript组件。它就是为CSS 选择器而生的。它可以支持几乎所有的CSS 选择器,包括CSS3选择器。当然它在实现的时候进行了分级,分别针对CSS1,CSS2和CSS3制作了一个独立的js包,以及一个标准包。支持所有A级浏览器。

简单的用法:


复制代码
代码如下:

var tags = cssQuery("body > p");
var tags = cssQuery("[href]");
var tags = cssQuery("a[href='#']");

然后你就可以自己写一些js为相应的对象添加想用的样式了。

我建议对支持CSS高级选择器的浏览器使用原生的CSS选择器写法,然后通过cssQuery在IE中动态的为响应的元素添加一个样式名。

比如,我们可以这样写CSS:

a[herf='#'],a.empty{color:red}

这里的第一条CSS3选择器是用于Firefox/webkit等支持CSS3选择器的非IE浏览器的,a.empty是专门为IE而写。然后通过CSSQuery动态的在IE浏览器中为对应的元素添加样式:


复制代码
代码如下:

var tags = cssQuery("a[href='#']");
tags.className="empty";

当然,上面的这段js最好使用IE的条件注释

使用 jQuery

据说jQuery的选择器比cssQuery要快很多。当然,无可否认,jQuery的选择器是目前流行的js框架中最好用的一个。而使用jquery来实现类似上述功能要方便很多,因为jQuery的选择器更好用。

OK,jQuery的做法和cssQuery有些类似,CSS可以写成上面一样的,JS可以这样写:

$("a[href='#']").addClass("empty");

更具体的用法可以查看我之前写的一个小例子《使用jQuery创建个性化链接样式》

使用 DOMAssistant

DOMAssistant也是一个很不错的JS库,它提供了一些类似jQuery的功能,比如CSS 选择器、事件以及一些DOM操作。它的优点就是小巧,压缩后只有9KB,我想这就是Keith Clark选择DOMAssistant来作为ie-css3.js的基础框架的主要原因吧。jQuery越来越肥胖了,而且用于实现这个功能有些浪费了。而且DOMAssistant的用法和jQuery非常类似。

事实上,DOMAssistant的选择器和对DOM的CSS Class的操作与jQuery一模一样。

$("a[href='#']").addClass("empty");

欲了解更多,可查看DOMAssistant官方,以及下载官方中文PDF文档

总结

其实,无论是ie-css3.js本身,还是后来我们讨论的三种替代方法,都是一种方法,就是用js动态的添加class到页面元素中。不同是ie-css3自动化的完成了这些工作,而后面的三种方案要自己动手根据自己的项目写一些js来实现。我认为ie-css3最方便,基本不用怎么维护,但是它一刀切,效率比较低,而且灵活性差,不适合于ajax项目。而后面的这几种方案灵活性强,但是要做很多额外的工作,无论你是将IE专用样式独立到一个专用的css文件中还是像文中写的那样和CSS3选择器写到一起,都会大大的增加你的工作量和维护成本。

为IE,我们要额外付出很多。

HTML / CSS 相关文章推荐
CSS3 制作绽放的莲花采用效果叠加实现
Jan 31 HTML / CSS
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
Mar 31 HTML / CSS
css3制作彩色边线3d立体按钮的示例(css3按钮)
May 06 HTML / CSS
css3中背景尺寸background-size详解
Sep 02 HTML / CSS
CSS3 真的会替代 SCSS 吗
Mar 09 HTML / CSS
HTML5语音识别标签写法附图
Nov 18 HTML / CSS
HTML5 embed标签定义和用法详解
May 09 HTML / CSS
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
Jan 27 HTML / CSS
深入解析HTML5 Canvas控制图形矩阵变换的方法
Mar 24 HTML / CSS
利用 Canvas实现绘画一个未闭合的带进度条的圆环
Jul 26 HTML / CSS
使用canvas生成含有微信头像的邀请海报没有微信头像问题
Oct 29 HTML / CSS
CSS实现九宫格布局(自适应)的示例代码
Feb 12 HTML / CSS
玩转CSS3色彩
Jan 16 #HTML / CSS
需要知道的CSS3动画技术
Jan 01 #HTML / CSS
CSS3 倾斜的网页图片库实例教程
Nov 14 #HTML / CSS
不同浏览器对CSS3和HTML5的支持状况
Oct 31 #HTML / CSS
检测用户浏览器是否支持CSS3的方法
Aug 29 #HTML / CSS
利用CSS3的定位页面元素
Aug 29 #HTML / CSS
CSS3属性使网站设计增强同时不消弱可用性
Aug 29 #HTML / CSS
You might like
PHP常用代码
2006/11/23 PHP
zf框架的校验器InArray使用示例
2014/03/13 PHP
php采用curl实现伪造IP来源的方法
2014/11/21 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
TNC vs BOOM BO3 第三场2.13
2021/03/10 DOTA
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
2011/10/23 Javascript
Javascript中call的两种用法实例
2013/12/13 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
使用Node.js实现ORM的一种思路详解(图文)
2017/10/24 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
2018/05/30 Javascript
JS加密插件CryptoJS实现AES加密操作示例
2018/08/16 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
Python实现从URL地址提取文件名的方法
2015/05/15 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
2017/12/12 Python
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
详解Python中的文件操作
2021/01/14 Python
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
南非领先的在线旅行社:Travelstart南非
2016/09/04 全球购物
设置器与访问器的定义以及各自特点
2016/01/08 面试题
北大青鸟学生求职信
2013/09/24 职场文书
委托证明的格式
2014/01/10 职场文书
市政管理求职信范文
2014/05/07 职场文书
股票投资建议书
2014/05/19 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
工作简报范文
2015/07/21 职场文书
Python实现简单的俄罗斯方块游戏
2021/09/25 Python
业余无线电通联Q语
2022/02/18 无线电
golang生成并解析JSON
2022/04/14 Golang