html怎么实现页面平滑移动,原生Javascript实现页面平滑滚动跳转

本文介绍了一个JavaScript函数scrollPosition,它根据传入的元素ID或元素对象,动态计算目标位置并平滑滚动到指定元素。通过判断元素位置与屏幕边界,确保在最后一屏或元素位置负数时调整目标。使用缓冲算法减小滚动过程中的抖动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

function scrollPosition(_obj) {//参数_obj可以是任何页面上存在的元素的id,或者是指定元素本身

var targetX, targetY;

if (!_obj) { //如果不指定锚点元素,就跳到页面顶端0,0位置

targetX = 0;

targetY = 0;

} else {

if (typeof (_obj) == "string") {

_obj = document.getElementById(_obj);

} else {

_obj = _obj

}

targetX = _obj.getBoundingClientRect().left + getScrollOffsets().x;

targetY = _obj.getBoundingClientRect().top + getScrollOffsets().y;

}

//如果目标元素的位置在最后一屏,那就指定目标位置为页面底部

//如果目标元素的位置为负数,就指定目标位置为页面顶部

var maxTargetX=document.body.scrollWidth-getViewPortSize().x;

if(targetX>=maxTargetX) targetX=maxTargetX;

if(targetX<0) targetX=0;

var maxTargetY=document.body.scrollHeight-getViewPortSize().y;

if(targetY>=maxTargetY) targetY=maxTargetY;

if(targetY<0) targetY=0;

var tempTimer = setInterval(function () {

var currentY = getScrollOffsets().y;

var currentX = getScrollOffsets().x;

//跳转位置的缓冲公式

var tempTargetY = currentY - (currentY - targetY) / 10;

var tempTargetX = currentX - (currentX - targetX) / 10;

//由于缓冲公式会生成小数,而scrollTo函数会省略小数点后面的数字,所以要对跳转的坐标做一些微调

if (Math.abs(tempTargetY - currentY) < 1) {

tempTargetY - currentY > 0 ? tempTargetY++ : tempTargetY--;

}

if (Math.abs(tempTargetX - currentX) < 1) {

tempTargetX - currentX > 0 ? tempTargetX++ : tempTargetX--;

}

//页面跳转

window.scrollTo(tempTargetX, tempTargetY);

//到达指定位置后清除一下Interval

if ( Math.abs(getScrollOffsets().y - targetY) <= 2 && Math.abs(getScrollOffsets().x - targetX) <= 2 ) {

clearInterval(tempTimer);

window.scrollTo(targetX, targetY);

//console.log("done");

}

}, 10);

}

function scrollPosition(_obj) {//参数_obj可以是任何页面上存在的元素的id,或者是指定元素本身

var targetX, targetY;

if (!_obj) { //如果不指定锚点元素,就跳到页面顶端0,0位置

targetX = 0;

targetY = 0;

} else {

if (typeof (_obj) == "string") {

_obj = document.getElementById(_obj);

} else {

_obj = _obj

}

targetX = _obj.getBoundingClientRect().left + getScrollOffsets().x;

targetY = _obj.getBoundingClientRect().top + getScrollOffsets().y;

}

//如果目标元素的位置在最后一屏,那就指定目标位置为页面底部

//如果目标元素的位置为负数,就指定目标位置为页面顶部

var maxTargetX=document.body.scrollWidth-getViewPortSize().x;

if(targetX>=maxTargetX) targetX=maxTargetX;

if(targetX<0) targetX=0;

var maxTargetY=document.body.scrollHeight-getViewPortSize().y;

if(targetY>=maxTargetY) targetY=maxTargetY;

if(targetY<0) targetY=0;

var tempTimer = setInterval(function () {

var currentY = getScrollOffsets().y;

var currentX = getScrollOffsets().x;

//跳转位置的缓冲公式

var tempTargetY = currentY - (currentY - targetY) / 10;

var tempTargetX = currentX - (currentX - targetX) / 10;

//由于缓冲公式会生成小数,而scrollTo函数会省略小数点后面的数字,所以要对跳转的坐标做一些微调

if (Math.abs(tempTargetY - currentY) < 1) {

tempTargetY - currentY > 0 ? tempTargetY++ : tempTargetY--;

}

if (Math.abs(tempTargetX - currentX) < 1) {

tempTargetX - currentX > 0 ? tempTargetX++ : tempTargetX--;

}

//页面跳转

window.scrollTo(tempTargetX, tempTargetY);

//到达指定位置后清除一下Interval

if ( Math.abs(getScrollOffsets().y - targetY) <= 2 && Math.abs(getScrollOffsets().x - targetX) <= 2 ) {

clearInterval(tempTimer);

window.scrollTo(targetX, targetY);

//console.log("done");

}

}, 10);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值