使用绝对位置和边距自动垂直对齐子元素在 FireFox 中失败

Posted

技术标签:

【中文标题】使用绝对位置和边距自动垂直对齐子元素在 FireFox 中失败【英文标题】:Vertical aligning a child element with position absolute and margin auto fails in FireFox 【发布时间】:2015-07-23 13:48:51 【问题描述】:

我正在尝试对齐父容器内的子元素。 下面你会从我的代码中看到一个 sn-p。只是使其工作的基础知识:

// html //

<div class="parent">
    <div>Parent</div>
    <div class="child"></div>
</div>


// CSS //

.parent  position: relative; 

.child 
    position: absolute;
    margin: auto;
    height: 60px;
    width: 40px;
    top: 0;
    right: 0;
    bottom: 0;

Chrome & IE

火狐

View example on jsfiddle

如果您在 Chrome 或 IE 中查看它,它会居中对齐。 但在 Firefox 中却不是。 这是 Firefox 的错误,还是 Chrome 和 IE 做错了?

当您使子项小于父项(高度)时,它在 Firefox 中也正确对齐在中心。只有当它更大时才会出现这个问题。

【问题讨论】:

好吧,你确实有冲突的价值观。 .child 不能同时是 top: 0bottom: 0,除非孩子的身高与父母的身高完全相同。例如你有1米高。同时将手放在天花板上,脚放在 2 米高房间的地板上……不允许拉伸。 @MarcB - 这是在相对定位的容器中垂直居中绝对定位元素的常用技术,假设边距设置为自动。 【参考方案1】:

从子元素中移除底部属性并将顶部设置为“-20px”。这被测试为在 Firefox DE 中工作 ^^。您也可以 -100%,我会说如果父级高度发生变化,这会导致问题,但是如果父级高度发生变化,则在子级上设置高度,您可能必须使用计算。

【讨论】:

我知道如何让它工作,这不是问题。我想知道正确的行为是什么。 那么在这种情况下回答为什么,作为评论提到 top:0 和 bottom:0 是冲突的。有人提到垂直对齐,但您设置了固定高度。【参考方案2】:

我想我找到了解决此问题的方法,因此它在 Chrome、IE 和 Firefox 中的行为相同。

代替:

top: 0;
bottom: 0;

我试过了:

top: 50%;
transform: translateY(-50%);

这似乎有效,即使在 IE9 中也是如此。

View example on jsfiddle

【讨论】:

以上是关于使用绝对位置和边距自动垂直对齐子元素在 FireFox 中失败的主要内容,如果未能解决你的问题,请参考以下文章

与 css 垂直对齐时,何时使用绝对位置与相对位置

如何垂直居中对齐位置:相对元素?

如何在其父 div 的中心对齐绝对位置子元素 [重复]

如何在容器中垂直居中行? [复制]

与边距水平对齐,同时不丢失垂直对齐

CSS位置固定和边距0自动