z-індекс скасовується шляхом встановлення перетворення (обертання)


84

Використовуючи властивість transform, z-індекс скасовується та з'являється спереду. (Коли ви коментуєте -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-індекс працюють разом?


Це скрипка, яку я зробив: Ви хочете приховати текст за допомогою z-index?
Surjith SM

Працюючи добре jsfiddle.net/raunakkathuria/8MQkP, в чому насправді сумніви?
Раунак Катурія

Дякуємо, що зробили скрипку. Я хочу показати тінь за текстовим прямокутником (як пост-це).
kbth

Відповіді:


140

Давайте пройдемося по тому, що відбувається. Для початку зверніть увагу, що z-indexна позиціонованих елементах і transformсам по собі створює нові " контексти складання " на елементах. Ось що відбувається:

Ваш .testелемент transformвстановив щось інше, ніж нічого, що надає йому власний контекст стекування.

Потім ви додаєте .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«s -webkit-transformправил Ви можете ще раз дати йому свій власний контекст стек, встановивши нове z-indexправило (будь-яке значення) .test(знову ж , тому що він розташований)!

То як ми можемо вирішити вашу проблему?

Щоб з-індекс працював так, як ви очікували, переконайтеся, що .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>

Є й інші способи зробити це, навіть кращі способи. Я, мабуть, зробив би фон "post-it" вміщуючим елементом, а потім помістив текст всередину, що, мабуть, було б найпростішим методом і зменшило б складність того, що у вас є.

Ознайомтесь із цією статтею, щоб отримати докладнішу інформацію про z-indexпорядок укладання та порядок укладання, або робочі характеристики W3C CSS3 щодо контексту укладання


4
Це було чудове пояснення одного з найскладніших аспектів розмітки CSS. Для подальшого читання перевірте специфікацію W3
AndyBean

11

Встановіть div, для якого ви хочете бути вгорі position:relative


1
У мене це спрацювало. Це пов’язано із згаданим вище контекстом стеків? Якщо хтось може допомогти пояснити це буде дуже вдячний.
glihm

7

Була подібна проблема, коли брати та сестри були б transform: translate()і z-indexне працювали.

Найпростішим рішенням є налаштування position: relativeна всіх братів і сестер, а потім z-indexбуде працювати знову.


5

Швидке виправлення: Ви також можете просто повернути інший елемент на 0 градусів.


Це спрацювало для мене у випадку, коли я не міг обертати контейнер
Деніел

1
У мене була дивна проблема з тим, що z-index не спостерігався, а потім застосування стилю transform:rotate(0.0rad)це виправило. Я не міг застосувати його за допомогою правила css, це повинно було бути безпосередньо на елементі. Це НЕ має сенсу, але дякую за розміщення відповіді, яка змусила мене спробувати.
Ендрю Шеперд

1

Я стикався з подібною проблемою. Те, що я зробив, це те, що я додав обертку div навколо тесту і надав властивість transform обгортці div.

.wrapper{
    transform: rotate(10deg);
}

ось скрипка http://jsfiddle.net/KmnF2/16/


-1

Встановіть div, для якого ви хочете залишатися вгорі, на позицію: absolute

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