`
kalogen
  • 浏览: 880190 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Firefox 浏览器对 TABLE 中绝对定位元素包含块的判定有错误,某些情况下会导致绝对定位元素位置跟其他浏览器中有差异

阅读更多

关于绝对定位元素的定位,依赖于其包含块。也就是说,当绝对定位元素的"top"、"left"值被设置之后,绝对定位元素会根据这两个值,相对于其包含块产生位移。见:http://www.w3.org/TR/CSS2/visuren.html#absolute-positioning

关于包含块的概念,在帖子:【分享】说说标准 -- 可视化格式模型(visual formatting model)之一 -- 包含块(containing block)已经做了详细的说明,其中,W3C CSS2.1规范中规定,绝对定位元素的包含块(containing block),由离它最近的position特性值是"absolute"、"fixed"、"relative"之一的祖先元素组成;如果这个祖先元素不存在,则包含块是初始包含块。

但是,这个规则在Firefox里好像不大管用。

本来想做一个很华丽丽的效果,需要把一个绚丽的图片针对表格的左上角定位,,本来在其他浏览器中好好的,但是到Firefox中就不灵了……

HTML code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><div style="width:200px; height:200px; position:absolute; background-color:silver;"> <table style="position:absolute; width:100px; height:100px; top:100px; left:100px; background-color:green;"> <tr> <td> <div style="position:absolute; width:50px; height:50px; top:50px; left:50px; background-color: gold;"> TEXT </div> </td> </tr> </table> </div>

本来是要想让金色的绝对定位 DIV 相对于 TABLE 来定位,但事与愿违,在 Firefox 里,变成了这样:

金色的 DIV 没有相对于绿色 TABLE 的左上角定位,跑偏了,相对于灰色的 DIV 定位了,当TABLE 不存在,哈!

其他浏览器中,就这样子:

可见,在Firefox中,TABLE 中好像创建不了包含块。
所以,在Firefox里,绝对定位元素的包含块是"position"特性值为"absolute"、"fixed"、"relative"之一的非table类型的祖先元素。定位的时候,也就会出现意想不到的效果。

这个问题,还可能会影响绝对定位元素的自动宽度计算。

所以,想相对于 TABLE 元素定位的同学小心了。

 

 

解决方案

这是 Firefox 的一个 bug,绝对定位元素无法根据 'display' 特性是 'table' 且是绝对定位的祖先元素定位。

所以,不要采用这种结构。

为达到相同的效果,可以采用如下方式替代:

  • 改变元素的 containing block:让绝对定位元素相对于 TABLE 元素的单元格定位,即,在 TD 上设置 'position:absolute' ;
  • 改变元素的定位方式:把绝对定位元素的 'absolute' 改为 'relative' ,用相对定位。

还有就是table 用div形式来表现

 

<html>
<head>
<style type="text/css">
.row div{
 border:1px solid black;
 height:20px;
 width:24%;
 float:left;
 margin-right:-1px;
 margin-top:-1px;
 text-align:center;
 font-weight:bold;
 display:block;
}
#head div{
 background-color:#CCFFFF;
 margin-top:0;
}
</style>
   <style type="text/css"> 
<!-- 
 
/*重点:固定行头样式*/
.scrollRowThead{position: relative; left: expression(this.parentElement.parentElement.parentElement.parentElement.scrollLeft);z-index:0;}
/*重点:固定表头样式*/
.scrollColThead {position: relative;top: expression(this.parentElement.parentElement.parentElement.scrollTop);z-index:2;}
/*行列交叉的地方*/
.scrollCR { z-index:3;}
/*div外框*/
.scrollDiv {height:400px;clear: both; border: 1px solid #EEEEEE;OVERFLOW: scroll;width: 900px; }
/*行头居中*/
.scrollColThead td,.scrollColThead th{ text-align: center ;}
/*行头列头背景*/
.scrollRowThead,.scrollColThead td,.scrollColThead th{background-color:EEEEEE;}
/*表格的线*/
.scrolltable{border-bottom:1px solid #CCCCCC; border-right:1px solid #CCCCCC; }
/*单元格的线等*/
.scrolltable td,.scrollTable th{border-left: 1px solid #CCCCCC; border-top: 1px solid #CCCCCC; padding: 5px; }

.scrollTable thead th{background-color:#EEEEEE;font-weight:bold;position:relative;}
--> 
</style>
<script language="javascript">
	function changeplace(x){
			
			document.getElementById('scrollRowThead').style.left=x+"px";
			//alert(document.getElementById('scrollRowThead').style.left);
	}
	</script>



<head>

<body>
<div id="scrollDiv" class="scrollDiv" onscroll="changeplace(document.getElementById('scrollRowThead').parentNode.parentNode.scrollLeft)">
 <div class="row" id="head" style="width:200%" class="scrollColThead">
     <div class="scrollRowThead scrollCR">标题1</div><div>标题2</div><div>标题3</div><div>标题4</div>
    </div>
    <div class="row" id="row1" style="width:200%;" onmousedown="move(this)">
     <div class="scrollRowThead" id="scrollRowThead">haha</div><div></div><div></div><div></div>
    </div>
</div>
</html> 

 

分享到:
评论
2 楼 micc010 2012-03-19  
还有什么办法解决没
1 楼 kalogen 2010-10-11  

<html xmlns="http://www.w3.org/1999/xhtml">


<HTML><HEAD><TITLE></TITLE>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   <style type="text/css"> 
<!-- 
 
/*重点:固定行头样式*/
.scrollRowThead{position: relative; left: expression(this.parentElement.parentElement.parentElement.parentElement.scrollLeft);z-index:0;}
/*重点:固定表头样式*/
.scrollColThead {position: relative;top: expression(this.parentElement.parentElement.parentElement.scrollTop);z-index:2;}
/*行列交叉的地方*/
.scrollCR { z-index:3;}
/*div外框*/
.scrollDiv {height:400px;clear: both; border: 1px solid #EEEEEE;OVERFLOW: scroll;width: 900px; }
/*行头居中*/
.scrollColThead td,.scrollColThead th{ text-align: center ;}
/*行头列头背景*/
.scrollRowThead,.scrollColThead td,.scrollColThead th{background-color:EEEEEE;}
/*表格的线*/
.scrolltable{border-bottom:1px solid #CCCCCC; border-right:1px solid #CCCCCC; }
/*单元格的线等*/
.scrolltable td,.scrollTable th{border-left: 1px solid #CCCCCC; border-top: 1px solid #CCCCCC; padding: 5px; }

.scrollTable thead th{background-color:#EEEEEE;font-weight:bold;position:relative;}
--> 
</style>
       
      </HEAD>
<body>

<div id="scrollDiv" class="scrollDiv">
<table border="0" cellpadding="3" cellspacing="0" width="1300" class="scrollTable">
	<thead>
<tr class="scrollColThead"  >
  <th class="scrollRowThead scrollCR"  >&nbsp;</th>
  <th colspan="2">列头</th>
  <th colspan="2">列头</th>
  <th colspan="2">列头</th>
  <th colspan="2">列头</th>
  <th colspan="2">列头</th>
  <th rowspan="2">列头</th>
</tr>
<tr class="scrollColThead"  >
  <th class="scrollRowThead scrollCR"  >h1</th>
  <th >h2</th>
  <th >h3</th>
  <th >h4</th>
   <th >h3</th>
    <th >h4</th>
   <th >h3</th>
    <th >h4</th>
   <th >h3</th>
  <th >h4</th>
  <th >h5</th>
</tr>
</thead>
<tr>
  <td class="scrollRowThead"  >
	<input type="checkbox" name="checkbox" value="checkbox">
	a</td>
  <td>单元格2</td>
  <td>单元格3</td>
  <td>单元格4</td>
  <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
</tr>
<tr>
  <td class="scrollRowThead"  >
	<input type="checkbox" name="checkbox" value="checkbox">
	a</td>
  <td>单元格2</td>
  <td>单元格3</td>
  <td>单元格4</td>
  <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
</tr>
<tr>
  <td class="scrollRowThead"  >
	<input type="checkbox" name="checkbox" value="checkbox">
	a</td>
  <td>单元格2</td>
  <td>单元格3</td>
  <td>单元格4</td>
  <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
</tr>
<tr>
  <td class="scrollRowThead"  >
	<input type="checkbox" name="checkbox" value="checkbox">
	a</td>
  <td>单元格2</td>
  <td>单元格3</td>
  <td>单元格4</td>
  <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
</tr>
<tr>
  <td class="scrollRowThead"  >
	<input type="checkbox" name="checkbox" value="checkbox">
	a</td>
  <td>单元格2</td>
  <td>单元格3</td>
  <td>单元格4</td>
  <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
</tr>
<tr>
  <td class="scrollRowThead"  >
	<input type="checkbox" name="checkbox" value="checkbox">
	a</td>
  <td>单元格2</td>
  <td>单元格3</td>
  <td>单元格4</td>
  <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
</tr>
<tr>
  <td class="scrollRowThead"  >
	<input type="checkbox" name="checkbox" value="checkbox">
	a</td>
  <td>单元格2</td>
  <td>单元格3</td>
  <td>单元格4</td>
  <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
</tr>
<tr>
  <td class="scrollRowThead"  >
	<input type="checkbox" name="checkbox" value="checkbox">
	a</td>
  <td>单元格2</td>
  <td>单元格3</td>
  <td>单元格4</td>
  <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
</tr>
<tr>
  <td class="scrollRowThead"  >
	<input type="checkbox" name="checkbox" value="checkbox">
	a</td>
  <td>单元格2</td>
  <td>单元格3</td>
  <td>单元格4</td>
  <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
</tr>
<tr>
  <td class="scrollRowThead"  >
	<input type="checkbox" name="checkbox" value="checkbox">
	a</td>
  <td>单元格2</td>
  <td>单元格3</td>
  <td>单元格4</td>
  <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
</tr>
<tr>
  <td class="scrollRowThead"  >
	<input type="checkbox" name="checkbox" value="checkbox">
	a</td>
  <td>单元格2</td>
  <td>单元格3</td>
  <td>单元格4</td>
  <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
</tr>
<tr>
  <td class="scrollRowThead"  >
	<input type="checkbox" name="checkbox" value="checkbox">
	a</td>
  <td>单元格2</td>
  <td>单元格3</td>
  <td>单元格4</td>
  <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
   <td>单元格5</td>
  <td>单元格5</td>
  <td>单元格5</td>
</tr>



</table>

</div>


</body>
</html>

相关推荐

    firefox下绝对定位元素重叠造成不可点击问题

    在Firefox浏览器中,当涉及到CSS布局的绝对定位(absolute positioning)时,可能会遇到一个常见的问题:元素重叠导致某些元素变得不可点击。这个问题通常出现在有多个绝对定位元素且它们的位置相互覆盖时。本文将...

    firefox 浏览器结构分析

    Firefox的用户界面是用户与浏览器交互的第一层,它包括地址栏、菜单、选项卡等元素。用户界面的设计需要考虑到易用性和美观性,同时也需要能够灵活地适应不同的操作系统环境。Firefox使用了XUL(XML User Interface ...

    火狐Firefox浏览器安装Selenium_IDE的步骤

    ### 火狐Firefox浏览器安装Selenium IDE的详细步骤 #### 一、Selenium IDE简介 Selenium IDE是一款基于Firefox的集成开发环境工具,它允许用户通过简单的点击操作来记录和回放测试脚本,无需编写任何代码。这对于刚...

    火狐Firefox浏览器驱动geckodriver最新版

    火狐Firefox浏览器驱动geckodriver是自动化测试领域中的一个重要工具,主要用于与Firefox浏览器进行交互,它是基于Selenium WebDriver标准的。Selenium WebDriver是一个用于Web应用程序自动化测试的接口,允许程序员...

    firefox浏览器驱动+selenium,firefox浏览器驱动+selenium,使用firefox浏览器自动化测试

    首先,Selenium是一个开源的Web应用程序自动化测试框架,它支持多种浏览器,包括Firefox。Selenium WebDriver是Selenium的一部分,它允许通过编程语言直接控制浏览器,执行一系列用户操作,如点击按钮、填写表单、...

    火狐Firefox浏览器的插件Video DownloadHelper 8.0 的合作应用VdhCoAppSetup2.0.11

    亲测 火狐Firefox浏览器的插件Video DownloadHelper 8.0 的合作应用VdhCoAppSetup2.0.11

    webdriver模拟火狐firefox浏览器

    Firefox是一款开源的网络浏览器,以其安全、可定制性以及对最新Web技术的支持而广受欢迎。 在使用WebDriver模拟火狐Firefox浏览器时,我们需要以下关键知识点: 1. Selenium WebDriver:Selenium是一个强大的Web...

    firefox浏览器52.3 arm版本

    firefox浏览器52.3 arm版本

    FireFox正常 IE错位的绝对定位元素

    这可能是由于IE6对定位计算的一种错误实现,导致在特定条件下无法识别绝对定位元素。 4. **CSS hack和兼容性解决方案**: 解决此类问题的一种策略是使用CSS hack,专门为IE6编写特殊的样式规则。例如,可以使用...

    adguard-firefox浏览器插件

    adguard_firefox浏览器插件 20230618

    android 4.0 firefox 浏览器

    android 4.0 firefox 浏览器。支持最新版4.0

    firefox浏览器插件

    firefox浏览器插件firefox浏览器插件firefox浏览器插件firefox浏览器插件firefox浏览器插件firefox浏览器插件firefox浏览器插件

    C# 实时获取IE和FireFox浏览器中URL

    经过三天的苦战,查询无数的国外网站终于实现了对IE和FireFox浏览器的URl地址实时监控。利用API和DDE分别对IE和FireFox进行了浏览器地址获取,完整的源码程序,与大家分享学习。后期将完善,实现对IE,FireFox,360,...

    Firefox浏览器兼容JS脚本

    本文将围绕Firefox浏览器与Internet Explorer(简称IE)之间关于JavaScript脚本的兼容性差异进行详细探讨,并通过具体的示例来帮助开发者更好地理解和解决实际开发过程中遇到的问题。 #### 二、关键知识点详解 ###...

    前端标准在各浏览器中的差异

    创建BFC的常见方法包括浮动元素、绝对定位元素、`display: inline-block`、`table-cell`、`table-caption`以及设置`overflow`属性为非`visible`值的元素。 ##### `hasLayout`与`BFC`异同分析 1. **浮动元素的处理*...

    firefox浏览器恢复书签

    本文将详细介绍如何在不同情况下恢复Firefox浏览器中的丢失书签,包括常规的本地恢复方法,以及一些可能不被广泛知晓的技巧。 #### 二、基础知识:了解书签存储位置 在深入讨论具体的恢复步骤之前,首先需要了解...

    Firefox Driver

    在进行自动化测试时,Firefox Geckodriver提供了一套丰富的API,可以用来定位和操作DOM元素,执行网络请求监控,以及处理各种浏览器特定的事件。这使得开发者能够对网页应用进行全面的测试,确保其在不同环境下的...

Global site tag (gtag.js) - Google Analytics