职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 596|回复: 12

如何在ie6下面设计出圆角,全兼容的

  [复制链接]
ksdal 发表于 2011-7-20 09:05 | 显示全部楼层 |阅读模式
  
妈的,看看人家css3多么简单,一个css命令就够了,但是呢,你还得考虑那个万恶的ie6,谁让我的网站是面对的农民伯伯,估计用的都是ie6.

首先我针对类似于这样的圆角。如下:


先是做 235px长 1px像素高的图片(content_bar.png),然后平铺y方向(这里的容器高位35px),当然平铺之后是长方形的。
接着做两个图片,长和宽都是35px,大部分是透明图片,只有左边的有一部分圆弧外面的是白色,我这里为了让大家看得清楚,把图片反色了,里面的黑色其实在网页上是白色。聪明的读者肯定知道了,另外一张图片肯定就是与之水平翻转的图片了。正好是标题的左右角。
   (blocktitle_left_corner.png)

接下来,我是这样写的html。


Html代码  
<div class="xo-block">  
<div class="xo-blocktitle">         
  
<div class="xo-blocktitle-mask-left"></div>  
<div class="xo-blocktitle-mask-right"></div>  
  
<h3>网站公告</h3></div>  
...............   
</div>  

<div class="xo-block">
<div class="xo-blocktitle">      

<div class="xo-blocktitle-mask-left"></div>
<div class="xo-blocktitle-mask-right"></div>

<h3>网站公告</h3></div>
...............
</div>

css这样写

Html代码  
.xo-block .xo-blocktitle-mask-left {   
    height: 35px;   
    width: 35px;   
    float: left;   
    background-image: url("../img/blocktitle_left_corner.png");   
  
}   
  
.xo-block .xo-blocktitle-mask-right {   
    height: 35px;   
    width: 35px;   
    float: right;   
    background-image: url("../img/blocktitle_right_corner.png");   
  
}   
  
.xo-blocktitle {   
    height: 35px;   
    background: url("../img/content_bar.png") repeat-y;   
  
}   
  
.xo-blocktitle h3 {   
    line-height: 35px;   
    color: #000099;   
    text-transform: uppercase;   
    letter-spacing: 3px;   
    font-size: 18px;   
    padding-left: 30px;   
    text-indent: -1000px;   
}  

.xo-block .xo-blocktitle-mask-left {
    height: 35px;
    width: 35px;
    float: left;
    background-image: url("../img/blocktitle_left_corner.png");

}

.xo-block .xo-blocktitle-mask-right {
    height: 35px;
    width: 35px;
    float: right;
    background-image: url("../img/blocktitle_right_corner.png");

}

.xo-blocktitle {
    height: 35px;
    background: url("../img/content_bar.png") repeat-y;

}

.xo-blocktitle h3 {
    line-height: 35px;
    color: #000099;
    text-transform: uppercase;
    letter-spacing: 3px;
    font-size: 18px;
    padding-left: 30px;
    text-indent: -1000px;
}

我们知道在标准的浮动模型里面,可以知道h3会无视.xo-blocktitle-mask-left和.xo-blocktitle-mask-right,而处于那左右角的背后去,所以文字还是在那一行显示。只要高度设的对就是这样的效果,而浮动的特性就是dom脱离文档流,因此两个角肯定是在正常文档流的上方,blocktitle_left_corner.png中的白色就会遮掩住.xo-blocktitle的背景的两角,形成圆角的效果。
这里在ff下是完美了。但是,在ie6下还是有不止一个问题。

首先在ie6下,不支持透明图片,于是在网上下了一个ie6pngfix的插件(本页面提供下载),把它放在网站目录下某个地方,添加代码
Html代码  
<script type="text/javascript" src="<{$xoops_url}>/include/me/iepngfix/iepngfix_titlebg.js">  
</script>  
  
还有在css里添加。   
  
.xo-blocktitle-mask-left, .xo-blocktitle-mask-right  {   
    behavior: url(/shbank/include/me/iepngfix/iepngfix.htc);   
}  

<script type="text/javascript" src="<{$xoops_url}>/include/me/iepngfix/iepngfix_titlebg.js">
</script>

还有在css里添加。

.xo-blocktitle-mask-left, .xo-blocktitle-mask-right  {
    behavior: url(/shbank/include/me/iepngfix/iepngfix.htc);
}  
这里的路径是从apache的根目录开始的。这里貌似不能写相对路径啊啥的,一定要绝对的。我写了相对的没效果。为什么呢,貌似behavior的属性比较特殊,其路径相对的不是当前css文件,而是加载该css文件的页面,那我们也不知道我们到底加载的哪个页面,就写绝对路径了。如果要换目录这里也要改的。

如果这个时候你打开ie6,会发现根本看不到透明图片,这是因为在ie6下,其浮动模型是不一样的。那个h3不会无视那两个角,结果就出现在了两个角的下方,所以你没看到效果。这个时候,再修改以前的css

Html代码  
.xo-block .xo-blocktitle-mask-left {   
    height: 35px;   
    width: 35px;   
    float: left;   
    background-image: url("../img/blocktitle_left_corner.png");   
    _position: absolute; /*css mhack*/   
    _top: 0px;   
    _left: 0px;   
}   
  
.xo-block .xo-blocktitle-mask-right {   
    height: 35px;   
    width: 35px;   
    float: right;   
    background-image: url("../img/blocktitle_right_corner.png");   
    _position: absolute;   
    _top: 0px;   
    _right: 0px;   
}   
  
