Đây là một Q cũ, nhưng một giải pháp hiện đại không có flexbox hoặc vị trí hoạt động tuyệt đối như thế này.
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>
Vậy tại sao nó hoạt động?
Thoạt nhìn có vẻ như chúng ta dịch chuyển 50% sang phải và sau đó 50% sang trái. Điều đó sẽ dẫn đến sự thay đổi bằng không, vậy thì sao?
Nhưng 50% không giống nhau, vì bối cảnh rất quan trọng. Nếu bạn sử dụng các đơn vị tương đối, một lề sẽ được tính bằng tỷ lệ phần trăm chiều rộng của phần tử cha , trong khi biến đổi sẽ là 50% so với phần tử tương tự .
Chúng tôi có tình huống này trước khi chúng tôi thêm CSS
+-------------------------------------------+
| Parent element P of E |
| |
+-----------------------------------------------------------+
| Element E |
+-----------------------------------------------------------+
| |
+-------------------------------------------+
Với phong cách thêm vào, margin-left: 50%
chúng tôi có
+-------------------------------------------+
| Parent element P of E |
| |
| +-----------------------------------------------------------+
| | Element E |
| +-----------------------------------------------------------+
| | |
+---------------------|---------------------+
|========= a ========>|
a is 50% width of P
Và sự transform: translateX(-50%)
dịch chuyển về bên trái
+-------------------------------------------+
| Parent element P of E |
| |
+-----------------------------------------------------------+
| Element E | |
+-----------------------------------------------------------+
|<============ b ===========| |
| | |
+--------------------|----------------------+
|========= a =======>|
a is 50% width of P
b is 50% width of E
Thật không may, điều này chỉ hoạt động đối với định tâm ngang vì tính toán tỷ lệ phần trăm lề luôn luôn tương đối với chiều rộng. Tức là không chỉ margin-left
và margin-right
, mà còn margin-top
và margin-bottom
được tính theo chiều rộng.
Khả năng tương thích trình duyệt sẽ không có vấn đề:
https://caniuse.com/#feat=transforms2d