Javascript 获取所有与矩形接触的元素

Javascript 获取所有与矩形接触的元素,javascript,Javascript,我需要得到其边框与我选择的任意矩形相交的所有元素。我不知道如何在本地实现这一点,到目前为止,我的最佳解决方案是调用矩形内的点的代表性样本,这远不是完美的,因为它可能会错过元素 在矩形中的每个点上运行它将是一场性能噩梦,因此不是一个选项。即使这是可行的,我也不认为它会捕获宽度为width:0的元素;身高:0,尽管这对我来说不是什么大问题 我对如何使用多点法最小化误报有一些想法,但有真正的解决方案吗 为可能接触到矩形的每个元素获取相应的值 对于每个元素,检查边界矩形和矩形是否相交 如果您有大量的元素

我需要得到其边框与我选择的任意矩形相交的所有元素。我不知道如何在本地实现这一点,到目前为止,我的最佳解决方案是调用矩形内的点的代表性样本,这远不是完美的,因为它可能会错过元素

在矩形中的每个点上运行它将是一场性能噩梦,因此不是一个选项。即使这是可行的,我也不认为它会捕获宽度为
width:0的元素;身高:0
,尽管这对我来说不是什么大问题

我对如何使用多点法最小化误报有一些想法,但有真正的解决方案吗

  • 为可能接触到矩形的每个元素获取相应的值
  • 对于每个元素,检查边界矩形和矩形是否相交

  • 如果您有大量的元素,并且您可以做出诸如“元素的子元素的边界矩形始终包含在元素的边界矩形中”之类的假设,那么可以进行一些优化。或者当元素以某种方式排序时。但是,如果任何HTML元素的任何位置都是可能的,就像CSS允许的那样,那么您需要检查它们所有的位置。

    如果它们是平行的,那么您最好只为每个矩形定义四个参数:x、y、width和height。现在比较它们比使用单点要少得多,而且总是能得到准确的结果。

    矩形可以旋转吗?你可能会从我检查的矩形中得到一些想法。@Shomz?为了简单起见,假设所有边都平行于视口的各个边;该算法必须适用于非常大的文档。@QuinnStrahl您能假定元素的子边界在元素边界内吗?您是否有一个元素树,或者您是否有一个在同一级别上有许多元素的平面结构?还是以某种方式进行分类?我担心没有本机解决方案,但肯定有办法优化流程。问题域是任意的DOM树,因此我不能假设子级的边界在其父级的边界内。因此,它也可以是几乎任何大小和结构的树。哦,我明白了。它多久改变一次?是否只有有限数量的更改?然后,您可以对边界矩形进行排序或构造,并重复使用。它可能永远不会更改,可能会以随机间隔永久更改,以及其间的所有内容。这需要迭代文档中的每个元素,对吗?我担心的是,如果不是本机实现,速度可能不够快。是的,它会覆盖所有元素。嗯,我不确定你到底是如何实现这一点的,但这里有一个优化的想法:如果可以,你可以构建一个矩形数组(每个矩形都是一个包含我在回答中提到的4个参数的数组……还有,为什么不是一个对象呢?因为数组要快得多)当文档加载时,以及在每个项目位置发生变化时(如果有可能的话)。因此,现在,您不需要迭代许多DOM元素,而是迭代一个数组,这可能是JavaScript中最快的一个数组,而且测试也很容易。不幸的是,我不能依赖MutationObserver或DOM突变事件,因为这段代码必须在旧而糟糕的浏览器中本机运行。