CSS Z-индекс парадокс цветок
Я хотел бы создать парадоксальный эффект через z-index
CSS собственность.
в моем коде у меня есть пять кругов, как на изображении ниже, и все они абсолютно расположены без определенного z-index
. Поэтому, по умолчанию, каждый круг перекрывает предыдущий.
прямо сейчас, круг 5 перекрывает круг 1 (левое изображение). Парадокс, которого я хотел бы достичь, состоит в том, чтобы иметь в то же время круг 1 под кругом 2 и поверх круга 5 (как в правое изображение.)
http://paradox.schramek.cz/1.jpg
вот мой код
разметка:
<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/.
Я пробовал много методов с укладкой заказов, укладкой контекста и так далее. Я читал некоторые статьи об этих методах, но без успеха. Как я могу решить это?
6 ответов:
вот моя попытка: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; }