変換プロパティを使用すると、z-indexはキャンセルされ、前面に表示されます。 (-webkit-transformをコメントアウトすると、z-indexは以下のコードで適切に機能します)
.test {
width: 150px;
height: 40px;
margin: 30px;
line-height: 40px;
position: relative;
background: white;
-webkit-transform: rotate(10deg);
}
.test:after {
width: 100px;
height: 35px;
content: "";
position: absolute;
top: 0;
right: 2px;
-webkit-box-shadow: 0 5px 5px #999;
/* Safari and Chrome */
-webkit-transform: rotate(3deg);
/* Safari and Chrome */
transform: rotate(3deg);
z-index: -1;
}
<html>
<head>
<title>transform</title>
<link rel="stylesheet" type="text/css" href="transformtest.css">
</head>
<body>
<div class="test">z-index is canceled.</div>
</body>
</html>
変換とz-indexはどのように連携しますか?
何が起こっているかを見ていきましょう。開始するには、配置された要素に_z-index
_があり、transform
自体が要素に新しい " stacking contexts "を作成することに注意してください。ここで何が起こっているのですか:
_.test
_要素にはtransform
がnone以外に設定されており、独自のスタッキングコンテキストを提供します。
次に、_.test:after
_の子である_.test
_疑似要素を追加します。この子には_z-index: -1
_があり、_.test:after
_のスタックコンテキスト内で_.test
_のスタックレベルを設定し、_z-index: -1
_の_.test:after
_を設定します_.test
_は特定のスタッキングコンテキスト内でのみ意味を持つため、__は_z-index
_の後ろに配置しません。
_-webkit-transform
_を_.test
_から削除すると、スタッキングコンテキストが削除され、_.test
_と_.test:after
_がスタッキングコンテキスト(_<html>
_の)を共有し、_.test:after
_遅れる_.test
_。 _.test
_の_-webkit-transform
_ルールを削除した後、再び_z-index
_ルール(任意の値)を_.test
_に設定することにより、独自のスタッキングコンテキストを与えることができます(再び、配置されているため)!
では、どのように問題を解決しますか?
Z-indexを期待どおりに機能させるには、_.test
_と_.test:after
_が同じスタッキングコンテキストを共有していることを確認してください。問題は、トランスフォームで_.test
_を回転させたいということですが、そうすることは、独自のスタッキングコンテキストを作成することを意味します。幸いなことに、_.test
_をラッピングコンテナに入れて回転させると、子はスタックコンテキストを共有しながら、両方を回転させることができます。
ここから始めました: http://jsfiddle.net/fH64Q/
そして、スタッキングコンテキストを回避して回転を維持する方法を次に示します(_.test
_の白い背景のために影が少し途切れることに注意してください)。
_.wrapper {
-webkit-transform: rotate(10deg);
}
.test {
width: 150px;
height: 40px;
margin: 30px;
line-height: 40px;
position: relative;
background: white;
}
.test:after {
width: 100px;
height: 35px;
content: "";
position: absolute;
top: 0;
right: 2px;
-webkit-box-shadow: 0 5px 5px #999; /* Safari and Chrome */
-webkit-transform: rotate(3deg); /* Safari and Chrome */
transform: rotate(3deg);
z-index: -1;
}
_
_<div class="wrapper">
<div class="test">z-index is canceled.</div>
</div>
_
これを行う方法は他にもありますが、より良い方法もあります。おそらく、「ポストイット」背景を含む要素にしてからテキストを挿入すると、おそらく最も簡単な方法になり、所有しているものの複雑さが軽減されます。
この記事 _z-index
_とスタック順序の詳細を確認するか、または コンテキストのスタックに関するW3C CSS3の仕様 をご覧ください。
クイックフィックス:他の要素を0度だけ回転させることもできます。
一番上に置きたいdivをposition:relative
に設定します
私は同様の問題に直面していました。私がやったことは、テストの周りにラッパーdivを追加し、ラッパーdivにtransformプロパティを与えました。
.wrapper{
transform: rotate(10deg);
}
ここにフィドルがあります http://jsfiddle.net/KmnF2/16/
兄弟がtransform: translate()
'dおよびz-index
は機能しません。
最も簡単な解決策は、position: relative
すべての兄弟、次にz-index
は再び機能します。