【发布时间】:2019-02-02 06:06:41
【问题描述】:
看起来,当缩小以前不适合其容器的元素时,margin: 0 auto 将不再在其父元素中居中(请注意,使用transform-origin: center center 不能解决此问题)。这是因为自动边距似乎在缩放之前而不是之后应用(我预计是后者)。
在玩这个的过程中,我最终设法使元素在其容器中居中,但仅使用绝对定位:
position: absolute;
transform: translateX(-50%) scale(0.5, 0.5);
left: 50%;
这是一种非常流行的技术,但在这种特殊情况下,将 translateX 函数放置在 缩放函数之前很重要,因为它们按定义的顺序执行。
以下是说明问题的 sn-p 代码(也在 CodePen 上:https://codepen.io/liranh85/pen/qVewQp)
.container {
border: 3px solid black;
width: 500px;
height: 200px;
margin: 0 auto;
position: relative;
}
.scaled {
background-color: blue;
width: 600px;
/* width: 400px; */
height: 100%;
transform: scale(0.5, 0.5);
/* transform: translateX(-50%) scale(0.5, 0.5); */
margin: 0 auto;
/* position: absolute;
left: 50%; */
}
<div class="container">
<div class="scaled"></div>
</div>
注意:
- 当元素的宽度大于其容器的宽度时,该元素不会使用自动边距居中。
- 当为缩放后的元素提供小于其容器的宽度时,缩放后它将保持居中(例如,尝试使用
width: 400px)。 - 使用绝对定位时,如上所述,可以使元素居中。
我想知道:
- 还有其他人遇到过这个问题吗?
- 这是使此类元素居中的最佳方式吗?
- 我是否正确地说不能使用自动边距来居中这样的元素?
【问题讨论】:
-
我对你的要求有点迷茫。只是一些笔记。缩放不应成为您定位的一部分(如果您愿意,可以缩放一个孩子) Margin auto 仅适用于剩余空间,而不是负数。对于居中,您可以使用
calc和vw或flex(请参阅相关问题)