表格单元格内的css绝对位置:奇怪的Firefox显示

Posted

技术标签:

【中文标题】表格单元格内的css绝对位置:奇怪的Firefox显示【英文标题】:css absolute position inside table-cell: strange Firefox display 【发布时间】:2013-07-22 09:29:36 【问题描述】:

我有一个简单的水平菜单,有两个级别。此菜单延伸到包装器的 100% 宽度。这是小提琴:http://jsfiddle.net/gpsgv/

如果您在除 Firefox 之外的任何浏览器中运行此小提琴,它会按预期显示以下内容:

如果你在 Firefox 中运行这个小提琴,它会显示以下内容:

查看代码,二级列表绝对位于一级项(具有display: relative 样式)内。因此,将left: 10px 样式设置为二级列表应将其定位在距其相对定位的祖先左侧10px 处。 top: 30px 也是如此。但在 Firefox 中,它却将其定位在左侧和顶部我不知道是什么,也许是正文?

我的问题是,有什么解决方案可以让它在 Firefox 中正确显示,而无需更改 HTML

附:我使用 display: table-cell 是因为菜单必须沿 100% 容器宽度均匀分布。

【问题讨论】:

【参考方案1】:

不要使用left:10px;,而是使用left:auto;

这是解决方法,而不是真正的解决方案。

【讨论】:

【参考方案2】:

你也应该给最上面的ul一个相对位置,否则它确实会使用窗口本身(或主体)作为定位偏移量。

查看:http://jsfiddle.net/gpsgv/13/

编辑

经过一些激烈的辩论(见下面的 cmets),Firefox 似乎在处理类似表格的块方面更加严格。除了在包含二级列表的列表项中添加一个 wrapper-div 之外,我找不到这个的跨浏览器解决方案。当我创建这样的菜单时,我总是使用浮动技术。在调整列表项的大小方面,您需要做更多的工作(因为表格本身会填满空间)。基本上你会这样做:

html

<ul class="nav">
    <li>
        First level 1
        <ul>
            <li>Second level 1</li>
            <li>Second level 2</li>
        </ul>
    </li>
    <li>First level 2</li>
    <li>First level 3</li>
    <li>First level 4</li>
</ul>

CSS:

ul.nav  
    float: left; /* Needed as a kind of clearfix. Other clearfix techniques also possible */


/* be sure to add the > to prevent from second level li's to float */
ul.nav > li 
    float: left;
    position: relative;


ul.nav > li > ul 
    position: absolute;
    top: 30px;
    left: 10px;

要创建与 OP 想要的结果相同的结果,请查看这个小提琴(在 chrome 和 FF 中检查,没有 IE,但应该很好):http://jsfiddle.net/gpsgv/17/

【讨论】:

所有子项都对齐到第一个块的左侧 ehrm...我亲爱的@maximkou,你见过小提琴吗?它就像一个魅力(我已经在 chrome 和 firefox 中检查过它)。如果没有,请告诉我您看到了什么以及您使用的浏览器。 我正在检查 Firefox 22.0,在 Chrome 中一切正常,是的。操作系统视窗 7 我也是……以及我问题的另一部分;你到底看到了什么?因为我的 Firefox 完全按照 OP 的要求呈现它...... 我现在不知道。我看到了我看到的。【参考方案3】:

不改变 html - 无论如何。

position:absolute 强制display: block,在此处阅读:http://www.w3.org/TR/CSS2/visuren.html#dis-pos-flo

解决方案:将菜单项内容包装到其他元素:

<li> 
    <div class="menu-item-container">
        <a href="#">Item</a>

        <ul>
            <li>
                <a href="#">First</a>
            </li>
            <li>
                <a href="#">Second</a>
            </li>
        </ul>
    </div>
</li>

以及用于包装的 css:

.menu-item-container 
    position: relative;

【讨论】:

你怎么知道不改HTML就不能解决?根据 CSS 规则,它应该可以工作,(并且它正在工作,FF 除外) @camcam,位置:绝对力显示:块,读取w3.org/TR/CSS2/visuren.html#dis-pos-flo 唯一绝对定位的元素是二级列表。因此,作为块显示,它应该绝对定位在第一级&lt;li&gt; 内。相反,它绝对定位在 body 元素内。 @camcam,第一级“li”显示为“table-cell”,而不是“block”!这显然在您的代码中说明。相对于body放置是对的,请仔细阅读文档。 但问题不在于一级li,而在于二级ul。问题是,为什么 FF 看不到具有相对定位的正确祖先。

以上是关于表格单元格内的css绝对位置:奇怪的Firefox显示的主要内容,如果未能解决你的问题,请参考以下文章

表格单元格中的 CSS 绝对定位在 Firefox 中不起作用

在表格单元格内时出现 CSS z-index 问题

为啥“位置:绝对”时“显示:表格单元”会损坏

表格单元格内的 CSS 缩放和 div 对齐

Firefox 忽略表格单元格中的绝对定位

IE7 和 CSS 表格单元格属性