.xo-blocktitle {   
    _position: relative;   
    height: 35px;   
    background: url("../img/content_bar.png") repeat-y;   
    _overflow: hidden; /*ie6*/   
    _width: 100%; /*ie6,否则会被background img撑大*/   
}   
  
.xo-blocktitle h3 {   
    line-height: 35px;   
    color: #000099;   
    text-transform: uppercase;   
    letter-spacing: 3px;   
    font-size: 18px;   
    padding-left: 30px;   
    text-indent: -1000px;   
}  

.xo-block .xo-blocktitle-mask-left {
    height: 35px;
    width: 35px;
    float: left;
    background-image: url("../img/blocktitle_left_corner.png");
    _position: absolute; /*css mhack*/
    _top: 0px;
    _left: 0px;
}

.xo-block .xo-blocktitle-mask-right {
    height: 35px;
    width: 35px;
    float: right;
    background-image: url("../img/blocktitle_right_corner.png");
    _position: absolute;
    _top: 0px;
    _right: 0px;
}

.xo-blocktitle {
    _position: relative;
    height: 35px;
    background: url("../img/content_bar.png") repeat-y;
    _overflow: hidden; /*ie6*/
    _width: 100%; /*ie6,否则会被background img撑大*/
}

.xo-blocktitle h3 {
    line-height: 35px;
    color: #000099;
    text-transform: uppercase;
    letter-spacing: 3px;
    font-size: 18px;
    padding-left: 30px;
    text-indent: -1000px;
}

看到了吗?者利用了css hack的技巧。那些css属性名前加_的就是css hack,只写给ie6看的。你看到.xo-blocktitle的position为relative,那么其子元素如果绝对定位的话,其left和top就会针对.xo-blocktitle的。这样让两个角绝对定位就达到了h3无视那两个角的目的。注意.xo-blocktitle里面的两个css hack,这个是为什么呢?因为我们之前设置了一个behavior属性,那个属性会暗地里把我们的h3的width改成260px,好像是100%的长度。接着那个h3有一个属性是padding-left:30px那么按照css盒模型,其占用的宽度就相当于是290px。然后在ie6下父元素被子元素给撑开了,所以.xo-blocktitle就被撑开到了290px,导致了样式错误。解决方案是不要让.xo-blocktitle被撑开,就需要用设定宽度再overfllow:hidden的方式,这样,子元素撑开的部分就被切掉了。而且因为.xo-blocktitle设置了宽度,所以.xo-blocktitle-mask-right也能正确定位的。

当然这只是其中一种解决方案,还有一个办法也可以奏效,而且可能更加简单

那就是不要做那两个角了,直接连带做一个带圆角的背景标题图片,还不要是透明的,把圆弧做好后,再把原来的背景的图案相对应的做在圆弧的外面,根本就不要什么处理了,直接拉上去就好。这种情况更适用于背景比较复杂或有明显渐变而不是纯色的情况,这类情况第一种方法是无法处理的。其实,现在想想,拿这一种方法其实更好,简单啊,而且不会产生多余的html,我真傻怎么当初没用这一种呢?不过,用第一种还是学到了不少东西的,尤其是ie6和ff的区别,看来走弯路也不见得是坏事啊!




iepngfix.zip (40.4 KB)
下载次数: 152

曾经的小孩 发表于 2011-7-20 09:05 | 显示全部楼层
使用css3pie可以更快,更easy的实现全兼容圆角。

爱车车 发表于 2011-7-20 09:05 | 显示全部楼层
楼主我忍不住了,你声明的是xhtml在ie6下就是标准框模型。。。

所以其他人没乱说,是你。。。。没懂

ie5有怪异模型和。。。标准的。。。

还有你用gif做就可以透明了,png用滤镜,用你说的那个东西,如果图片太多会变慢的。




江南枫 发表于 2011-7-20 09:05 | 显示全部楼层
呵呵,我也是做了一个简单的实验,没有想到这么多模式,领教了

秋秋 发表于 2011-7-20 09:05 | 显示全部楼层
不好意思,忘记说了,pie css我以前用的是beta2的,存在一个问题,当圆角元素嵌套圆角元素的时候,在IE6下就出现BUG了,不知道beta3现在修正了没有。

爱车车 发表于 2011-7-20 09:06 | 显示全部楼层
你那个图片gif完全够了.......

yoyo 发表于 2011-7-20 09:06 | 显示全部楼层
可以看看 http://www.iteye.com/topic/610962 这个帖子

话说我当年 发表于 2011-7-20 09:06 | 显示全部楼层
这种纯色背景在IE6下换用gif就行了,不需要js

broken 发表于 2011-7-20 09:06 | 显示全部楼层
这东西我7年前就实现了。。。

江南枫 发表于 2011-7-20 09:06 | 显示全部楼层
居然在ie6圆角实现上还这么纠集的人 还责怪人家是农民伯伯,太强大了!


醉倚西风 发表于 2011-7-25 10:31 | 显示全部楼层
朕要午休了..............
只学java 发表于 2011-7-30 10:22 | 显示全部楼层
哈哈~~~相比现在没人在了 吧 哈哈~~~~
只学java 发表于 2011-7-30 10:23 | 显示全部楼层
能告诉我丫挺什么意思吗?赐教
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-29 23:30 , Processed in 0.123107 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表