Редактировать Следующие 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>
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
}
производитследующий результат:
![enter image description here](https://i.stack.imgur.com/RZzId.png)
Я пытаюсь определить процент DIV "A", который не скрыт другими элементами, т.е.% в данном примере.
Я написал следующий JS ( fiddle ), который сканирует прямоугольную область "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);
}
}
}
Теперь я пытаюсь найти наиболее эффективный способ сделать расчеты.Я попробовал другой способ сканирования прямоугольного пикселя за пикселем и подсчитать все пиксели, которые не являются частью основного DIV, однако этот подход оказался медленным для принятого решения.
Любая помощь будет принята с благодарностью.
ОБНОВЛЕНИЕ
После некоторых исследований я начинаю думать, что мне понадобится алгоритм строчной развертки, но я все еще не совсем уверен, как изменить код для решения моей проблемы.
Обновление 2
При использовании pointer-events: none;
подход document.elementFromPoint
не будет работать, поэтому я ищу лучшее решение.