Це давнє питання Q, але сучасне рішення без флексбоксу або абсолютного положення працює так.
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