Z-индекс не ведет себя должным образом с абсолютным позиционированием внутри элемента фиксированного положения
у меня есть ситуация, когда у меня есть 2 или более фиксированных элементов позиции на странице, отображающей сложенные один поверх другого (то есть верхняя часть второго примыкает к нижней части первого - нет Z-индекса укладки этих элементов). Внутри первого элемента фиксированной позиции есть абсолютно позиционированный элемент, который выше своего фиксированного родителя, поэтому он выходит за пределы нижней части этого фиксированного родителя.
проблема в том, что следующий элемент фиксированной позиции отображается поверх абсолютно позиционированного элемента. У меня есть более высокое значение z-индекса, установленное на абсолютно позиционированном элементе, чем на фиксированных позиционированных элементах, но оно полностью игнорируется.
чтобы помочь прояснить проблему, я собрал этот пример:
HTML-код
<div class="fixed first">
<p>This is a fixed element</p>
<p class="abs">
I should be displayed above both fixed position elements
</p>
</div>
<div class="fixed second">
<p>This is a fixed element</p>
</div>
в CSS
.fixed {
font-size: 16px;
background: #eee;
border-bottom: 1px solid #ccc;
position: fixed;
height: 3em;
width: 100%;
z-index: 1;
}
.abs {
position: absolute;
background: #acc;
height: 6em;
top: 0;
left: 25%;
width: 50%;
z-index: 2;
}
.second {
top: 3.0625em;
}
вот рабочий пример на JSFiddle:
Я немного озадачен этим. У кого-нибудь есть объяснение, почему это происходит, и способ обойти это?
2 ответов
как намекает комментарий Пита, все сводится к контекстам укладки. В этом случае оба .fixed
элементы создают свои собственные контексты укладки в силу того, что position: fixed;
. Дитя первого .fixed
элемент создает контекст укладки вложенные в рамках своего родителя. Поскольку он вложен в существующий контекст стекирования, он никогда не может вырваться и стекаться выше; его z-индекс теперь относительно его родителя.
спецификация на самом деле несколько полезна с подробности:http://www.w3.org/TR/CSS2/visuren.html#z-index. Вы можете видеть через нумерованный список, что дочерние контексты укладки окрашены мертвыми последними.
Итак, в вашем случае, ваш .fixed.first
элемент должен иметь Z-индекс 2 для его дочернего элемента для стека поверх .fixed.second
.
переместить .abs вне обоих divs.
<div class="fixed first">
<p>This is a fixed element</p>
</div>
<div class="fixed second">
<p>This is a fixed element</p>
</div>
<p class="abs">
I should be displayed above both fixed position elements
</p>
см.http://jsfiddle.net/GS4E4/9/ Так, как сейчас .abs расположен относительно .сначала так будет сидеть сверху .сначала, но не выше .во-вторых, ваша скрипка правильно интерпретирует.