css兼容问题与实践归纳总结

一、IE6/7 原生块元素与display:inline-block;

<div  style="display:inline-block;">some text</div>

在ie6/7下,这个div还是会独占一行,所以要是需要设置inline-block的元素来呈现按钮图标之类的要素,最好用 span em i 等这些默认为内联元素的标签。

想起以前设置按钮时,也是吧 a 设置为 display:inline-block; 就可以设置宽高,可以在同一行显示的。div怎么不行了?

原来也有办法在IE6/7, 让块元素实现display:inline-block

  • 先使用display:inline-block属性触发块元素,然后再定义display:inline,让块元素呈递为内联对象

    两个display要先后放在两个CSS声明中才有效果,这是IE的一个经典bug,如果先定义了display:inline-block,然后再将display设回inline或block,layout不会消失

      div {display:inline-block;...}
    div {display:inline;}
  • 直接让块元素设置为内联对象呈递(设置属性display:inline),然后触发块元素的layout(如:zoom:1等)

      div {display:inline; zoom:1;...}

二、float后的元素与vertical-align

<div style="height:100px; background:pink; font-size:4em;">
<span style="float:left; width:30px; height:30px; background:green; vertical-align:middle;"></span>我是裸文字 测试垂直对齐
</div>

对于已经设置浮动的元素,若要在垂直方向上调整位置,vertical-align不起作用,应该用margin-top/margin-bottom;

个人理解 vertical-align主要是设置line-box中inline or inline-block元素垂直方向的对齐方式的, 浮动的元素自身高度塌陷 没有行高,所以不能由vertical-align来调整。

三、清除浮动影响较好的方法 zoom:1 :after{}

ul li{float:left;}
ul{zoom:1} 触发hasLayout for IE
ul:after{content:''; display:block; clear:both; font-size:0; height:0; line-height:0;} <ul>
<li>item</li><li>item</li>
</ul>

四、IE6 inline-block元素设置width:0; height:0; 但实际会被font-size 和 继承的line-height撑高

<span style="display:block; height:25px; line-height:25px;">
选择省份<i style="display:inline-block; width:0; height:0; border:5px solid transparent; border-top-color:blue;"></i>
</span>

比如上面这个设置为小三角的<i>标签, 在IE6下还需要设置 font-size:0; line-height:0;

IE6/7 float:right后换行的问题

比如有代码如下: <h1>标题 <span>更多</span> </h1> 想显示成左右靠边的布局: 如果给span {float:right;} 但是,在IE6/7下会出现BUG。浮动框移动到本行行框之下。

解决方法:

  1. 让span放到最前面。优点是:不用写代码。缺点:破坏语义。

  2. 绝对定位。优点:不破坏语义。缺点:代码量加大。

  3. 都添加浮动。优点:同上。缺点:会引起其他bug等。

  4. 添加hack。_margin-top:-XXXXpx;优点:同上。缺点:使用了hack。 你有更好的方法可以给我留言。相互学习探讨。

五、IE6不支持max-width , IE7+都支持

max-width 在实现自适应内容宽度,但不超过给定宽度的情况下比较有用,比如 弹出二级商品分类菜单的场景

**解决方法: ** 可以在外层套一个div 设置宽度=最大宽度 内部div的宽度自适应内容

