请考虑这个HTML+CSS:

#testArea {
  box-sizing: border-box;
  width: 300px;
  height: 300px;
  background-color: blue;
  padding: 20px;
  color: white;
  font-weight: bold;
  font-size: 18px;
}
#testArea:hover {
  -webkit-filter: brightness(50%);
}
#absElement {
  position: absolute;
  left: 100px;
  top: 100px;
  width: 100px;
  height: 100px;
  background-color: green;
}
<div id="absElement"></div>
<div id="testArea">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</div>

如果将鼠标移到蓝色区域上,:hover CSS样式生效,并应用50%亮度过滤器.不知怎的,绝对定位的绿色absElement消失了.我原以为testArea元素本身的渲染会被改变,但似乎有一种覆盖元素是在宿主元素上动态渲染的.

如果我在#absElement样式定义中添加z-index: 1,那么行为将符合我的预期.另一种"修复"它的方法是,将absElement div移到testArea div之后.但奇怪的是,我应该这样做,因为绝对定位的元素总是应该呈现在流布局元素之上.

这是怎么回事?我知道我可以添加z-index属性,然后继续,但我想了解如何应用/渲染过滤效果.

推荐答案

filter specification人中:

计算出的值非none将导致创建stacking context[CSS21],与CSS不透明度的创建方式相同.

然后从another specification中可以找到元素的"绘制顺序":

在每个堆叠上下文中,按从后到前的顺序绘制以下层:

  1. 构成堆叠上下文的元素的背景和边界.
  2. 具有负堆栈级别的子堆栈上下文(首先是最负的).
  3. 在流中,非内联级别,非定位子体.
  4. 未定位的浮动.
  5. 流中的、内联级别的、未定位的子体,包括内联表和内联块.
  6. 堆栈级别为0的子堆栈上下文和堆栈级别为0的定位子体.
  7. 具有正堆栈级别的子堆栈上下文(首先是最小正堆栈).

如果没有过滤器,元素将在步骤(3)中绘制,因为它不会创建堆叠上下文.所以它在(6)处绘制的position:absolute元素之下

使用过滤器,您的元素也将在步骤(6)中绘制,在这种情况下,树顺序将被视为知道哪个元素将首先绘制,因此它将在position:absolute个元素之上结束.

您可以按照规范获取每个步骤的更精确细节.

Html相关问答推荐

如何将数据发送到Flask 应用程序中的表单文本框

restrict. form—text width to input s width'

如何在css中将包含多行文本的多个p-tag放在一起(并排)?

垂直页眉,每行只显示一个使用css的字母

如何在HTML中适当地为单选按钮网格添加标签?

在弹性框布局中的第n个元素后强制换行

使用CSS Flexbox时,我的图像未对齐

按钮悬停效果不影响按钮内的图标

为什么我不能覆盖 div 的样式?

Angular MatBadge 在高于 99 时不显示完整数字

为什么 `::before` 在使用内容 `url(svg)` 时会增加一些高度

复制两个

会产生一个空行;复制

元素不会

如何使用jQuery将我制作的通用头部和底部加载到多个HTML文件中?

CSS 网格跨度行到所有行

调整屏幕大小时标题在图像下方重叠 - HTML

我应该如何使这个带有标签的隐藏复选框可访问

发光效果html动画

让 Iframe 覆盖整个页面

在中心而不是边界处填充 svg 的背景

当我希望它只横向滚动时,可滚动菜单也会上下移动