これは古い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