Ini adalah Q lama, tetapi solusi modern tanpa flexbox atau posisi benar-benar berfungsi seperti ini.
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>
Jadi mengapa ini berhasil?
Pada pandangan pertama tampaknya kita menggeser 50% ke kanan dan kemudian 50% ke kiri lagi. Itu akan menghasilkan nol shift, jadi apa?
Tetapi 50% tidak sama, karena konteks itu penting. Jika Anda menggunakan unit relatif, margin akan dihitung sebagai persentase dari lebar elemen induk , sedangkan transformasi akan menjadi 50% relatif terhadap elemen yang sama .
Kami memiliki situasi ini sebelum kami menambahkan CSS
+-------------------------------------------+
| Parent element P of E |
| |
+-----------------------------------------------------------+
| Element E |
+-----------------------------------------------------------+
| |
+-------------------------------------------+
Dengan gaya tambahan yang margin-left: 50%kami miliki
+-------------------------------------------+
| Parent element P of E |
| |
| +-----------------------------------------------------------+
| | Element E |
| +-----------------------------------------------------------+
| | |
+---------------------|---------------------+
|========= a ========>|
a is 50% width of P
Dan transform: translateX(-50%)bergeser kembali ke kiri
+-------------------------------------------+
| Parent element P of E |
| |
+-----------------------------------------------------------+
| Element E | |
+-----------------------------------------------------------+
|<============ b ===========| |
| | |
+--------------------|----------------------+
|========= a =======>|
a is 50% width of P
b is 50% width of E
Sayangnya ini hanya berfungsi untuk pemusatan horizontal karena perhitungan persentase margin selalu relatif terhadap lebar. Yaitu tidak hanya margin-leftdan margin-right, tetapi juga margin-topdanmargin-bottom dihitung sehubungan dengan lebar.
Kompatibilitas browser seharusnya tidak menjadi masalah:
https://caniuse.com/#feat=transforms2d