Квітка парадокса CS-z-індексу


98

Я хотів би створити парадоксальний ефект через властивість z-index CSS .

У моєму коді є п’ять кіл, як на зображенні нижче, і всі вони абсолютно розміщені без визначеного 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/ .

Я перепробував багато прийомів із складанням замовлень, складанням контексту тощо. Я прочитав деякі статті про ці методи, але успіху не було. Як я можу це вирішити?


10
Якщо це лише виклик кодування, можливо, це належить до codegolf?
TylerH

12
Я думаю, що ОП шукає допомоги. Він означає, що це буде завданням для вирішення цього питання. Я думаю, що це те, чому багато чого навчиться колись зробити. Я для одного можу вважати цю техніку корисною.
ЛОТУЗМИ

@ 1ubos. Жодного jquery / JS взагалі? Мені здається, що буде потрібно певне логічне використання IndexOf
LOTUSMS

5
це неможливо за допомогою z-індексу. z-індекс визначає шари, його послідовність цілих чисел: -x, 0, x ви не можете мати: x1 <x2 <x1
gondo

4
Будь ласка, не обходьте фільтр якості за допомогою підробленого блоку коду. Або включіть код у саме запитання, або видаліть загадку, якщо вона не є суттєвою. Крім того, я б радив вам переосмислити це як актуальну проблему з дослідженнями, а не ЗВ'ЯЗКУ, якщо ви хочете серйозно поставитися до вашого питання.
BoltClock

Відповіді:


91

Ось моя спроба: 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, і pseudoelements підтримується там)


Скріншот отриманого ефекту

введіть тут опис зображення


2
Схоже, я пізно потрапив на вечірку! Хороша робота! : P
Рудді

2
Сьогодні я не тільки навчився деяких CSS, але і трохи
підчеркнув

29

Мою спробу також використовую 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+.


будь-які ідеї з цього питання: stackoverflow.com/questions/22377416/how-to-warp-image#22377416
NoobEditor

18

Ось мій погляд на це.

Я також використовую псевдоелемент, розташований вгорі першого кола, але замість того, щоб використовувати кліп, я тримаю його фон прозорим і просто надаю йому вставку-тінь, що відповідає кольорові фону кіл (срібло), а також червоному рамка для покриття нижньої правої сторони межі кола.

Демо

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;
  }
}

Кінцевий продукт введіть тут опис зображення


Приємна відповідь! Єдине питання, на який я можу подумати, - це тени, які не підтримуються IE 8 і нижче. Псевдоелементи так і не підтримуються IE 7 і нижче :)
Прагматик

4

На жаль, наступне - це лише теоретична відповідь, оскільки я чомусь не можу прийти -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)
}

І ви можете знайти Повний код тут .


Для мене працює в Safari 7.0.2; можливо, це ваш браузер? - EDIT - mehehe, резерв-3d справді не працює. Розумний 3D все-таки :)
tomsmeding

2

JS Fiddle

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;
}

Ви могли трохи скоротити код, видаливши зайві речі в item2і item3. А також переїхав position: absoluteв .ixі #fiveв item, item2іitem3
webprogrammer

0

JS Fiddle LIVE DEMO

Працює і на 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; }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.