有没有一种方法可以堆叠不同父元素的伪元素?

时间:2019-05-16 14:39:18

标签: html css

我正在尝试创建一个带有各种图形元素的图像框。 为此,我有以下HTML代码:

.image-description:after {
  content: '';
  position: absolute;
  background: #333333;
  opacity: 0.6;
}

.image-box:after {
  content: '';
  position: absolute;
  background: linear-gradient(135deg, rgba(0, 0, 0, 0) 50%, rgba(232, 193, 30, 1) 50%);
  opacity: 0.85;
}
<div class="container">
  <div class="image-box" style="background-image: ... "></div>
  <div class="image-description">
    <h3>xxx</h3>
    <p>xxx</p>
  </div>
</div>

我想要的是按以下顺序显示元素:

  1. 图像框
  2. 图片描述:之后
  3. image-box:after
  4. 图像描述

因此,我想在图像描述前面显示在.image-box:after中创建的线性渐变。 有没有办法将image-box的after放在image-description和image-description:after之间?

1 个答案:

答案 0 :(得分:0)

(注-我为可见性添加了一些其他样式,例如背景和边框。)

  

我想要的是按以下顺序显示元素:

     
      
  1. 图像框
  2.   
  3. 图片描述:之后
  4.   
  5. image-box:after
  6.   
  7. 图像描述
  8.   

不幸的是,我认为您不能在兄弟姐妹及其父母之间进行这种互动。

您可以set a pseudo-element to have a lower z-index than its parent,但是不能将伪元素设置为具有比其表亲更低的z-index。这是因为,为了使伪元素的z-index值比其父元素低,您需要在该父元素内创建一个新的堆栈上下文,并且堆栈上下文不能混合。

因此,您所希望的最好的东西是这样的:

.container {
    border: 2px solid black; padding: 5px; /* These styles are for display purposes only */
    position: relative;
}
.image-box {
    border: 1px solid red; height: 20px; color: red; font-weight: bold; /* These styles are for display purposes only */
    position: relative;
    z-index: -1;
}
.image-box::after {
    content: 'box::after';
    position: absolute;
    left: 0;
    background: linear-gradient(135deg, rgba(0, 0, 0, 0) 50%, rgba(232, 193, 30, 1) 50%);
    opacity: 0.6;
    color: black; font-weight: normal; /* These styles are for display purposes only */
}
.image-description {
    border: 1px solid blue; top: 50px; /* These styles are for display purposes only */
    z-index: 2;
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
}
.image-description::after {
    content: 'description::after';
    position: absolute;
    background: #333333;
    opacity: 0.6;
    top: 0; 
    z-index: -1;
}
<div class="container">
  <div class="image-box">a</div>
  <div class="image-description">
    <h3>xxx</h3>
    <p>xxx</p>
  </div>
</div>