Dies ist ein altes Q, aber eine moderne Lösung ohne Flexbox oder Positions absolut funktioniert so.
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>
Warum funktioniert es also?
Auf den ersten Blick scheinen wir 50% nach rechts und dann wieder 50% nach links zu verschieben. Das würde zu einer Nullpunktverschiebung führen, na und?
Aber die 50% sind nicht gleich, weil der Kontext wichtig ist. Wenn Sie relative Einheiten verwenden, wird ein Rand als Prozentsatz der Breite des übergeordneten Elements berechnet , während die Transformation 50% relativ zum selben Element beträgt.
Wir haben diese Situation, bevor wir das CSS hinzufügen
+-------------------------------------------+
| Parent element P of E |
| |
+-----------------------------------------------------------+
| Element E |
+-----------------------------------------------------------+
| |
+-------------------------------------------+
Mit dem zusätzlichen Stil haben margin-left: 50%
wir
+-------------------------------------------+
| Parent element P of E |
| |
| +-----------------------------------------------------------+
| | Element E |
| +-----------------------------------------------------------+
| | |
+---------------------|---------------------+
|========= a ========>|
a is 50% width of P
Und die transform: translateX(-50%)
Verschiebung zurück nach links
+-------------------------------------------+
| Parent element P of E |
| |
+-----------------------------------------------------------+
| Element E | |
+-----------------------------------------------------------+
|<============ b ===========| |
| | |
+--------------------|----------------------+
|========= a =======>|
a is 50% width of P
b is 50% width of E
Leider funktioniert dies nur für die horizontale Zentrierung, da die Berechnung des Randprozentsatzes immer relativ zur Breite ist. Dh nicht nur margin-left
und margin-right
, sondern auch margin-top
undmargin-bottom
werden in Bezug auf die Breite berechnet.
Die Browserkompatibilität sollte kein Problem sein:
https://caniuse.com/#feat=transforms2d