这是一个旧的 Q,但是没有 flexbox 或绝对位置的现代解决方案就是这样工作的。
margin-left: 50%;
transform: translateX(-50%);
.outer {
border: 1px solid green;
margin: 20px auto;
width: 20%;
padding: 10px 0;
/* overflow: hidden; */
}
.inner {
width: 150%;
background-color: gold;
/* Set left edge of inner element to 50% of the parent element */
margin-left: 50%;
/* Move to the left by 50% of own width */
transform: translateX(-50%);
}
<div class="outer">
<div class="inner">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quos exercitationem error nemo amet cum quia eaque alias nihil, similique laboriosam enim expedita fugit neque earum et esse ad, dolores sapiente sit cumque vero odit! Ullam corrupti iure eum similique magnam voluptatum ipsam. Maxime ad cumque ut atque suscipit enim quidem. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Excepturi impedit esse modi, porro quibusdam voluptate dolores molestias, sit dolorum veritatis laudantium rem, labore et nobis ratione. Ipsum, aliquid totam repellendus non fugiat id magni voluptate, doloribus tenetur illo mollitia. Voluptatum.</div>
</div>
那么它为什么起作用呢?
乍一看,我们似乎向右移动了 50%,然后又向左移动了 50%。这将导致零偏移,那又如何呢?
但 50% 不一样,因为上下文很重要。如果使用相对单位,边距将计算为父元素宽度的百分比,而变换将是相对于同一元素的 50%。
我们在添加CSS之前就有这种情况
+---------------------------+
| Parent element P of E |
| |
+-----------------------------------------+
| Element E |
+-----------------------------------------+
| |
+---------------------------+
随着margin-left: 50%
我们添加的样式
+---------------------------+
| Parent element P of E |
| |
| +-----------------------------------------+
| | Element E |
| +-----------------------------------------+
| | |
+-------------|-------------+
|>>>>> a >>>>>|
a is 50% width of P
和向左的transform: translateX(-50%)
转变
+---------------------------+
| Parent element P of E |
| |
+-----------------------------------------+
| Element E | |
+-----------------------------------------+
|<<<<<<<<< b <<<<<<<| |
| | |
+------------|--------------+
|>>>>> a >>>>|
a is 50% width of P
b is 50% width of E
不幸的是,这仅适用于水平居中,因为边距百分比计算始终与宽度相关。即不仅margin-left
和margin-right
,而且margin-top
和margin-bottom
是相对于宽度计算的。
浏览器兼容性应该没问题:
https ://caniuse.com/#feat=transforms2d