14th
8
最常用的12种CSS BUG解决方法与技巧
Posted by 可乐 under 网页设计
CSS bug是布局中最头疼的问题。我们需要兼顾各种浏览器,以期待获得一致的效果。非常遗憾的是各厂商之间的竞争导致很多问题的存在。而IE6 与IE7在很多问题上也存在着很大的差别。在52CSS.com大量的技术文档中,也包含了这方面的内容。轻松的解决CSS bug是我们必须掌握的技能。现在整理出最常用的12种CSS BUG解决方法以及CSS BUG类的小技巧。希望对您的学习、工作有所帮助,如果您依然有疑问,欢迎您到 52CSS.com查阅、搜索相关内容。
一、 针对浏览器的选择器
这些选择器在你需要针对某款浏览器进行css设计时将非常有用。
- IE6及其更低版本
- * html {}
- IE7及其更低版本
- *:first-child+html {} * html {}
- 仅针对IE7
- *:first-child+html {}
- IE7和当代浏览器
- html>body{}
- 仅当代浏览器(IE7不适用)
- html>/**/body{}
- Opera9及其更低版本
- html:first-child {}
- Safari
- html[xmlns*=""] body:last-child {}
要使用这些选择器,请将它们放在样式之前. 例如:
- #content-box {
- width: 300px;
- height: 150px;
- }
- * html #content-box {
- width: 250px;
- }
当你想在一个浏览器里改变样式而不像在其他浏览器中改变时,这些选择器很有用。
IE6以下
- *html{}
IE 7 以下
- *:first-child+html {} * html {}
只对IE 7
- *:first-child+html {}
只对IE 7 和现代浏览器
- html>body {}
只对现代浏览器(非IE 7)
- html>/**/body {}
最新的Opera 9以下版本
- html:first-child {}
Safari
- html[xmlns*=”"] body:last-child {}
要使用这些选择器,请在样式前写下这些代码。例如:
- #content-box {
- width: 300px;
- height: 150px;
- }
- * html #content-box {
- width: 250px;
- }
- /* 重写上面的代码并且把宽度改为250PX
- 在IE6以下版本中适用。 */
二、让IE6支持PNG透明
一个IE6的Bug引起了大麻烦, 他不支持透明的PNG图片。
你需要使用一个css滤镜
- *html #image-style {
- background-image: none;
- filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="fil
- ename.png", sizingMethod="scale");
- }
三、移除超链接的虚线
FireFox下,当你点击一个超链接时会在外围出现一个虚线轮廓. 这很容易解决, 只需要在标签样式中加入:
- outline:none.
- a{
- outline: none;
- }
四、给行内元素定义宽度
如果你给一个行内元素定义宽度,那么它只是在IE6下有效. 所有的HTML元素要么是行内元素要么就好是块元素. 行内元素包括:< span>, < a>, < strong> 和 < em>. 块元素包括< div>, < p>, < h1>, < form>和< li> . 你不能定义行内元素的宽度, 为了解决这个问题你可以将行内元素转变为块元素。
span { width: 150px; display: block }
五、让固定宽度的页面居中
为了让页面在浏览器居中显示, 需要相对定位外层div, 然后把margin设置为auto.
- #wrapper {
- margin: auto;
- position: relative;
- }
六、IE6双倍边距的bug
给此对象加上display:inline即可解决问题。
IE6.0环境中双倍边距BUG。先看下面的CSS代码。
- div {
- float:left;
- margin-left:10px;
- width:420px;
- height:150px;
- border:1px solid red
- }
这样设置以后。本来左边距设置为10px,但IE6.0解释为20px,这是一个比较头疼的问题。但解决也非常简单。办法就是是加上display:inline。就搞定了。看下面的示例对比!
双陪边距的效果:
- < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>52css.com</title>
- <style type="text/css">
- body {
- margin:0
- }
- div {
- float:left;
- margin-left:10px;
- width:420px;
- height:150px;
- border:1px solid red
- }
- </style>
- </head>
- <body>
- <div>
- Div+CSS XHTML XML 教程大全 - 52css.com<br />Div+CSS XHTML XML 教程大全 <br />Div+CSS XHTML XML 教程大全 <br />Div+CSS XHTML XML 教程大全 <br />Div+CSS XHTML XML 教程大全 <br />Div+CSS XHTML XML 教程大全 <br />Div+CSS XHTML XML 教程大全 <br /></div></body></html>
解决BUG以后的效果:
- < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>52css.com</title>
- <style type="text/css">
- body {
- margin:0
- }
- div {
- float:left;
- margin-left:10px;
- display:inline;
- width:420px;
- height:150px;
- border:1px solid red
- }
- </style>
- </head>
- <body>
- <div>
- Div+CSS XHTML XML 教程大全 - 52css.com<br />Div+CSS XHTML XML 教程大全 <br />Div+CSS XHTML XML 教程大全 <br />Div+CSS XHTML XML 教程大全 <br />Div+CSS XHTML XML 教程大全 <br />Div+CSS XHTML XML 教程大全 <br />Div+CSS XHTML XML 教程大全 <br />
- </div>
- </body>
- </html>
七、Box Model 盒模型bug的一般解决办法
我们定义一个最基本的层boxtest:
- #boxtest{
- border:20px solid #60A179;
- padding: 30px;
- background : #ffc;
- width : 400px;
- }
标准情况下,这个盒的宽度是:20+30+300+30+20=400px。
但是在IE5.0浏览器中,对盒模型的宽度解释有个bug,它认为300 px是整个盒的总宽度,内容的宽度变成:300-20-30-20-30=200px。
为了弥补这个bug,采用一个技巧:即增加一个IE5不能解释的声音属性”voice-family”,读到这个定义时浏览器就不再继续阅读,认为宽就是400px,但而其他符合标准的浏览器会继续阅读,并执行第二个真实值300px。
- #boxtest{
- border:20px solid #60A179;;
- padding:30px;
- background: #ffc;
- width :400px;
- voice-family : "\"}\"";
- voice-family :inherit;
- width : 300px;
- }
同样,在Opera7.0以前的浏览器也有这样的解析bug。但我们并不需要使用伪值,有更简单的办法解决这个问题: html>body .content { width :300; }
八、两个层之间的3px间隙
这个问题普遍的困扰着新手朋友,不知道如何是好,想不出办法进行解决。其实这就是传说中的“IE 3px bug”。解决的办法也比较简单。请看下面的示例说明。
IE中两个层之间的间隙(IE 3px bug)
- < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>52css.com</title>
- <style type="text/css">
- <!--
- #left {
- float:left;
- width:200px;
- height:100px;
- background:#f00;
- }
- #right {
- width:200px;
- height:100px;
- background:#fc0;
- }
- -->
- </style>
- </head>
- <body>
- <div id="left">52css.com</div>
- <div id="right">52css.com</div>
- </body>
- </html>
解决3px bug的方法之浮动法float
此例中,我们给右边的层,应用float:left;浮动,即可解决IE 3px bug。
- < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>52css.com</title>
- <style type="text/css">
- <!--
- #left {
- float:left;
- width:200px;
- height:100px;
- background:#f00;
- }
- #right {
- float:left;
- width:200px;
- height:100px;
- background:#fc0;
- }
- -->
- </style>
- </head>
- <body>
- <div id="left">52css.com</div>
- <div id="right">52css.com</div>
- </body>
- </html>
解决3px bug的方法之障眼法
此例中,我们给左边的层,应用margin-right:-3px;,同样可解决IE 3px bug。
- < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>52css.com</title>
- <style type="text/css">
- <!--
- #left {
- float:left;
- width:200px;
- height:100px;
- margin-right:-3px;
- background:#f00;
- }
- #right {
- width:200px;
- height:100px;
- background:#fc0;
- }
- -->
- </style>
- </head>
- <body>
- <div id="left">52css.com</div>
- <div id="right">52css.com</div>
- </body>
- </html>
九、在IE中的HTML注释引起文字奇怪的复制
当多个浮动的元素彼此跟随,中间加注释的时候,最后一个浮动元素内的文本偶尔会复制到最下面去。学名Duplicate Characters Bug
- < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="//www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
- <title>多了一只猪</title>
- </head>
- <body>
- <div style="width:400px">
- <div style="float:left"></div>
- <!-- -->
- <div style="float:right;width:400px">↓这就是多出来的那只猪</div>
- </div>
- </body>
- </html>
可以通过以下的办法来解决:
1、不放置注释。最简单、最快捷的解决方法
2、注释不要放置于2个浮动的区块之间。
3、将文字区块包含在新的
之间,如:
- <div style="float:right;width:400px"><div>↓这就是多出来的那只猪</div></div>
4、去除文字区块的固定宽度,与3有相似之处。
5、有的人在猪后加一个
或者空格,但只是消除现象。
6、不要给浮动元素设置多宽度,使其不会到达包含元素的底部,或者对最后一个元素设置margin-right: -3px;或者更小。
7、注释可以这样写:
- <!--[if !IE]>Put your commentary in here...< ![endif]-->
十、图片替换技术
文字总比用图片做标题好一些. 文字对屏幕阅读机和SEO都是非常友好的.
HTML:
- <h1><span>Main heading one</span></h1>
- CSS:
- h1 { background: url(heading-image.gif) no-repeat; }
- h1 span {
- position:absolute;
- text-indent: -5000px;
- }
你可以看到我们对标题使用了标准的< h1>作为标签并且用css来将文本替换为图片. text-indent属性将文字推到了浏览器左边5000px处, 这样对于浏览者来说就看不见了.
关掉css,然后看看头部会是什么!
十一、 最小宽度
IE6另外一个bug就是它不支持 min-width 属性. min-width又是相当有用的, 特别是对于弹性模板来说, 它们有一个100%的宽度,min-width 可以告诉浏览器何时就不要再压缩宽度了。
除IE6以外所有的浏览器你只需要一个 min-width: Xpx; 例如:
- .container {
- min-width:300px;
- }
为了让他在IE6下工作, 我们需要一些额外的工作. 开始的时候我们需要创建两个div, 一个包含另一个:
- <div class="container">
- <div class="holder">Content</div>
- </div>
然后你需要定义外层div的min-width属性
- .container {
- min-width:300px;
- }
这时该是IE hack大显身手的时候了. 你需要包含如下的代码:
- * html .container {
- border-right: 300px solid #FFF;
- }
- * html .holder {
- display: inline-block;
- position: relative;
- margin-right: -300px;
- }
As the browser window is resized the outer div width reduces to suit until it shrinks to the border width, at which point it will not shrink any further. The holder div follows suit and also stops shrinking. The outer div border width becomes the minimum width of the inner div.
十二、隐藏水平滚动条
为了避免出现水平滚动条, 在body里加入 overflow-x:hidden 。
当你决定使用一个比浏览器窗口大的图片或者flash时, 这个技巧将非常有用。
本文转载自52CSS,原文地址:http://www.52css.com/article.asp?id=809