Shl*_*rtz 9 html javascript css intersection
编辑以下HTML和CSS只是一个示例,真正的用例涉及复杂的DOM,并且应该足够通用以在不同的网页上工作.唯一有效的假设是所有元素都是矩形的.
鉴于以下内容:
HTML
<div class="a" id="a">
A
</div>
<div class="b">
B
</div>
<div class="c">
C
<div class="d">
D
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
CSS
.a,.b,.c,.d{
border: solid 1px black;
opacity: 0.5;
font-family: arial;
position: absolute;
font-size: 20px;
}
.a{
width:300px;
height:250px;
top:30px;
left:20px;
background:green;
}
.b{
width:300px;
height:145px;
top:10px;
left:20px;
background:blue;
}
.c{
width:150px;
height:300px;
top:30px;
left:60px;
background:red;
}
.d{
margin:10px;
background:yellow;
width:100px;
height:200px
}
Run Code Online (Sandbox Code Playgroud)
我试图检测未被其他元素遮挡的"A"DIV的百分比,IE:给定示例中的25%.
我写了下面的JS(小提琴),它扫描"A"DIV的矩形区域并收集模糊元素.
let el = document.getElementById("a");
let rect = el.getBoundingClientRect();
let right = rect.x + rect.width;
let bottom = rect.y + rect.height;
let elements = [];
for (let i = rect.x; i < right; i += 10) {
for (let j = rect.y; j < bottom; j += 10) {
let sampled = document.elementFromPoint(i, j);
if (sampled && sampled !== el && elements.indexOf(sampled) === -1) {
elements.push(sampled);
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我正在努力寻找最有效的计算方法.我尝试了另一种逐像素扫描矩形的方法,并计算了不属于主DIV的所有像素,但这种方法对于公认的解决方案来说似乎很慢.
任何帮助,将不胜感激.
更新
在做了一些研究后,我开始认为我需要扫描线算法,仍然不能确定如何修改代码以适应我的问题.
更新2
使用时pointer-events: none;,该document.elementFromPoint方法将无法正常工作,因此我正在寻找更好的解决方案.
我想我会尝试不同的方法。
假设:
z-index高于A我会:
Aelement 以及所有可能模糊的元素A)A)z-index对高于元素的元素进行排序A:上、右、下、左坐标A矩形坐标中减去这些坐标并计算面积对于许多潜在的模糊元素,您可以通过删除排序步骤来进一步优化,而是在迭代模糊元素时跟踪顶部/右侧/底部/左侧的最坐标,并更新它们(如果当前迭代的元素在任一方向上更多)。