C'est un ancien Q, mais une solution moderne sans flexbox ni position absolue fonctionne comme ça.
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>
Alors pourquoi ça marche?
À première vue, il semble que nous nous déplaçons de 50% vers la droite, puis de 50% vers la gauche. Cela entraînerait un décalage nul, et alors?
Mais les 50% ne sont pas les mêmes, car le contexte est important. Si vous utilisez des unités relatives, une marge sera calculée en pourcentage de la largeur de l' élément parent , tandis que la transformation sera de 50% par rapport au même élément.
Nous avons cette situation avant d'ajouter le CSS
+-------------------------------------------+
| Parent element P of E |
| |
+-----------------------------------------------------------+
| Element E |
+-----------------------------------------------------------+
| |
+-------------------------------------------+
Avec le style ajouté que margin-left: 50%
nous avons
+-------------------------------------------+
| Parent element P of E |
| |
| +-----------------------------------------------------------+
| | Element E |
| +-----------------------------------------------------------+
| | |
+---------------------|---------------------+
|========= a ========>|
a is 50% width of P
Et les transform: translateX(-50%)
décalages vers la gauche
+-------------------------------------------+
| Parent element P of E |
| |
+-----------------------------------------------------------+
| Element E | |
+-----------------------------------------------------------+
|<============ b ===========| |
| | |
+--------------------|----------------------+
|========= a =======>|
a is 50% width of P
b is 50% width of E
Malheureusement, cela ne fonctionne que pour le centrage horizontal car le calcul du pourcentage de marge est toujours relatif à la largeur. Ie non seulement margin-left
et margin-right
, mais aussi margin-top
et margin-bottom
sont calculés par rapport à la largeur.
La compatibilité du navigateur ne devrait pas poser de problème:
https://caniuse.com/#feat=transforms2d