นี่คือ 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