微博客

        IE6下相对定位元素(DIV)内绝对定位元素(DIV)的偏移定位Bug问题,即绝对定位元素的相对偏移元素是谁。一般情况下,是相对于父元素以上直到 DOCUMENT(默认已定位)的已定位元素(即position的设置)。但在IE6,IE5中出现的BUG却是定位在已定位元素的外围或以 DOCUMENT相对而言。

在《精通CSS》30页上面有这样一段话:
引用:
相对于相对定位的祖先元素对框进行绝对定位,这在大多数现代浏览器中实现得很好。但是,在windows上的IE5.5和IE6中有一个BUG如果试图相对于相对定位的框的右边或底部设置绝对定位的框的位置,那么需要确保相对定位的框已经设置了尺寸。如果没有,那么IE会相对于画布定位这个框。简单的解决方案时为相对定位的框设置宽度和高度。

但是,如果未添加宽度,那么浏览器可能给予父元素默认的100%宽度。而若未添加高度在Firefox 3及IE 6下都无法看到绝对定位的子元素的。也就是说,IE 6下绝对定位子元素并没有相对于画布定位。

测试通过没有问题:

<!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" xml:lang="en" lang="en">
<head>
  <title></title>
  <style type="text/css">
    * { margin:0;padding:0;}
    #brading{
      position:relative;
      width:200px;   //可设置100%
      height:200px;   //可设置100%
      border:1px solid red;
      background:#ccc;
    }
    #brading .tel{
      position:absolute;
      bottom: 0;
    }
  </style>
</head>
<body>
  <div id="brading"><div class="tel">tel:000-000-999</div></div>
</body>
</html>

====================================

在进行网页布局设计的时候,经常会根据需要设置相对定位,绝对以及浮动定位最近突然发现了一个奇妙的现象:IE6下绝对定位元素神秘消失或被遮挡, 首先是IE绝对定位元素神秘消失,设置的绝对定位元素,突然从IE浏览器下消失了,然而火狐能正常显示. 尝试对绝对定位元素进行清除浮动操作,IE下能显示,但是出现了莫名的留白,火狐下正常显示.至少这个现象表明,绝对定位元素在IE6下神秘消失对相邻元 素的浮动定位有关.

  查了相关资料,高人有这样的解释:

  1.当绝对定位层的邻近浮动层的宽度不等于父层宽度时,以及没有清除浮动时,IE6/7,FF中显示一致;
2.当绝对定位层的邻近浮动层的宽度不等于父层宽度时,有清除浮动时,IE6/7不显示绝对定位层,FF显示;
3.当绝对定位层的邻近浮动层的宽度等于父层宽度时,以及没有清除浮动时,IE6不显示绝对定位层,IE7/FF显示;
4.当绝对定位层的邻近浮动层的宽度等于父层宽度时,有清除浮动时,IE6/7不显示绝对定位层,FF显示;

  要解决这个BUG的方法也很简单,让绝对定位层不挨着浮动层放置就好了,还有个更简单的方法,在绝对定位元素和其他元素之间加一个空白的div。

  再来看看绝对定位元素神秘消失被遮挡的现象,先了解一下所涉及到的几个定位特性:
1. 相对定位元素默认的z-index的数值是0。
2. 当两个相对定位同时出现时,代码靠后的z-index优先。
3. 子级遵循父级设定的z-index;如果子级设定了绝对定位、z-index,可以冲破父级显示
看下面的代码:

 <div style=”position:relative; background:#FF0000; width:200px; height:100px;”>
     <div style=”position:absolute; background:#FFFF00; width:49px; height:50px; left:106px; top:200px; z-index:100“></div>
</div>
<div style=”position:relative; background:#000000; width:200px; height:100px;”></div>
<div style=”position:relative; background:#9900FF; width:200px; height:100px;”></div>

  代码解释:上面是三个相邻的相对定位的层,在第一个层里加了个相对其绝对定位的层,按照理论,这个绝对定位的元素是在三个相对定位元素之上的, 但是,实际却没有显示。尝试设置z-index值也没有效。

  网上解决这个bug的办法一般用hack使B为负值,来降低 B 在IE下级别。但是这种方法在z-index为负值时,产生了新的ie bug按照定位的特性,ie的这个bug是可以回避。

  从表面上看下面的层 遮住了上面的绝对定位层,实际上是下面的 层遮住了绝对定位的的父级层,只要将 该父级层的z-index设定大于后面的层即可。

update:(2012.11.7Gino更新)

如果第二、三个div的定位为普通流定位,也会产生子导航被下面的div背景遮挡的情况,即

 <div style=”position:relative; background:#FF0000; width:200px; height:100px;”>
     <div style=”position:absolute; background:#FFFF00; width:49px; height:50px; left:106px; top:310px; z-index:100“></div>
</div>
<div style=” background:#000000; width:200px; height:100px;”></div>

转载http://blog.csdn.net/xfxiaoyan2010/article/details/5797024

posted on 2012-11-02 10:21  飞鸟42  阅读(1577)  评论(0编辑  收藏  举报