You need to enable JavaScript to run this app. 如何用原生JavaScript实现水平滚动容器可见卡片数量统计
优惠活动
大模型
产品
解决方案
定价
更多

如何用原生JavaScript实现水平滚动容器可见卡片数量统计

原生JavaScript实现水平滚动容器可见卡片计数方案

核心修正点

原有转换代码的错误主要集中在属性取值、逻辑监听和遍历三个维度:

  • 原生DOM元素无width/offset()属性,jQuery的宽、偏移方法对应原生clientWidth、getBoundingClientRect()接口
  • 滚动计数需要监听scroll事件而非click事件
  • 遍历对象应为容器内的所有卡片元素,而非容器本身

完整实现代码

可见性判断函数

/**
 * 判断元素是否在水平滚动容器可视范围内
 * @param {Element} container 滚动容器元素
 * @param {Element} elem 待判断的卡片元素
 * @param {Boolean} partial 是否统计部分可见的卡片,默认false只统计完全可见
 * @returns {Boolean} 是否可见
 */
function checkInView(container, elem, partial = false) {
  const containerRect = container.getBoundingClientRect()
  const elemRect = elem.getBoundingClientRect()

  const containerLeft = containerRect.left
  const containerRight = containerRect.right
  const elemLeft = elemRect.left
  const elemRight = elemRect.right

  const isTotalVisible = elemLeft >= containerLeft && elemRight <= containerRight
  const isPartVisible = partial && (
    (elemLeft < containerLeft && elemRight > containerLeft) ||
    (elemLeft > containerLeft && elemLeft < containerRight)
  )

  return isTotalVisible || isPartVisible
}

滚动监听逻辑

document.addEventListener('DOMContentLoaded', () => {
  const scrollContainer = document.querySelector('.scrollable')
  // 替换为你实际的卡片选择器,比如表格的th、td,或者自定义的.card类
  const allCards = scrollContainer.querySelectorAll('th')
  const totalCardCount = allCards.length

  // 可选:加防抖避免滚动时高频触发计算
  const debounce = (fn, delay = 150) => {
    let timer = null
    return (...args) => {
      clearTimeout(timer)
      timer = setTimeout(() => fn.apply(this, args), delay)
    }
  }

  const calculateVisibleCount = () => {
    let visibleCount = 0
    allCards.forEach(card => {
      if (checkInView(scrollContainer, card, true)) {
        visibleCount++
      }
    })
    // 此处可替换为将结果渲染到页面对应节点的逻辑
    console.log(`${visibleCount}/${totalCardCount}`)
  }

  scrollContainer.addEventListener('scroll', debounce(calculateVisibleCount))
  // 初始化触发一次,获取默认状态下的可见数量
  calculateVisibleCount()
})

内容的提问来源于stack exchange,提问作者Christian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 12:18:01