browser - 浏览器如何从鼠标位置找到父元素之外的元素
问题描述
我的问题与这个有关 浏览器如何知道哪个元素应该获得点击或悬停事件?. 问题是没有解释浏览器如何找到父元素之外的元素,如溢出元素或具有绝对位置的元素。更准确地说,渲染树如何处理它们?
到目前为止,我知道渲染元素存储在渲染树中。如果当用户将光标移动到视口上时我正确理解了这个想法,它必须检查是否存在具有悬停伪类的元素来应用样式,因此浏览器会搜索树以找到正确的元素并激活样式。当每个父节点完全包含其所有子节点时,应该很容易找到该元素,然后我们可以检查一个节点是否包含指定的位置,如果是,则对其子节点执行相同操作,直到到达包含该位置的最后一个节点. 但是,如果子项(或整个子项)的一部分在父项之外并且用户将鼠标悬停在父项之外的区域上,则此解决方案将不起作用。
下面有一个示例代码。当您将鼠标悬停在蓝色 div 上方的绿色 div(绝对定位)上时,渲染树将(使用上面的想法)检查灰色 div 节点是否包含光标位置,这是错误的,即使绿色 div 是那个的子节点节点,所以它找不到它,但是浏览器以某种方式正确处理这些情况,但是如何?
div {
padding: 50px;
}
.abs {
background-color: rgb(0, 100, 0);
position: absolute;
top: 150px;
left: 30px;
}
.abs:hover {
background-color: rgb(0, 150, 0);
}
.nonabs {
background-color: rgb(100, 0, 0);
}
.nonabs:hover {
background-color: rgb(150, 0, 0);
}
.parent1 {
background-color: lightgrey;
}
.parent2 {
background-color: lightblue;
}
<div class="parent1">
<div class="abs">
Absolute
</div>
<div class="nonabs">
Non-absolute
</div>
</div>
<div class="parent2">
Second parent
</div>
解决方案
推荐阅读
- python - 如何每次少打印一个字母?
- javascript - 如何在 Vue.js 中使用函数而不是 v-for 来访问数据?
- python-3.x - 错误:需要参数 -i/--image
- python - AttributeError:'str'对象在python pyQt中没有属性'set'错误
- node.js - Opsworks NodeJs 应用程序每 120 秒使用 SIGTERM 重启
- itext7 - 将页眉、页脚和页码添加到转换为 PDF iText 7 的 HTML 页面
- java - 为什么我的最后一个方法不打印?我怎样才能让它执行
- c# - VS 2017 缺少模板空白应用程序(Android)c#
- sql - 查询以根据不同的其他列值对相似的列值进行分组
- ansible - Ansible 2.5 包含带变量的角色