导读:本期聚焦于小伙伴创作的《前端开发中如何精准过滤可见HTML节点:实用JavaScript代码实现指南》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《前端开发中如何精准过滤可见HTML节点:实用JavaScript代码实现指南》有用,将其分享出去将是对创作者最好的鼓励。

如何过滤网页上可见的HTML节点

在前端开发中,我们经常需要筛选出页面中用户可见的HTML节点,用于数据统计、内容提取、样式适配等场景。要准确过滤可见节点,首先需要明确“可见节点”的判定标准,再结合DOM API实现过滤逻辑。

可见节点的判定标准

通常符合以下条件的节点会被判定为可见:

  • 节点的display属性值不为none

  • 节点的visibility属性值不为hiddencollapse

  • 节点的opacity属性值大于0

  • 节点的宽度和高度都大于0

  • 节点不在视口外(或者业务场景不需要考虑视口范围时可忽略该条件)

  • 节点没有被其他元素完全遮挡(常规场景中可忽略该复杂条件,仅做基础判断即可)

基础过滤实现

我们可以通过遍历节点,结合getComputedStyle方法获取节点的计算样式,依次校验上述判定条件。以下是一个通用的过滤函数示例:

/**
 * 判断单个节点是否为可见节点
 * @param {HTMLElement} node - 待检测的DOM节点
 * @param {boolean} checkViewport - 是否检查节点是否在视口内,默认false
 * @returns {boolean} 可见返回true,不可见返回false
 */
function isVisibleNode(node, checkViewport = false) {
  // 排除非元素节点
  if (!(node instanceof HTMLElement)) {
    return false;
  }
  const style = window.getComputedStyle(node);
  // 检查display、visibility、opacity
  if (style.display === 'none') return false;
  if (style.visibility === 'hidden' || style.visibility === 'collapse') return false;
  if (parseFloat(style.opacity)  viewWidth || rect.bottom < 0 || rect.top > viewHeight) {
      return false;
    }
  }
  return true;
}

/**
 * 过滤一组节点中的可见节点
 * @param {NodeList|Array} nodes - 待过滤的节点集合
 * @param {boolean} checkViewport - 是否检查节点是否在视口内,默认false
 * @returns {Array} 可见节点数组
 */
function filterVisibleNodes(nodes, checkViewport = false) {
  const result = [];
  for (let i = 0; i < nodes.length; i++) {
    if (isVisibleNode(nodes[i], checkViewport)) {
      result.push(nodes[i]);
    }
  }
  return result;
}

使用示例

假设我们需要过滤页面中所有<div>标签里的可见节点,可以按照以下方式调用:

// 获取页面所有div节点
const allDivs = document.querySelectorAll('div');
// 过滤可见节点,不检查视口范围
const visibleDivs = filterVisibleNodes(allDivs);
console.log('可见的div节点数量:', visibleDivs.length);

// 如果需要同时检查节点是否在当前视口内
const visibleInViewportDivs = filterVisibleNodes(allDivs, true);
console.log('视口内可见的div节点数量:', visibleInViewportDivs.length);

注意事项

在实际使用中需要注意以下几点:

  • 如果节点被父元素设置为display: none,子节点的计算样式也会返回display: none,无需额外递归检查父节点状态

  • 对于<script>、<style>、<meta>等非渲染类标签,即使获取到的宽高可能为0,也会在instanceof HTMLElement校验环节被排除

  • 如果页面存在大量节点需要过滤,建议分批处理或者使用requestIdleCallback避免阻塞主线程

  • 若需要访问示例网站测试效果,可访问https://www.ipipp.com查看相关DOM操作示例

前端开发HTML节点过滤可见节点检测JavaScript实现DOM操作

免责声明:已尽一切努力确保本网站所含信息的准确性。网站部分内容来源于网络或由用户自行发表,内容观点不代表本站立场。本站是个人网站免费分享,内容仅供个人学习、研究或参考使用,如内容中引用了第三方作品,其版权归原作者所有。若内容触犯了您的权益,请联系我们进行处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。前端、网络、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握网站开发与运维所需的核心技术栈。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端逻辑,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。