用PIE.htc使IE支持CSS3熟悉

最近发现国外的网站做的都不错,特别是文字阴影、发光、渐变等效果。
为什么最近才发现呢?因为最近用非IE浏览器较多,呵呵~~
本文要展示的这个方法名为PIE,PIE有“工艺整合工程师或者制程整合工程师”的意思(Process Integration Engineer)
这里PIE实际上是指的是一个名为pie的htc文件,即pie.htc,使用CSS的behavior行为,可以调用此文件,然后让IE也能实现一些常见的CSS3效果,如圆角(border-radius),盒阴影(box-shadow),背景渐变(gradient),多图片背景(multiple background images)。
效果预览、综合demo以及源文件下载
您可以狠狠地点击这里:[url=http://www.zhangxinxu.com/study/201007/pie-ie-css3-demo.html]控制面板综合demo[/url]
下为IE7浏览器下该面板及效果截图,您可以修改上面的参数以动态查看效果:

例如,修改渐变的起始颜色为红色,结果如下图所示:

下载
该项目详尽原始的下载资源在这里:[url=http://github.com/lojjic/PIE/downloads]http://github.com/lojjic/PIE/downloads[/url]
三、PIE支持的主要CSS3属性详解
PIE方法的使用与平时我们使用CSS3属性一样,基本上没有什么特殊的样式名称,只要链接pie.htc文件即可。
1. border-radius圆角
关于CSS3 border-radius的基本属性,您可以参见[url=http://www.zhangxinxu.com/css3/css3-border-radius.php]这里[/url]。
CSS代码如下:
.pie_radius{ width:360px; height:200px; background-color:#34538b; -moz-border-radius:8px; -webkit-border-radius:8px; border-radius:8px; position:relative; behavior:url(pie.htc); }
相应的html代码如下:
结果在IE6浏览器下的效果如下截图:

您可以狠狠地点击这里:[url=http://www.zhangxinxu.com/study/201007/pie-ie-css3-radius-test.html]PIE使IE实现CSS3圆角demo[/url]
2. box-shadow 盒阴影
关于CSS3 box-shadow 盒阴影的基本属性,您可以参见[url=http://www.zhangxinxu.com/css3/css3-box-shadow.php]这里[/url]。
CSS代码如下:
.pie_box_shadow{ width:360px; height:200px; background-color:#34538b; -moz-box-shadow:1px 3px 3px #666; -webkit-box-shadow:1px 3px 3px #666; box-shadow:1px 3px 3px #666; position:relative; behavior:url(pie.htc); }
相应的HTML代码如下:
结果在IE7浏览器下的效果如下:

您可以狠狠地点击这里:[url=http://www.zhangxinxu.com/study/201007/pie-ie-css3-box-shadow-test.html]PIE使IE实现CSS3盒阴影效果demo[/url]
3. gradient渐变
关于CSS3的渐变属性,我在“[url=http://www.zhangxinxu.com/wordpress/?p=727]CSS渐变之CSS3 gradient在Firefox3.6下的使用 [/url]”、“[url=http://www.zhangxinxu.com/wordpress/?p=734]CSS gradient渐变之webkit核心浏览器下的使用 [/url]”、“[url=http://www.zhangxinxu.com/wordpress/?p=743]CSS实现兼容性的渐变背景(gradient)效果[/url]”中做了相当详细的介绍,您有兴趣可以去看看。
如果使用PIE实现IE饿渐变背景,该如何呢?需要用到一个自定义的CSS属性,-pie-background,后面的写法与火狐浏览器类似。CSS部分代码如下:
.pie_gradient{ width:360px; height:200px; background-color:#9F9; background:-webkit-gradient(linear, 0 0, 0 bottom, from(#9F9), to(#393)); background:-moz-linear-gradient(#9F9, #393); -pie-background:linear-gradient(#9F9, #393); position:relative; behavior:url(pie.htc); }
相应的html代码如下:
结果如下图(截自IE8浏览器):

您可以狠狠地点击这里:[url=http://www.zhangxinxu.com/study/201007/pie-ie-css3-gradient-test.html]PIE使IE实现CSS3渐变背景色效果demo[/url]
4. multiple background images多背景
此CSS3属性接触较少,尚未详细研究过,此处略!
四、已知的一些问题
此方法并不是万能的,也有一些局限性和需要注意的地方。
1. z-index相关问题
IE下这些CSS3效果实现是借助于VML,由VML绘制圆角或是投影效果的容器元素,然后这个容器元素作为目标元素的后兄弟节点插入,如果目标元素position:absolute 或是 position:relative,则这个css3-container元素将会设置与之一样的z-index值,在DOM tree中,同级的元素总是后面的覆盖前面的,所以这样就实现了覆盖,又避免了可能有其他元素正好插入其中。
所以,问题来了,如果目前元素的position属性为static,也就是默认属性,则z-index属性是没有用的,无覆盖可言,所以此时IE浏览器下CSS3的渲染是不会成功的。要解决也很简单,设置目标元素position:relative或是设置祖先元素position:relative并赋予一个z-index值(不可为-1)
2. 相当路径的问题
IE浏览器的behavior 属性是相对于HTML文档而言的,与CSS其他的属性不一样,不是相对于CSS文档而言的。这使得使用pie.htc文件不怎么方面。如果绝对路径于根目录,则CSS文件不方便移动;如果相对路径与HTML文档,则pie.htc文件在不同HTML页面见的重用性大大降低。同时,诸如border-image后面的URL属性路径也不好处理。
3. 缩写的问题
使用PIE实现IE下的CSS3渲染(其他方法也是一样),只能使用缩写的形式,例如圆角效果,我们可以设置[font=NSimsun]border-top-left-radius[/font]表示左上圆角,但是PIE确实不支持这种写法的,只能是老老实实的缩写。
4. 提供正确的Content-Type
要想让IE浏览器支持htc文件,需要一个有着”text/x-component” 字样的content-type 头部,否则,会忽视behavior。绝大数web服务器提供了正确的content-type,但是还有一部分则有问题。例如的我的空间域名商就没有”text/x-component” 字样的content-type,可能是出于安全的考虑。
如果您发现在您的机子上PIE方法无效,也就是htc文件这里指pie.htc文件无效,检查您的服务器配置,可能其需要更新到最新的content-type。例如对于Apache,您可以在.htaccess文件中左如下处理:
AddType text/x-component .htc
但是,由于某种原因,您无法修改服务器配置(例如公用主机,或是空间服务商提供的服务器),您可以用一个PHP文件来间接调用htc文件。我只要给你看下这个PHP文件的代码您就知道什么意思了,如下:
通过PHP文件来增加一个含有“text/x-component”字样的Content-type头,同时调用pie.htc文件。
关于上面所示的php文件,您可以狠狠地点击这里:[url=http://www.zhangxinxu.com/study/201007/pie.php]pie.php[/url](右键 – [目标|链接另存为]),或者您可以直接新建一个php文件,把上面的两行代码复制进去。或者在本文提供的原始打包资源的wrappers文件夹里面也有此php文件,不过名称是大写的。

如果您使用上述php文件,您需要将pie.php和pie.htc放在同一个文件夹目录下,同时CSS中的behavior写法应该是:
behavior: url(pie.php);
以上为一些常见的主要的问题,当然,在复杂的页面情况下,还会有其他意想不到的情况,这里,我只能祝您好运了!
当然还有一些其他的插件:
1. Dean Edwards的[url=http://code.google.com/p/ie7-js/]IE7.js[/url] (以及 IE8.js, IE9.js)
这个玩意估计是试图让IE支持CSS3属性的鼻祖,还算蛮强大,就是性能开销较大,要解析很多文件脚本,给DOM添加大量的元素以及ClassName。
2. Aaron Gustafson的 [url=http://ecsstender.org/]eCSStender[/url]
此方法支持@font-face, CSS3 选择器, 以及 CSS3 Backgrounds 和 Borders。
3. Drew Diller的 [url=http://www.dillerdesign.com/experiment/DD_roundies/]DD_roundies[/url]
这是一个基于IE VML实现一些CSS3效果的。
4. Remiz Rahnas的[url=http://code.google.com/p/curved-corner/]border-radius.htc[/url]
此方法使用htc文件,配合VML实现,缺点在于不能自动适应目标元素的位置和大小,所以不能适用于动态脚本环境。
5. Nick Fetchak的 [url=http://www.fetchak.com/ie-css3/]ie-css3.htc[/url]
关于此方法,我在前面的“[url=http://www.zhangxinxu.com/wordpress/?p=783]让IE6/IE7/IE8浏览器支持CSS3属性[/url]”这篇文章中已经做过介绍。我是建议您看看这篇文章,倒不是ie-css3.htc这个玩意多么好,而是文中对htc文件以及VML预言做了些介绍,对于您了解IE下实现类似CSS3效果原理有所了解。
6. Keith Clark的[url=http://www.keithclark.co.uk/labs/ie-css3/]ie-css3.js[/url]
这是个与[url=http://code.google.com/p/ie7-js/]IE7.js[/url]类似的项目,其选择器可借助其他Javascript库,所以其本身较小。
7. zoltandulac的[url=http://www.useragentman.com/blog/csssandpaper-a-css3-javascript-library/]cssSandpaper[/url]
关于此方法,我在“[url=http://www.zhangxinxu.com/wordpress/?p=818]cssSandpaper-兼容IE的CSS3 Javascript库[/url]”一文中有过介绍,这是一个使用IE滤镜实现一些CSS3属性的方法。这里就不再具体展开了。

未经允许不得转载:Windy's Blog » 用PIE.htc使IE支持CSS3熟悉

赞 (0)