getBoundingClientRect
メソッドで要素の位置を取得できます。次に、それらをループして、スキャンと一致するかどうかを確認します。
var all = document.body.getElementsByTagName("*");
var x = /* blue line */;
var match = [];
for (var i=0; i<all.length; i++) {
var rect = all[i].getBoundingClientRect();
if (rect.left < x && rect.right > x)
match.push(all[i]);
});
より短く機能的な方法:
var match = Array.prototype.filter.call(document.body.querySelectorAll("*"), function(el) {
var rect = el.getBoundingClientRect();
return rect.left < x && rect.right > x;
});
頻繁に使用するクイック アクセス機能が必要な場合は、すべての要素を (その座標と共に) ソートされたデータ構造であるセグメント ツリーに格納し、そこでそれらを検索できます。
また、DOM 要素の子ノードが親の境界を超えないことが保証されている場合は、DOM 自体を検索ツリーとして簡単に使用できます。
var x = /* the blue line */;
var match = function find(el, set) {
var rect = el.getBoundingClientRect();
if (rect.left < x && rect.right > x) {
set.push(el);
for (var i=0; i<el.children.length; i++)
find(el.children[i]);
}
return set;
}(document.body, []);