z-index
[〜#〜] css [〜#〜] プロパティを介して逆説的な効果を作成したいと思います。
私のコードでは、下の画像のように5つの円があり、それらはすべてz-index
が定義されていない絶対位置にあります。したがって、デフォルトでは、すべての円が前の円と重なっています。
現在、円5は円1とオーバーラップしています(左の画像)。私が達成したいパラドックスは、同時に、サークル1をサークル2の下に、サークル5の上に(右の画像のように)持つことです。
(ソース: schramek.cz )
これが私のコードです
マークアップ:
<div class="item i1">1</div>
<div class="item i2">2</div>
<div class="item i3">3</div>
<div class="item i4">4</div>
<div class="item i5">5</div>
[〜#〜] css [〜#〜]
.item {
width: 50px;
height: 50px;
line-height: 50px;
border: 1px solid red;
background: silver;
border-radius: 50%;
text-align: center;
}
.i1 { position: absolute; top: 30px; left: 0px; }
.i2 { position: absolute; top: 0px; left: 35px; }
.i3 { position: absolute; top: 30px; left: 65px; }
.i4 { position: absolute; top: 70px; left: 50px; }
.i5 { position: absolute; top: 70px; left: 15px; }
実際の例は http://jsfiddle.net/Kx2k5/ でも入手できます。
スタッキングオーダーやスタッキングコンテキストなど、さまざまなテクニックを試しました。これらのテクニックに関する記事をいくつか読んだが、成功しなかった。どうすればこれを解決できますか?
これが私の試みです: http://jsfiddle.net/Kx2k5/1/
(_Fx27
_、_Ch33
_、_IE9
_、_Sf5.1.10
_および_Op19
_でのテストに成功)
[〜#〜] css [〜#〜]
_.item {
/* include borders on width and height */
-webkit-box-sizing : border-box;
-moz-box-sizing : border-box;
box-sizing : border-box;
...
}
.i1:after {
content: "";
/* overlap a circle over circle #1 */
position : absolute;
z-index : 1;
top : 0;
left : 0;
height : 100%;
width : 100%;
/* inherit border, background and border-radius */
background : inherit;
border-bottom : inherit;
border-radius : inherit;
/* only show the bottom area of the pseudoelement */
clip : rect(35px 50px 50px 0);
}
_
基本的に、最初の円の上に_:after
_疑似要素を重ねて(一部のプロパティが継承されています)、次にclip()
プロパティを使用してそれをクリップしました。 _#1
_は円と重なります_#5
_)。
ここで使用したCSSプロパティの場合、この例はIE8でも機能するはずです(_box-sizing
_、clip()
、inherit
、およびそこでは擬似要素がサポートされています)
結果の効果のスクリーンショット
私の試みもclip
を使用しています。アイデアは、div
を半分ずつ持つことでした。そうすれば、z-index
を設定しても機能します。
したがって、上部をz-index: -1
に、下部をz-index: 1
に設定できます。
.item {
width: 50px;
height: 50px;
line-height: 50px;
border: 1px solid red;
background: silver;
border-radius: 50%;
text-align: center;
}
.under {
z-index: -1;
}
.above {
z-index: 1;
overflow: hidden;
clip: rect(30px 50px 60px 0);
}
.i1 {
position: absolute;
top: 30px;
left: 0px;
}
.i2 {
position: absolute;
top: 0px;
left: 35px;
}
.i3 {
position: absolute;
top: 30px;
left: 65px;
}
.i4 {
position: absolute;
top: 70px;
left: 50px;
}
.i5 {
position: absolute;
top: 70px;
left: 15px;
}
<div class="item i1 under">1</div>
<div class="item i1 above">1</div>
<div class="item i2">2</div>
<div class="item i3">3</div>
<div class="item i4">4</div>
<div class="item i5">5</div>
注:テスト済みIE 10 +、FF 26 +、Chrome 33 +、Safari 5.1.7+。
これが私の挑戦です。
また、最初の円の上に配置された疑似要素を使用しますが、クリップを使用するのではなく、背景を透明にして、円の背景色(シルバー)と一致するボックスの影と赤を赤に設定します。円の境界線の右下をカバーする境界線。
CSS(開始点とは異なります)
.i1 {
position: absolute; top: 30px; left: 0px;
&:before {
content: '';
position: absolute;
z-index: 100;
top: 0;
left: 0;
width: 50px;
height: 50px;
border-radius: 50%;
box-shadow: inset 5px -5px 0 6px silver;
border-bottom: solid 1px red;
}
}
最終製品
悲しいことに、次の例は理論上の答えです。何らかの理由で-webkit-transform-style: preserve-3d;
を動作させることができません(明らかな間違いを犯さなければなりませんが、理解できないようです)。いずれにせよ、あなたの質問を読んだ後、私は-すべてのパラドックスと同様に-なぜそれが本当の不可能ではなく、明らかに不可能であるのか疑問に思いました。さらに数秒後、実生活では葉が少し回転しているので、そのようなものが存在していることがわかりました。それで、私はテクニックの簡単なデモンストレーションを作りたかったのですが、前のプロパティなしでは不可能です(フラットな親レイヤーに描画されます)。いずれにせよ、ここに基本コードがあります
<div class="container">
<div>
<div class="i1 leaf">
<div class="item">1</div>
</div>
<div class="i2 leaf">
<div class="item">2</div>
</div>
<div class="i3 leaf">
<div class="item">3</div>
</div>
<div class="i4 leaf">
<div class="item">4</div>
</div>
<div class="i5 leaf">
<div class="item">5</div>
</div>
</div>
</div>
そしてCSS:
.i1 {
-webkit-transform:rotateZ(288deg)
}
.i2 {
-webkit-transform:rotateZ(0deg)
}
.i3 {
-webkit-transform:rotateZ(72deg)
}
.i4 {
-webkit-transform:rotateZ(144deg)
}
.i5 {
-webkit-transform:rotateZ(216deg)
}
.leaf {
position:absolute;
left:35px;
top:35px;
}
.leaf > .item {
-webkit-transform:rotateY(30deg) translateY(35px)
}
そして、あなたは ここで完全なコード を見つけることができます。
[〜#〜] html [〜#〜]
<div class="item i1">1</div>
<div class="item i2">2</div>
<div class="item i3">3</div>
<div class="item i4">4</div>
<div id="five">5</div>
<div class="item2 i5"></div>
<div class="item3 i6"></div>
[〜#〜] css [〜#〜]
.item {
width: 50px;
height: 50px;
line-height: 50px;
border: 1px solid red;
background: silver;
border-radius: 50%;
text-align: center;
}
.item2 {
width: 25px;
height: 50px;
line-height: 50px;
border: 1px solid red;
border-right: none;
border-radius: 50px 0 0 50px;
background: silver 50%;
background-size: 25px;
text-align: center;
z-index: -3;
}
.item3 {
width: 25px;
height: 50px;
line-height: 50px;
border: 1px solid red;
border-left: none;
border-radius: 0 50px 50px 0;
background: silver 50%;
background-size: 25px;
text-align: center;
}
.i1 {
position: absolute;
top: 30px;
left: 0px;
}
.i2 {
position: absolute;
top: 0px;
left: 35px;
}
.i3 {
position: absolute;
top: 30px;
left: 65px;
}
.i4 {
position: absolute;
top: 70px;
left: 55px;
}
.i5 {
position: absolute;
top: 70px;
left: 15px;
}
.i5 {
position: absolute;
top: 72px;
left:19px;
}
.i6 {
position: absolute;
top: 72px;
left: 44px;
}
#five {
position: absolute;
top: 88px;
left: 40px;
z-index: 100;
}
IE8でも動作します。
[〜#〜] html [〜#〜]
<div class="half under"><div class="item i1">1</div></div>
<div class="half above"><div class="item i1">1</div></div>
<div class="item i2">2</div>
<div class="item i3">3</div>
<div class="item i4">4</div>
<div class="item i5">5</div>
[〜#〜] css [〜#〜]
.item {
width: 50px;
height: 50px;
line-height: 50px;
border: 1px solid red;
background: silver;
border-radius: 50%;
text-align: center;
}
.half {
position: absolute;
overflow: hidden;
width: 52px;
height: 26px;
line-height: 52px;
text-align: center;
}
.half.under {
top: 30px;
left: 0px;
z-index: -1;
border-radius: 90px 90px 0 0;
}
.half.above {
top: 55px;
left: 0px;
z-index: 1;
border-radius: 0 0 90px 90px;
}
.half.above .i1 { margin-top:-50%; }
.i2 { position: absolute; top: 0px; left: 35px;}
.i3 { position: absolute; top: 30px; left: 65px;}
.i4 { position: absolute; top: 70px; left: 50px; }
.i5 { position: absolute; top: 70px; left: 15px; }