.container{width:500px;}
.menu{display:inline-block; *display:inline; *zoom:1; background:#aaa; max-width:500px;}
.menu a{display:inline-block; margin:0 10px;} <div class="container">
<div class="menu">
<a href="#">三级菜单</a><a href="#">蓝牙耳机</a><a href="#">充电器</a><a href="#">数据线</a><a href="#">手机耳机</a><a href="#">贴膜</a><a href="#">存储卡</a><a href="#">保护套</a><a href="#">车载</a><a href="#">iPhone配件</a>
</div>
</div>

六、IE6不支持a以外的标签不支持 hover 伪类 , IE7+都支持

如题

七、IE6垂直列表 列表项之间的空隙 阶梯bug

li a{display:block; border-bottom:1px solid #eee;}

在ietester 里面用debugbar查看文档代码,每个ul li里面都有这个 text: empty text node 这个东西,像<li><a>sometext</a></li> IE6下 js检测显示最后一个子节点为空白文本节点,改成<div><a>sometext</a></div>这样内部就无空白文本节点,这应该是导致li内部有空白行的原因

只要将列表li的子元素(子元素是行内元素的情况下,比如a,span)设置成块元素就会在ie6出问题,

**解决办法: **

  1. 触发设置为display:block子元素的haslayout
  2. 设置 li {display:inline} 此时空白节点依然是存在的只是没有换行撑出空白而已
  3. 用js遍历删除那个空白的文本节点

如何触发ie的hasLayout

  • position: absolute

  • display: inline-block;

  • float: left / right;

  • width: 除“auto”以外的值

  • height: 除”auto”以外的值,如”height: 1%;”

  • zoom: 除“normal”以外的值

  • writing-mode-tb-rl;

      li a{display:block; line-height:40px; height:40px; border-bottom:1px solid #E8E8E8; font-size:14px; color:#444; text-indent:18px; background:#fff;} 
    
      <ul>
    <li id="ali"><a href="javascript:;">热销机型</a><i></i></li>
    <li id="ali2"><a href="javascript:;">操作系统</a></li>
    <li><a href="javascript:;">屏幕大小</a><i></i></li>
    <li><a href="javascript:;">网络制式</a><i></i></li>
    <li><a href="javascript:;">价格区间</a><i></i></li>
    <li><a href="javascript:;">推荐人群</a><i></i></li>
    <li><a href="javascript:;">特色功能</a><i></i></li>
    <li><a href="javascript:;">运营商</a><i></i></li>
    <li><a href="javascript:;">手机配件</a><i></i></li>
    </ul>

像这样的html结构,触发display:block a元素的hasLayout也不行,解决方法只能是 li{display:inline;} 或者 js删除空文本节点

七、IE6 float元素内部有块级子元素的话,float内联特性会被破坏,即float的父元素的宽度被撑到100%

li{float:left;} a{display:block;} li的宽度被撑开 类似恢复block特性

<li><a>sometext</a></li>

八、IE6 不支持选择器 .class1.class2{}

.al{color:green;}
.ar{color:blue;}
.al.hover{border:1px solid green;} /*~~IE6中 .al.hover {}等价于 .hover{}, .hover.al{} = .al{} 只识别最后一个class */ <div class="al hover">若支持class选择器 .aclass.bclass 则显示绿色字体 绿色边框</div>
<div class="ar hover">若支持class选择器 .aclass.bclass 则显示蓝色字体 蓝色边框, 结果同样显示绿色边框</div>

九、IE6/7 ul下只能包含li,若包含其他子元素则会被解析到就近的li里

<ul>
<li>home</li>
<li>contact</li>
<b class="hlbg"></b>
</ul>

最后一个会被解析到最后一个li里面

十、让空白单元格显示边框?

 table{ border-collapse:collapse;  empty-cell:show; }  //~~~给table设置这2个样式

css兼容问题与实践归纳总结的更多相关文章

  1. CSS 网页字体最佳实践

    一般在网页的字体设置中,可以将字体分类三类: 系统字体:使用系统自带的字体 兜底字体:当系统字体无法正常使用,而兜底的字体 Emoji 字体:显示网页中的表情字体 为了满足不同平台,以及 Emoji ...

  2. CSS兼容各浏览器的hack

    CSS兼容各浏览器的hack:建议:尽可能的手写代码,可以有效的提高学习效率和深度.浏览器的种类多,麻烦自然也多,主要是各种浏览器对某些属性的渲染效果并不相同,所以有时候需要专门针对特定浏览器或者特定 ...

  3. 主流浏览器css兼容问题的总结

    最近又搞了一波网站的兼容,由于要求ie浏览器还是要兼容到ie8,所以调起来还是各种蛋疼. 现在就post一些做兼容的总结,可能不够全面,但是可以告诉大家如何避过一些坑.主要测试了chrome,fire ...

  4. CSS兼容问题实用建议

    CSS兼容问题,是美工最头痛的问题.做测试时,用谷哥和360浏览器(最新)都没有什么问题,用 IE6/IE8测试,问题就冒出来了.微软现在出IE10,我电脑上已经无法用IE6准确测试,IE-TESTE ...

  5. css兼容问题集合

    css兼容问题 兼容问题 1.文字本身的大小不兼容.同样是font-size:14px的宋体文字,在不同浏览器下占的空间是不一样的,ie下实际占高16px,下留白3px,ff下实际占高17px,上留白 ...

  6. css兼容各个浏览器的三角形图标

    css兼容各个浏览器的三角形图标 在当前流行的的网站上,我们经常会看到一些小三角形的下拉提示(微博顶部的下拉菜单),简单的方式可以使用一张图片代替,但是随着前端技术的发展,以及开发者对于前端性能的“吹 ...

  7. CSS兼容常用技巧

    请尽量用xhtml格式写代码,而且DOCTYPE影响 CSS 处理,作为W3C标准,一定要加DOCTYPE声明. 1.div的垂直居中问题 vertical-align:middle; 将行距增加到和 ...

  8. ie6 7 8 9 firefox的css兼容问题

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 浏览器 CSS 兼容写法的测试总结

    做前端最讨厌的就是 IE6,7,8,虽然被淘汰的浏览器,但是在中国用户仍然很多,不可能像国外网站一样直接就不管它了,这样会流失很多流量啊. 现在有了IE9,IE10还好些,几乎和 Chrome,Fir ...

随机推荐

  1. Java学习之finally关键字总结

    Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...

  2. CSS3盒模型display:-webkit-box;的使用

    box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典的一个布局应用就是布局的垂直等高.水平均分.按比例划分. 目前box-flex属性还没有得到 ...

  3. Android Fragment StartActivityForresult调用实例

    fragment里面的onActivityResult 怎样才能被调用,很简单,就一句话, startActivityForResult(intent, getActivity().RESULT_FI ...

  4. linux printf和fork()问题小结

    总结如下: printf("father begin"); pid_t pid; pid = fork(); ) { ) { printf("father out&quo ...

  5. [原创]使用GCC创建 Windows NT 下的内核DLL

    原文链接:使用GCC创建 Windows NT 下的内核DLL 在温习<<Windows 2000 Driving>>分层驱动程序一章的时候,看到了关于紧耦合驱动连接方式,这种 ...

  6. C#版-百度网盘API的实现(二)

    在这篇文章中,我们通过代码来实现百度网盘的简单操作, 一,登陆,在代码中,我有一个Baidu1的类,实例化该类时回执行登陆方法,该类对外开放了三个方法, 1,GetFileDir获取根目录下的文件夹及 ...

  7. String类的实现,内部采用字符数组实现

    #include <iostream> using namespace std; class String{ public: String(const char *str = NULL); ...

  8. chroot 的用途

    http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/ http://liyongxian.blog.51cto.com/432519/1126 ...

  9. libVirt APIs uris (storage,hypervisors)drivers terminologies,glossary xml VMI format

  10. background-size:的认识;

    background-size:100%;其实是元素的背景图片的宽度和元素宽度相同,高度auto: 也可理解为:background-size:100% auto; 而background:cover ...