判断元素是否滚动到底

3456f094e3e01078e2f051d1a2cc133f.png

Element.scrollHeight 只读属性是一个元素内容高度的度量,包括由于溢出导致的视图中不可见内容。

76a4dfd3d14c7db7582227fd0e8467c4.png

scrollHeight 的值等于该元素在不使用滚动条的情况下为了适应视口中所用内容所需的最小高度。高度的度量方式与 clientHeight 相同:包括元素的内边距,但不包括元素的边框、外边距以及水平滚动条(如果存在)。它也包括 ::before 和 ::after 这样的伪元素的高度。如果元素的内容不需要垂直滚动条就可以容纳,则其 scrollHeight 等于 clientHeight。

问题与解决方案

1、判断元素是否滚动到底

scrollTop 是一个非整数,而 scrollHeight 和 clientHeight 是四舍五入的,因此确定滚动区域是否滚动到底的唯一方法是查看滚动量是否足够接近某个阈值(在本例中为 1):

Math.abs(element.scrollHeight - element.clientHeight - element.scrollTop) < 1;

以下内容不会一直有效,因为 scrollTop 可能包含小数:

element.scrollHeight - Math.abs(element.scrollTop) === element.clientHeight;

2、判断元素是否能滚动

当容器不滚动但有溢出的子容器时,这些检查可以确定容器能否滚动:

window.getComputedStyle(element).overflowY === "visible";
window.getComputedStyle(element).overflowY !== "hidden";

3、判定用户是否阅读过文本

监听 onscroll 事件,可以用来判定用户是否阅读过文本。

3、阻止IOS滚动穿透

在内容区域滚动的时候,只要没有到达顶部或者底部的时候,滚动内容区域背景是不会跟着滚动的,但是当我们滚动到底部的时候继续向下滑动,页面就发生了滚动。根据这个行为大概就可以总结出方案,当页面滚动到底部或者顶部的时候组织他的默认滚动行为不就行了吗。下面是他的具体代码

<div @touchmove="handlemove" @touchstart="handleStart"></div>


let startY = 0;
const handleStart = (e) => {
  const targetTouches = e.targetTouches || []
  if (targetTouches.length > 0) {
    const touch = targetTouches[0] || {};
    startY = touch.clientY;
  }
}


function handlemove (e) {
  const targetTouches = e.targetTouches;
  const scrollTop = e.currentTarget.scrollTop;
  if (targetTouches.length > 0) {
    const touch = targetTouches[0] || {};
    const moveY = touch.clientY;
    if (scrollTop === 0 && moveY > startY) {
      e.preventDefault();
    } else if (scrollTop === e.currentTarget.scrollHeight - e.currentTarget.offsetHeight && moveY < startY) {
      e.preventDefault();
    }
  }
}

思路很简单,就是监听touchstart和touchmove事件,判断是否滚动到顶部还有顶部。首先记录touchstart的时候手指距离顶部的距离,在移动的过程中在获取手相对屏幕的一个位置,通过这两个位置比较,判断现在是向上滑动还是向下滑动,从而判断是否到达了边界情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过获取元素的位置信息和页面的滚动信息来判断元素是否在页面中完全展示。具体的实现方式如下: 1. 获取元素的位置信息,包括元素的 top、left、width、height 等属性; 2. 获取页面的滚动信息,包括页面的 scrollTop 和 scrollLeft 属性; 3. 计算元素的底部和右侧边缘的位置信息,即 top + height 和 left + width; 4. 判断元素是否在页面中完全展示,即元素的 top 大于等于页面的 scrollTop,元素的底部小于等于页面的 scrollTop + 页面的高度,元素的 left 大于等于页面的 scrollLeft,元素的右侧边缘小于等于页面的 scrollLeft + 页面的宽度。 以下是一个示例代码: ``` function isElementInViewport(el) { const rect = el.getBoundingClientRect(); const windowHeight = window.innerHeight || document.documentElement.clientHeight; const windowWidth = window.innerWidth || document.documentElement.clientWidth; return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= windowHeight && rect.right <= windowWidth ); } const element = document.getElementById('myElement'); if (isElementInViewport(element)) { console.log('Element is fully visible in the viewport'); } else { console.log('Element is not fully visible in the viewport'); } ``` 在上述代码中,isElementInViewport 函数用于判断元素是否在页面中完全展示。如果元素完全展示,则返回 true,否则返回 false。使用 getElementById 函数获取需要判断元素,然后调用 isElementInViewport 函数即可判断元素是否完全展示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值