Можно ли установить порядок укладки псевдоэлементов ниже их родительского элемента?
Я пытаюсь стилизовать элемент с помощью :after
псевдоэлемента CSS-селектор
#element {
position: relative;
z-index: 1;
}
#element::after {
position:relative;
z-index: 0;
content: " ";
position: absolute;
width: 100px;
height: 100px;
}
Кажется, элемент ::after
не может быть ниже самого элемента.
Есть ли способ сделать псевдоэлемент ниже самого элемента?
Ответы
Ответ 1
Псевдоэлементы рассматриваются как потомки их ассоциированного элемента. Чтобы поместить псевдоэлемент ниже своего родителя, вы должны создать новый контекст стекирования, чтобы изменить порядок укладки по умолчанию.
Позиционирование псевдоэлемента (абсолютное) и присвоение значения z-index, отличного от "auto", создает новый контекст стекирования.
#element {
position: relative; /* optional */
width: 100px;
height: 100px;
background-color: blue;
}
#element::after {
content: "";
width: 150px;
height: 150px;
background-color: red;
/* create a new stacking context */
position: absolute;
z-index: -1; /* to be below the parent element */
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Position a pseudo-element below its parent</title>
</head>
<body>
<div id="element">
</div>
</body>
</html>
Ответ 2
Я знаю, что это старый поток, но я чувствую необходимость опубликовать правильный ответ. Фактический ответ на этот вопрос заключается в том, что вам нужно создать новый стековый контекст родительского элемента с псевдоэлементом (и вам действительно нужно дать ему z-index, а не только позицию).
Вот так:
#parent {
position: relative;
z-index: 1;
}
#pseudo-parent {
position: absolute;
/* no z-index allowed */
}
#pseudo-parent:after {
position: absolute;
top:0;
z-index: -1;
}
Это не имеет никакого отношения к использованию: до или: после псевдоэлементов.
#parent { position: relative; z-index: 1; }
#pseudo-parent { position: absolute; } /* no z-index required */
#pseudo-parent:after { position: absolute; z-index: -1; }
/* Example styling to illustrate */
#pseudo-parent { background: #d1d1d1; }
#pseudo-parent:after { margin-left: -3px; content: "M" }
<div id="parent">
<div id="pseudo-parent">
</div>
</div>
Ответ 3
Попробуйте это
el {
transform-style: preserve-3d;
}
el:after {
transform: translateZ(-1px);
}
Ответ 4
Здесь есть две проблемы:
-
Спецификация CSS 2.1 гласит, что "элементы псевдоэлементов :before
и :after
взаимодействуют с другими блоками, такими как блоки запуска, как если бы они были реальными элементами, вставленными непосредственно в связанный элемент". Учитывая то, как z-индексы реализованы в большинстве браузеров, довольно сложно (читай, я не знаю, как) переместить контент ниже, чем z-index их родительского элемента в DOM, который работает во всех браузерах.
-
Номер 1 выше не обязательно означает, что это невозможно, но второе препятствие на самом деле еще хуже: в конечном счете, это вопрос поддержки браузера. Firefox вообще не поддерживал позиционирование сгенерированного контента до FF3.6. Кто знает о браузерах, таких как IE. Поэтому, даже если вы сможете найти взлом, чтобы он работал в одном браузере, вполне вероятно, что он будет работать только в этом браузере.
Единственное, что я могу думать о том, чтобы работать в разных браузерах, - это использовать JavaScript, чтобы вставить элемент, а не CSS. Я знаю, что это не очень хорошее решение, но псевдо-селекторы :before
и :after
after просто не выглядят так, как будто они его здесь урежут.
Ответ 5
Говоря о спецификации (http://www.w3.org/TR/CSS2/zindex.html), поскольку a.someSelector
позиционируется, он создает новый контекст стека, из которого его дочерние a.someSelector
не могут выйти. Оставьте a.someSelector
размещенным, а затем дочерний a.someSelector:after
может быть расположен в том же контексте, что и a.someSelector
.
Ответ 6
Я знаю, что этот вопрос древний и имеет принятый ответ, но я нашел лучшее решение проблемы. Я размещаю его здесь, поэтому я не создаю дублирующий вопрос, и решение по-прежнему доступно другим.
Переключить порядок элементов. Используйте псевдоэлемент :before
для содержимого, которое должно быть внизу, и отрегулируйте поля для компенсации. Очистка полей может быть грязной, но желаемый z-index
будет сохранен.
Я успешно тестировал это с помощью IE8 и FF3.6.
Ответ 7
Установите z-index
псевдоэлемента :before
или :after
в -1 и дайте ему position
, который отличит свойство z-index
(absolute
, relative
или fixed
), Это работает, потому что псевдоэлемент z-index
относится к его родительскому элементу, а не к <html>
, который является значением по умолчанию для других элементов. Это имеет смысл, поскольку они являются дочерними элементами <html>
.
Проблема, с которой я столкнулся (что привело меня к этому вопросу и принятому ответу выше), заключалось в том, что я пытался использовать псевдоэлемент :after
, чтобы получить фантазию с фоном для элемента с z-index
из 15, и даже когда он установлен с z-index
из 14, он все еще отображается поверх его родителя. Это связано с тем, что в этом контексте стека он имеет z-index
из 0.
Надеюсь, это поможет немного разъяснить, что происходит.
Ответ 8
Я не знаю, будет ли у кого-то такая же проблема с этим. Выбранный ответ частично правильный.
Что вам нужно иметь это:
parent{
z-index: 1;
}
child{
position:relative;
backgr
Ответ 9
Я исправил это очень просто:
.parent {
position: relative;
z-index: 1;
}
.child {
position: absolute;
z-index: -1;
}
То, что это делает, это помещает родителя в z-index: 1, что дает дочернему пространству "конец" в z-index: 0, так как другие элементы dom "существуют" в z-index: 0. Если мы не дадим родительский z-индекс 1, дочерний элемент окажется ниже других элементов dom и, таким образом, не будет виден.
Это также работает для псевдоэлементов, таких как : после