IE6,IE7,IE8,Firefox 兼容的css hack以及常见兼容性问题
css
hacks (ie6,ie7,ie8,firefox)
各浏览器CSS hack兼容表:
|
IE6 |
IE7 |
IE8 |
Firefox |
Chrome |
Safari |
!important |
|
Y |
|
Y |
|
|
_ |
Y |
|
|
|
|
|
* |
Y |
Y |
|
|
|
|
*+ |
|
Y |
|
|
|
|
\9 |
Y |
Y |
Y |
|
|
|
\0 |
|
|
Y |
|
|
|
nth-of-type(1) |
|
|
|
|
Y |
Y |
IE6能识别下划线"_"和星号" * ",IE7能识别星号" * ",但不能识别下划线"_",IE8能识别"
\9",但不能识别下划线"_",而firefox两个都不能认识,却可以识别‘!important’。等等
书写顺序,一般是将识别能力强的浏览器的CSS写在后面。下面列举常用的CSS hack方法
1:!important
!important作用是提高指定样式规则的应用优先权。
IE7以及所有标准浏览器能识别!important
区别IE6与IE7与其他浏览器
.browserTest
{
border:20px solid #60A179 !important;
border:20px solid #00F;
}
在Mozilla中或者IE7浏览时候,能够理解!important的优先级,因此显示#60A179的颜色:
在IE6中浏览时候,不能够理解!important的优先级,因此显示#00F的颜色:
2:*
IE都能识别*;标准浏览器(如火狐)不能识别*
区别IE6与火狐
.browserTest
{
border:20px solid #60A179;
*border:20px solid #00F;
}
区别IE7与火狐
.browserTest
{
border:20px solid #60A179;
*border:20px solid #00F;
}
区别IE7,IE6与火狐
.browserTest
{
border:20px solid #60A179;
*border:20px solid #00F !important;
*border:20px solid ###;
}
3:_
IE6支持下划线,IE7和firefox均不支持下划线
区别IE7,IE6与火狐
.browserTest
{
border:20px solid #60A179;
*border:20px solid #00F;
_border:20px solid ###;
}
/*不管是什么方法,书写的顺序都是firefox的写在前面,IE7的写在中间,IE6的写在最后面*/
4:*+html 与 *html
*+html 与 *html 是IE特有的标签, firefox 暂不支持.而*+html 又为 IE7特有标签
.browserTest { 120px; } /* FireFox fixed
*/
*html .browserTest { 80px;} /* ie6 fixed */
*+html .browserTest { 60px;} /* ie7 fixed */
3:\9 专属IE8的Hack
.browserTest { 120px\9; } /* IE8 fixed */
注意:
*+html 对IE7的HACK 必须保证HTML顶部有如下声明:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
/*****************************************************************************/
/*****************************************************************************/
ie6,ie7,ie8 css bug兼容解决记录
1:li边距“无故”增加
任何事情都是有原因的,li边距也不例外。
先描述一下具体状况:有些时候li边距会突然增 加很多,值也不固定(只在IE6/IE7有这种现象),让人摸不着头脑,仔细“研究”发现是由于其低级元素ul的padding引 起,padding的上下值对li有影响,左右无影 响。所以只好笨手笨脚地把padding去掉,换成margin。这是能解决问题,但往往不是我们想要的结果,或许 还会引起其他不必要的怪现象。
现在终于发现解决这个问题的方法,其实很简单,既然是有ul引 起的,就设置ul的显示形式为*display:inline-block;即可,前面加*是只 针对IE6/IE7有效,其他浏览器并不渲染这个属性。
2:分页数字 字体用“Arial ”加粗不抖动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type"content="text/html; charset=gb2312"/>
<title>无标题文档</title>
<link href="css/style.css"rel="stylesheet"type="text/css"/>
<style type="text/css">
body, ul, h1 {
font-family:Arial;
font-size:12px;
}
.page {
text-align:center;
}
.page a {
display:inline-block;
padding:5px 8px;
text-decoration:none;
border:1px solid #09F;
background-color:#0CF;
color:#FFF;
}
.page a:hover, .page .selected {
border:1px solid #CCC;
background-color:#FFF;
color:#000;
font-weight:bold;
}
</style>
</head>
<body>
<h1>分页样式</h1>
<div class="page"> <a href="#">1</a> <a href="#"class="selected">2</a> <a href="#">3</a> <a href="#">4</a> <a href="#">5</a>
<a href="#">6</a> <a href="#">7</a> <a href="#">8</a> <a href="#">9</a> <a href="#">10</a> </div>
</body>
</html>
3:IE6 CSS选择器区分IE6
IE6不支持子选择器;先针对IE6使用常规申明CSS选择器,然后再用子选择器针对IE7+及其他浏览器。
/*IE6 专用 */
.content {color:red;}
/* 其他浏览器 */
div>p .content {color:blue;}
4:IE6最小高度
IE6 不支持min-height属性,但它却认为height就是最小高度。解决方法:
使用ie6不支持但其余浏览器支持的属性!important。
#container{min-height:200px; height:auto !important; height:200px;}
5:IE6100% 高度
在IE6下,如果要给元素定义100%高度,必须要明确定义它的父级元素的高度,如果你需要给元素定义满屏的高度,就得
先给html和body定义height:100%;。
6:IE6躲猫猫bug
在IE6和IE7下,躲猫猫bug是一个非常恼人的问题。一个撑破了容器的浮动元素,如果在他之后有不浮动的内容,并且有一
些定义了:hover的链接,当鼠标移到那些链接上时,在IE6下就会触发躲猫猫。
解决方法很简单:
1.在(那个未浮动的)内容之后添加一个<span style="clear: both;"> </span>
2.触发包含了这些链接的容器的hasLayout,一个简单的方法就是给其定义height:1%;
7:IE6绝对定位元素的1像素间距bug
IE6下的这个错误是由于进位处理误差造成(IE7已修复),当绝对定位元素的父元素高或宽为奇数时,bottom和right会
产生错误。唯一的解决办法就是给父元素定义明确的高宽值,但对于液态布局没有完美的解决方法。
8: IE下z-index的bug
在IE浏览器中,定位元素的z-index层级是相对于各自的父级容器,所以会导致z-index出现错误的表现。解决方法是给
其父级元素定义z-index,有些情况下还需要定义position:relative。
9: Overflow Bug
在IE6/7中,overflow无法正确的隐藏有相对定位position:relative;的子元素。解决方法就是给外包容器.wrap加上
position:relative;。
10: 横向列表宽度bug
如果你使用float:left;把<li>横向摆列,并且<li>内包含的<a>(或其他)触发了 hasLayout,在IE6下就会有错误的
表现。解决方法很简单,只需要给<a>定义同样的float:left;即可。
11: 列表阶梯bug
列表阶梯bug通常会在给<li>的子元素<a>使用float:left;时触发,我们本意是要做一个横向的列表(通常 是导航栏),
但IE却可能呈现出垂直的或者阶梯状。解决办法就是给<li>定义float:left;而非子元素<a>,或者 给<li>定义
display:inline;也可以解决。
12: 垂直列表间隙bug
当我们使用<li> 包含一个块级子元素时,IE6(IE7也有可能)会错误地给每条列表元素(<li>)之间添加空隙。
解决方法:把<a>flaot并且清除float来解决这个问题;另外一个办法就是触发<a>的hasLayout(如定 义高宽、
使用zoom:1;);也可以给<li> 定义display:inline;来解决此问题;另外还有一个极有趣的方法,给包含的文
本末尾添加一个空格。
13: IE6调整窗口大小的 Bug
当把body居中放置,改变IE浏览器大小的时候,任何在body里面的相对定位元素都会固定不动了。解决办法:
给body定义position:relative;就行了。
14: 文本重复Bug
在IE6中,一些隐藏的元素(如注释、display:none;的元素)被包含在一个浮动元素里,就有可能引发文本重复bug。
解决办法:给浮动元素添加display:inline;。
15:链接a的title属性中的文字换行
啥也不说,先上个图
我们都知道,可以给链接a加上title属性,这样鼠标移动上去会显示title属性定义的 文字,常常用来加一些提示语句,
比如说点击查看详情之类的,代码形如:
<a href=”#” title=”点击查看详情”>链接xx</a>
。之前一直没有仔细注意过这个东西。如果鼠标浮动上去要显示更多东西的话,怎么实现呢。第一 反应是jquery的tooltip插件。今天无意中发现某个学院的网站鼠标移动上去可以显示这么完整的信息,效果看起来似乎还可以,就想看看怎么做的, 找了下,没发现有Javascript脚本,再往链接的地方一看,终于让我发现了门道了:
<a href='#' target="_blank" title="标题: 关于对我校2006年至2009年发展党员工作情况进…
发布日期: 2010-5-31 16:05:08
类别:院务通知 点击: 139">
[05-31] 关于对我校2006年至2009年发展党员工作情况进…
</a>
注意到了吗。。很简单,只要使用 这样的转义符号,即可实现换行。在一些tooltip要求定制性不高的情况下,这样的显示效果相 当不错,而且是浏览器原生的效果,安逸。
哎,虽然号称精通div+css,但是发现一些小小但是很实用的技巧自己还不知道,看来html还有很多东西可以挖掘。
16:如何去掉点击链接时的虚线
解决方案1:在<a href="http://blog.sina.com/wangfengteacher"onFocus="this.blur()> Mike blog</a>
解决方案2:在标签中加入 hidefocus<a href="http://blog.sina.com/wangfengteacher"hidefocus> Mike blog</a>
解决方案3: 如果连接太多,可以用外部链接 .HTC 文件。如,blur.htc
文件内容如下:
<public:attach event="onfocus"
onevent="makeblur()"></public:attach>
<SCRIPT language=javascript>
function makeblur(){
this.blur();
}
</SCRIPT>
在 CSS 中加入如下代码:
A { behavior:url(blur.htc); }
解决方案4 ( 推荐 ):使用CSS样式,可加入代码:a {blr:expression_r(this.onFocus=this.blur())}
如果是FF等浏览器的话可这样写 a{ouline:none;}
17:制作1px细线表格
解决方案1 ( 推荐):我们只要给这个table一个border-collapse:collapse的样式,就可以达到这个效果了。
具体如下:
1、HTML结构:
<table width="300" border="1" cellpadding="0"cellspacing="0" bordercolor="#C0C0C0"
style="border-collapse:collapse;">
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
</table>
18:IE6 下z-index无效
在CSS中,通过z-index这个属性改变层级,要让z-index起作用有个前提,就是元素的position属性要 是relative,absolute或是fixed。
z-index层级越高,内容越应该在上面显示。在大部分的浏览器在大部分的情况下,确实如此,但是不绝对,尤其遇到IE6。
1、关于效果截图的些必要说明
下面的不是废话,是为了更容易的理解我下面唾沫横飞的内容。
以下所有结果截图的大背景如下:
1、页面上固定不动的,一成不变的,送豪宅也不会从良的是一个黑色背景,透明度 40%,几乎满屏显示的层级为1的绝对定位层。HTML为:
<div></div>
对应CSS为:#blank{100%; height:600px; background:black; opacity:0.4; filter:alpha(opacity=40); position:absolute; left:0; top:0; z-index:1;}
作用是为了让层级关系一目了然。看:
这说明内容在z-index为1的绝对定位层之下。
这说明内容在z-index为1的绝对定位层之上。
2、页面上做对比的是美女图片,图片在半透明黑色绝对定位层的上面还是下面很容易辨别,这样,您就能够对我所说的z- index不起作用有很直观的认识了。
2、IE6的抱怨:浮动让我沉沦
现在开始真正的讲述 问题的产生,原因以及解决了。首先讲讲第一种z-index无论设置多高都不起作用情况。这种情况发生的条件有三个:1、父标签 position属性为relative;2、问题标签无position属性(不包括static);3、问题标签含有浮动(float)属性。
您 可以拿下面的代码自己做个简单测试:
<div></div>
<div style="position:relative; z-index:9999;">
<img style="float:left;" src="http://image.zhangxinxu.com/image/study/s/s256/mm2.jpg" />
</div>
丫的,这z-index都9999了,层级够高吧,但是,看下面的图:
这一对比就知道问题了,可能有人会疑问,这会不会是IE6的relative自己感冒了,而不是浮动(float)携带 了“甲流病毒”。好,我现在去掉浮动,HTML代码如下:
<div></div>
<div style="position:relative; z-index:9999;">
<img src="http://image.zhangxinxu.com/image/study/s/s256/mm2.jpg" />
</div>
结果IE6下:
我想,问题应该都清楚了,至于原因,我起初以为是haslayout搞的鬼,后来,用zoom一测试,发现不是(IE7 下无此bug也证明不是 haslayout的原因),似乎就是这个float会让z-index失效。由于将外部div的position:relative属性改为 absolute可以解决这一问题,我就怀疑是不是浮动让relative发生了些变化,float与relative在水平定位上可以说是近亲,会不会 是因为这两者搅和在一起所以什么“畸形”“体弱多病”就出现了。这仅是我的猜测而已,真正的原因还是去问IE6的后妈吧。
解决方法,解决方法有三,1、position:relative改 为position:absolute;2、去除浮动;3、浮动 元素添加position属性(如relative,absolute等)。
3、固执的IE6:它只认第一个爸爸
可能不少人知 道,这IE6下,层级的高低不仅要看自己,还要看自己的老爸这个后台是否够硬。用术语具体描述为:
父标签position属性为relative 或absolute时,子标签的absolute属性是相对于父标签而言的。而在IE6下,层级的表现有时候不是看子标签的z-index多高,而要看它 们的父标签的z-index谁高谁低。
有一定经验的人可能都知道上面的事实。但是,相信这里面很多人不知道IE6下,决定层级高低的不是当前的父标签,而是整 个DOM tree(节点树)的第一个relative属性的父标签。有时平时我们多处理一个父标签,z-index层级多而复杂的情况不多见,所以难免会有认识上 的小小偏差。
好,下面展示这个bug。
条件很简单,只要绝对定位的第一个元素的第一个爸爸,或者说是最老的那个爸爸级别的人的relative属性小于黑色半 透明层的z-index层级。例如下面的HTML代码:
<div></div>
<div style="position:relative;">
<div style="position:relative; z-index:1000;">
<div style="position:absolute; z-index:9999;">
<img src="http://image.zhangxinxu.com/image/study/s/s256/mm3.jpg" />
</div>
</div>
</div>
可以看到,mm3图片的父标签div 是绝对定位,层级9999,比1大多了,绝对定位的父标签层级1000(10000也一样),也比黑色半透明层的z-index:1大多了,但是,我们可 怜的IE6童鞋——
再看看以Firefox为代表的其他童鞋:
IE7与IE6有着同样的bug,原因很简单,虽然图片所在div当前的老爸层级很高(1000),但是由于老爸的老爸 不顶用,可怜了9999如此强势的孩子没有出头之日啊!
知道原因解决就很轻松了,给第一任老爸添加z-index后的HTML代 码如下:
<div></div>
<div style="position:relative; z-index:1;">
<div style="position:relative; z-index:1000;">
<div style="position:absolute; z-index:9999;">
<img src="http://image.zhangxinxu.com/image/study/s/s256/mm3.jpg" />
</div>
</div>
</div>
结果IE6童鞋喜笑颜开,春光灿烂:
19:css reset中的list-style:none
在IE6,7下,当UL不具有float:left;display:inline;时:
无论有没有list-style:none这个属性,列 表符都被隐藏,不占位置(下面代码中的5,6)
当UL具有float:left;display:inline;属性时
list- style:none,列表符被隐藏,但是仍然留有位置(list-style-position:inside);
未 设置list-style:none;列表符被隐藏,也不占位(list-style-position:outside)
在firefox中只要list-style-type为none ,则 无论list-stype-position的值为outside或inside , list-style都能很好的被隐藏
而在IE6,7中,仅 设置list-style:none,并不足以解决所有问题
所以我认为在css reset的时候使用 list-style:none outside none 更好
20:链接去边线(完全兼容)
a,a:hover{outline:none; blur:expression(this.onFocus=this.blur());}
21: display:inline-block 额外产生的6PX 或者4px margin
今天在做一个Timeline的模块的时候遇到一个棘手的问题: 给元素添加display:inline-block 属性的时候会产生额外的4px的margin-right。
原始代码
.YP_timelineChart_box li{
display:-moz-inline-stack;
display:inline-block;
zoom:1;
*display:inline;
text-indent:-3000px;
5px;
vertical-align:bottom;
background-color:#00FF00;
position:relative;
}
页面渲染结果:
每一列都会向右产生外边距4px,苦思不得其解,尝试负的外边距,但是涉及到其他的问题:每个li标签会重叠1-2个px,妨碍到鼠标hover状 态的事件。尝试修改doctype类型也不见效果。后来尝试了另外一个方法:
把原来的HTML 代码结构:
更改为:
这样就不会产生额外的外边距,也弄不清楚为什么会出现这种问题。先暂时记下,以后再研究研究。
以前未曾遇到类似的问题,一番google,才知道这是IE6处理CSS伪类:hover的Bug。例如如下的代码:
<style>
a {color: #333;}
a span {color: green;}
a:hover {}
a:hover span {color: red; }
</style>
<a href=”http://www.taobao.com“> 淘宝网 <span> 淘你喜欢 </span></a>
在IE7/FF中,鼠标移动到链接上时,”淘你喜欢”字样会变为红色,但IE6则无反应。所以IE6的bug就是如果a 与 a:hover 的css定义是一样的,也就是说如果a:hover 中没有样式的改变,hover就不会被触发。但如果在a:hover{}增加一些特定的属性,例如
a:hover{border:none;}
或者
a:hover{padding:0;}
又或者
a:hover{background: none;}
此时hover就可以触发了。
23:原来IE6支持!important
.demo { color:#F00!important; color:#000; }/*IE6显示错误理解:.demo显示为黑色*/
/*而下面IE6是正确理解的:.demo显示为红色*/
.demo { color:#F00!important;}
.demo { color:#000; }
24:去掉button按钮左右两边的留白
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<style>
*{padding:0; margin:0}
input,button{overflow:visible;padding:0;}
</style>
</head>
<body>
<form id="form1" name="form1" method="post" action="">
<input type="submit" name="button" id="button" value="button按钮左右留白的解决方法" />
</form>
<button><span>button按钮左右留白的解决方法</span></button>
</body>
</html>
25:中文字体在css中的写法
黑体SimHei\9ED1\4F53黑体
宋体SimSun\5B8B\4F53宋体
新宋体 NSimSun\65B0\5B8B\4F53新宋体
仿宋FangSong\4EFF\5B8B仿宋
楷体KaiTi\6977\4F53 楷体
微软正黑体Microsoft JhengHei\5FAE\x8F6F\6B63\9ED1\4F53微软正黑体
微软雅黑Microsoft YaHei\5FAE\8F6F\96C5\9ED1微软雅黑
幼圆 YouYuan\5E7C\5706幼圆
26: ie6里100%是相对于上有高度设置的元素 其他浏览器是相对于上个相对定位或绝对定位的元素
<div style=" 600px; height:600px; background:#000;">
<div style=" 500px; height:500px; background:#333;">
<div style=" float:left; background:#666; 400px;" >
<div style=" 300px; height:300px; background:#999;">
<div style=" 100%; height:100%; background:#f00; position:absolute; left:0; top:0;">
在非ie6的浏览器中都是满屏幕的红, 说明非ie6的浏览器的width和height的百分比,都是相对的上个相对定位或者绝对定位的元素,没有就为html元素
,而ie6中的width和height 的百分比,相对的是上个有高宽显示设置的元素,而且height的百分比设置失效,所以上述代码在ie6中就出现宽度穿越了他的父元素而遇见500px;的元素的时候,边把自己设置成了500px;而height的设置则失效, 这个, 让人很蛋疼!ie6,真的该早点走了!
</div>
</div>
</div>
</div>
</div>
27: ie不缓存背景图片的解决办法
高性能web开发中,一张小小的图片请求能省的就省,可IE6存在不缓存背景图的bug.如果重复使用了一个图片作为背景,那么每用一次就会重新去服务器拉一次。。。给服务器带来巨大的压力。解决方法有两种,
1:采用JS
var ua = navigator.userAgent.toLowerCase();
var isIE6 = ua.indexOf("msie 6") > -1;//判断是否为IE6
// remove css image flicker
//IE6下默认不缓存背景图片,CSS里每次更改图片的位置时都会重新发起请求,用这个方法告诉IE6缓存背景图片
if(isIE6){
try{
document.execCommand("BackgroundImageCache", false, true);
}catch(e){}
}
2.在页面上直接使用1个DIV元素来加载该图片,这样加载图片就能真正被缓存,鼠标移动也不会发送请求了。
28:ie6下css实现max/min-width/height
_expression(this.width>300?"300px":ture); max-300px;
_height:expression(this.height>300?"300px":ture); max-height:300px;
29:css空白外边距互相叠加的解决方法
body{300px; font-family:'微软雅黑'; font-size:1em; text-indent:10px; line-height:1.25;}
div{background:#000;margin:10px;}
div p{background:#f60;margin:15px}
这是一个div元素内嵌套p的简单样例,先别复制保存为html测试,在你看完上面的代码后,你是否以为它出为你呈现如下图的效果?
好,现在你可以复制上面代码,保存到本地,然后在浏览器中打开.你会惊讶的发现,它呈现给你的效果是这样的:
为什么会这样呢?按CSS中,对于有块级子元素的元素计算高度的方式,如果元素没有垂直边框和填充,那其高度就是其子元素顶部和底部边框边缘之间的距离.故,子元素的顶部和底部空白边就突出到元素的外围了.p元素的15px外边距与div元素的10px的外边距形成一个单一的15px垂直空白边,另外,形式的这个空白边并非为div所包围,而是呈现在div的外围.所以,我们看到了第二张效果图.
如何解决?本人比较推荐两种解决方式:
其一,为外围元素定义透明边框.具体到本例,即在样式div中加入border:1px solid #ddd;
其二,为外围元素定义内边距填充..具体到本例,即在样式div中加入padding:1px
另外,还可以通过外围元素绝对定位,或者定义子元素浮动等方式实现.
30:纯css解决多行文字垂直居中
<style type="text/css">
.alert{
400px;
height:250px;
display:table-cell;
vertical-align:middle;
line-height:1.5em;
border:1px solid red;
}
.alert_blank{
height:100%;
0;
display:inline;
vertical-align:middle;
zoom:1;
}
.alert_con{
100%;
zoom:1;
display:inline;
vertical-align:middle;
}
</style>
<div class="alert">
<div class="alert_con">哥乃多行文字垂直居中~哥乃多行文字垂直居中~哥乃多行文字垂直居中~哥乃多行文字垂直居中~</div>
</div>
其大概原理为:第一个alert_blank容器,display:inline以后作为行内元素,它的高度为100%,宽度却为0,相当于紧贴外层容器左边框的一条透明的线,这样就使得外层容器里面只存在一行。外层容易的vertical-align:middle使得其内部相当于一行文字垂直居中。真正盛放内容的div也是display:inline,它对外和blank垂直居中,只要内部文字不超过blank的高度,这个效果将是完美的。虽然从语义化上讲,用空白div布局说不太过去,但是瑕不掩瑜。另:zoom:1是为了触发hasLayout。
(a) place Flash embed script in <div> container (I use SWFObject.js)[将flash嵌入脚本放到一个div容器中]
(b) add wmode=transparent to Flash embed script[增加wmode=transparent 到flash嵌入脚本]
(c) set <div id="flashcontent"> container with z-index:-1; [将外层容器的z-index设置为-1]
(d) set <body> tag with style .. position:relative;left:0px;top:0px;z-index:0;
(otherwise Firefox does not accept negative z-index)
(e) set floating iframe in container with z-index: 99;[将浮动的iframe在容器中的zindex设置为99]
(f) use CSS to position flashcontent and htmlcontent containers.[使用css来调整flash容器和html容器的位置]
其他方案网上比较多见,不做阐述.在此说下使用第一个方案如何解决:
var so = new SWFObject("XXX.swf", "flashId", "宽度", "高度", "版本", "背景色");
//设置flash不遮盖div层
so.addParam("wmode", "opaque");
so.write("flashcontent");
如此设置即可让flash无法遮盖住div
32:如何处理ie6的文字行高
ie6下汉字就会显示偏上位置,而在标准浏览器中不存在这个问题字体 Tahoma,试下
不过如果有规定第一个字体是用啥的,那就只能忽略这个问题..我终于明白淘宝为啥把Tahoma字体放到第一位了
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>测试ie6的文字行高表现</title>
<style type="text/css">
body,ul,li,p {margin:0;padding:0;}
body { font:12px/1.5 Tahoma,"宋体",Arial, Helvetica, sans-serif; }
ul {float:left;list-style:none; margin-bottom:10px;}
ul li, p { margin-top:4px;background:silver;clear:left;}
ul li {float:left;margin-top:4px;}
</style>
</head>
<body>
<ul>
<li>岁月不饶人哪</li>
<li>hjgt</li>
</ul>
<p>岁月不饶人哪</p>
<p>hjgt</p>
</body>
</html>
33:利用 CSS 跨浏览器地隐藏文字一法
ont-size:0; // for firefox & opera
color: transparent; // for webkit
overflow:hidden; // for IE
font-size:0;
filter:alpha(opacity=0);
自测后兼容的浏览器如下:
IE 6-8
Firefox 1-4
Opera 9-10
Safari 3-5
Chrome 1-6
34:button在chrome下默认有2px的margin
<button>在chrome下有两像素margin</button>
35:ie6和ie7里面margin失效
<div style="padding:20px;background:#f00;">
<div style="background:#fff;height:200px;margin:50px;">我的margin在ie里面失效了</div>
解决办法去掉里面div的高度
以下是一些常用的CSS兼容技巧
1)火狐下给div设置padding后会导致 width和height 增加, 但IE不会.(可用!important解决)
2)垂直居中,将 line-height设置为当前div相同的高度, 再通过vertical-align: middle;( 注意内容不要换行)
3)水平居中,margin:0 auto;(当然不是万能)
4)若需给a标签内内容加上样式, 需要设置 display: block;(常见于导航标签)
5)浮动IE产生的双倍距离
在IE下,当一个div设置了float后,然后给他设置margin,就会出现加倍的margin,解决的办法是给div设置 display:inline。
<div id=”float”></div>
相应的css为
#float
{
float:left;
margin:5px;/*IE下理解为10px*/
display:inline;/*IE下再理解为5px*/
}
Block元素的特点是:总是在新行上开始,高度,宽度,行高,边距都可以控制(块元素);Inline元素的特点是:和其他元素在同一行上,...不可 控制(内嵌元素);
6)IE和FF对盒模型的解释区别
#browserTest{ 650px !important;
648px;padding-left:2px;background:#fff; }
browserTest显示的宽度是650px;
IE Box的总宽度是:width+padding+border+margin宽度总和;
FF Box的总宽度就是:width的宽度,padding+border+margin的宽度在含在width内。
如果有BOX{WIDTH:"300";
PADDING:"5PX";}
则BOX在IE的宽度应该为:310
而在FF的宽度则是300
所以在BOX有填充的情况下应该这样使用
BOX{WIDTH:"300" !IMPORTANT; WIDTH:"290";}
7)ul标签在 FF下面默认有list-style和padding, 最好事先声明, 以避免不必要的麻烦;(常见于导航标签和内容列表)
8)作为外部wrapper的div不要定死高度, 最好还加上 overflow: hidden;以达到高度自适应;
9)页面的最小宽度
min-width是个非常方便的CSS命令,它可以指定元素最小也不能小于某个宽度,这样就能保证排版一直正确。但IE不认得这个,
而它实际上把width当做最小宽度来使。为了让这一命令在IE上也能用,可以把一个<div> 放到 <body> 标签下,然后为div指定一个类:
然后CSS这样设计:
#container{ min- 600px; expression(document.body.clientWidth <
600? "600px": "auto" );}
第一个min-width是正常的;但第2行的width使用了Javascript,这只有IE才认得,这也会让你的HTML文档不太正规。它实际上通 过Javascript的判断来实现最小宽度。
10:万能float闭合
将以下代码加入Global CSS 中,给需要闭合的div加上
<style>
/* Clear Fix */
.clearfix:after
{
content:".";
display:block;
height:0;
clear:both;
visibility:hidden;
}
*html .clearfix{
height:1%;
}
*+html .clearfix{
height:1%;
}
.clearfix
{
display:inline-block;
}
/* Hide from IE Mac */
.clearfix {display:block;}
/* End hide from IE Mac */
/* end of clearfix */
</style>
/**********************************************/
<div id="wrap">
<div class="column_left">
<h1>Float left</h1>
</div>
<div class="column_right">
<h1>Float right</h1>
</div>
</div>
#wrap{ border:6px #ccc solid; overflow:auto; _height:1%;}
.column_left{ float:left; 20%; padding:10px;}
.column_right{ float:right; 75%; padding:10px; border-left:6px #eee
solid;}
Hack 的顺序
使用 Firefox 作为平台, 只要代码写得够标准, 其实要 Hack 的地方不会很多的, IE 以外的浏览器几乎都不会有问题, 所以可以暂时忽略, 顺序如下:
Firefox -> IE6 -> IE7 -> 其他
Hack 的方法
说到方法有两种, 一种是在不同文件中处理, 另一种则是在同一个文件中处理. 其实作用是相同的, 只是出发点不一样而已.
1. 同一文件中处理.
如:
id="bgcolor" 的控件要在 IE6 中显示蓝色, IE7 中显示绿色, Firefox 等其他浏览器中显示红色.
1 |
#bgcolor { |
IE6 不认 !important, 也不认 *+html. 所以 IE6 只能是 blue.
IE7 认 !important, 也认 *+html, 优先度: (*+html + !important) > !important
> +html. IE7 可以是 red, blue 和 green, 但 green 的优先度最高.
Firefox 和其他浏览器都认 !important. !important 优先, Firefox 可以是 red 和 blue, 但 red 优先度高.
上述的优先符号均是 CSS3 标准允许的, 其他浏览器也还有其他的 Hack 方法, 但我迄今还没遇到过 Firefox 正常, IE 以外的其他浏览器不正常的情况, 所以无可分享. 只要代码规范, 相信这种情况的发生应该是很罕见 (JavaScript 除外).
2. 不同文件中处理.
为什么同一文件中可以处理还要写在多个文件里面针对不同的浏览器? 这是为了欺骗 W3C 的验证工具, 其实只需要两个文件, 一个是针对所有浏览器的, 一个只为 IE 服务. 将所有符合 W3C 的代码写到一个里面去, 而一些 IE 中必须的, 又不能通过 W3C 验证的代码 (如: cursor:hand;) 放到另一个文件中, 再用下面的方法导入.
1 |
<!-- 放置所有浏览器的样式 --> |
浏览器的 CSS Hack 方法有很多, 比如 @import 引入, > 过滤等等方法, 但以上就是我用过的全部.
网页前台的兼容不应该仅限于对过去的浏览器支持 (向前兼容), 更应该对未来的浏览器服务 (向后兼容). 因为浏览器的发展很快, 而经常上网的人更新软件的频率是非常高的, 所以向后兼容的意义甚至比先前兼容还来得重要. 如何向后兼容呢? 只要符合标准你的网站就永远不会过时 (IE 系列除外). 所以我的宗旨是尽量做到标准, 不得已才 Hack, 并尽量使用比较简单的方法去解决.
CSS hack是指我们为了兼容各浏览器,而使用的特别的css定义技巧。这是国外摘来的一张CSS hack列表,显示了各浏览器对css hack的支持程度,对我们制作兼容网页非常有帮助。
补充:
.color{
background-color: #CC00FF; /*所有浏览器都会显示为紫色*/
background-color: #FF0000\9; /*IE6、IE7、IE8会显示红色*/
*background-color: #0066FF; /*IE6、IE7会变为蓝色*/
_background-color: #009933; /*IE6会变为绿色*/
}
好多css hack,最重要的是简单实用能解决问题就行了
总结:
\9: IE6 IE7 IE8
*: IE6 IE7
_: IE6
*+: IE7(经我测试没多大用)
----------------------------------------
IE6,IE7,Firefox兼容的css hack
第一种办法:
body
{
background:red;
*background:blue !important;(经测试在IE里不使用)
*background: green;
}
第一排给Firefox以及其他浏览器看;
第二排给IE7,IE7既能识别*号,也能识别important;
第三排给IE6也能识别*号;
第二种办法,使用_来区分IE6:
body
{
background:red;
*background:blue;
_background: green;
}
第一排给Firefox以及其他浏览器看;
第二排给IE7,IE7既能能识别*号;
第三排给IE6能识别下划线;
CSS对浏览器器的兼容性具有很高的价值,通常情况下IE和Firefox存在很大的解析差异,这里介绍一下兼容要点。
常见兼容问题:
1.DOCTYPE 影响 CSS 处理(但这个声明对于WEB标准的验证是非常重要的)
2.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行(已经过时)
3.FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中
4.FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 height 和 width(IE也会增加,没用!)
5.FF: 支持 !important, IE 则忽略, 可用 !important 为 FF 特别设置样式(IE不会忽略!这谁写的没用的东西!)
6.div 的垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行
7.cursor: pointer 可以同时在 IE FF 中显示游标手指状, hand 仅 IE 可以
8.FF: 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。(这个没看懂!)
9.在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法:
div{margin:30px!important;margin:28px;}(这方法不使用!没用!用*、-多好!)
注意这两个margin的顺序一定不能写反,据阿捷的说法!important这个属性 IE不能识别,但别的浏览器可以识别。所以在IE下其实解释成这样:
div{maring:30px;margin:28px}
重复定义的话按照最后一个来执行,所以不可以只写margin:XXpx!important;
10.IE5 和IE6的BOX解释不一致
IE5下
div{300px;margin:0 10px 0 10px;}
div的宽度会被解释为300px-10px(右填充)-10px(左填充)最终div的宽度为280px,而在IE6和其他浏览器上宽度则是以 300px+10px(右填充)+10px(左填充)=320px来计算的。这时我们可以做如下修改
div{300px!important;width /**/:340px;margin:0 10px 0 10px}
关于这个/**/是什么我也不太明白,只知道IE5和firefox都支持但IE6不支持,如果有人理解的话,请告诉我一声,谢了!:)
11.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值所以先定义
ul{margin:0;padding:0;}
就能解决大部分问题(不只这一个吧!还有P,DL 等。。)
注意事项:
1、float的div一定要闭合。
例如:(其中floatA、floatB的属性已经设置为float:left;)
<#div id=”floatA” ></#div>
<#div id=”floatB” ></#div>
<#div id=”NOTfloatC” ></#div>
这里的NOTfloatC并不希望继续平移,而是希望往下排。
这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。
在
<#div class=”floatB”></#div>
<#div class=”NOTfloatC”></#div>
之间加上
<#div class=”clear”></#div>
这个div一定要注意声明位置,一定要放在最恰当的地方,而且必须与两个具有float属性的div同级,之间不能存在嵌套关系,否则会产生异常。
并且将clear这种样式定义为为如下即可:
.clear{clear:both;}
此外,为了让高度能自动适应,要在wrapper里面加上overflow:hidden;
当包含float的box的时候,高度自动适应在IE6下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;可以做到,这样就达到了兼容。
例如某一个wrapper如下定义:
.colwrapper{
overflow:hidden;
zoom:1;
margin:5px auto;}
2、margin加倍的问题。
设置为float的div在ie6下设置的margin会加倍。这是一个ie6都存在的bug。
解决方案是在这个div里面加上display:inline;
例如:
<#div id=”imfloat”></#div>
相应的css为
#IamFloat{
float:left;
margin:5px;/*IE6下理解为10px*/
display:inline;/*IE6下再理解为5px*/}
3、关于容器的包涵关系
很多时候,尤其是容器内有平行布局,例如两、三个float的div时,宽度很容易出现问题。在IE中,外层的宽度会被内层更宽的div挤破。一定要用Photoshop或者Firework量取像素级的精度。
4、关于高度的问题
如果是动态地添加内容,高度最好不要定义。浏览器可以自动伸缩,然而如果是静态的内容,高度最好定好。(似乎有时候不会自动往下撑开,不知道具体怎么回事)
5、最狠的手段 - !important;
如果实在没有办法解决一些细节问题,可以用这个方法.FF对于”!important”会自动优先解析,然而IE则会忽略.如下
.tabd1{
background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important; /*Style
for FF*/
background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; /* Style for IE */}
值得注意的是,一定要将xxxx !important 这句放置在另一句之上,上面已经提过
IE浏览器都能识别“*” “\9”;标准浏览器(如FF)不能识别“*”;
IE6能识别“_” “+” “#” “@”, 同一属性有两个的只看后者 无论有没有 如果是两句它就能识别“!important”;
IE7能识别“+” “#” “@” “!important”,不能识别“_”;
FF能识别“!important”,不能识别“_” “+” “#” “@”;
以上是我自己测试的结果,如有差错还请指出~!
注:不管是什么方法,书写的顺序都是firefox的写在前面,IE7的写在中间,IE6的写在最后面。
例如:select{
Color:blue;//所有浏览器
Color:yellow\9;//所有IE浏览器
*Color:red;//forIE7
_color:green;//forIE6
}
关注过IE8的css hack的人相信大家都在使用这个hack,就是“\9”的css hack:
其中:OP表示Opera,SA表示Safari,Ch表示Chrome;当然你如果还有耐心可以测试 “\14”,“\15”,“\16”。。。
从上面测试结果我们可以看出“\0”的写法只被IE8识别,ie6,ie7都不能识别,那么“\0”应该是IE8的 真正hack。主流浏览器的CSS hack这样更好一些:
.test{
color:#000000; /* FF,OP支持 */
color:#0000FF\0; /* IE8支持*/
[color:#000000;color:#00FF00; /* SF,CH支持 */
*color:#FFFF00; /* IE7支持 */
_color:#FF0000; /* IE6支持 */
}
其中:OP表示Opera,SA表示Safari,Ch表示Chrome;
关注过IE8的css hack的人相信大家都在使用这个hack,就是“\9”的css hack: .test{ |
color:#0000FF\9的hack支持IE6-IE8(其他版本没有测试),但是IE8不能识别“*”和 “_”的css hack,所以我们可以使用
color:#0000FF\9; ;/*ie6,ie7,ie8*/
*color:#FFFF00;/*ie7*/
_color:#FF0000;/*ie6*/
来区分IE的各个版本。
说到了这个\/* SF,CH支持 *\/经过本人测试,这个ie系列都支持,而且ff会把他解析为上下top和bottom,从而影响以上两个地方的位置。