本文介绍基于JavaScript实现的鼠标横向拖拽惯性运动效果。通过计算拖拽结束时的速度,利用定时器逐步减小位移量,模拟物理惯性,使页面元素在鼠标松开后继续平滑滚动,提升交互体验。
惯性运动背景与原理
移动端的惯性滚动效果最初源自iOS系统的专利设计,旨在手指滑动离开屏幕后,界面内容仍能保持原有趋势继续滚动,从而增强操作的动态感与流畅度。
本文以PC端为例,演示如何通过鼠标沿X轴横向拖拽实现类似的惯性运动计算逻辑,该原理同样适用于移动端触摸操作场景。
具体运行效果如下所示。

代码实现细节
核心实现代码如下。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>惯性运动</title>
<style type="text/css">
#box{
background: pink;
width: 100px;
height: 100px;
position: absolute;
top: 100px;
left: 100px;
}
</style>
</head>
<body>
<div id="box"></div>
</body>
<script type="text/javascript">
var $box = document.getElementById("box");
var isDown = false; //是否按下鼠标
var inertance = 1.2; //惯性系数,越大,惯性越不明显,不能小于0
var fv = 0; //滑动的力度
var timer = null;
$box.onmousedown = function(e){
clearTimeout(timer);//清除定时器
fv = 0;
this._start = e.clientX; //鼠标按下的位置
isDown = true;//鼠标是否有按下,主要防止用户是从容器外开始滑动的
}
$box.onmousemove = function(e){
if(isDown){
var miss = e.clientX - this._start;
moveMiss(miss)
this._start = e.clientX;
fv = miss;
}
}
function moveMiss(miss){
$box.style.left = miss + $box.offsetLeft + "px";
}
window.onmouseup = function(e){
if(isDown){
isDown = false;
var me = this;
var friction = ((fv >> 31) * 2 + 1) * inertance;//根据力度套用公式计算出惯性大小,公式要记住
var num = Math.abs(friction);
timer = setInterval(function(){
fv -= friction;//力度按 惯性的大小递减
moveMiss(fv);
if(Math.abs(fv) < num){ //如果力度减小到小于1了,结束,或者边界弹回
clearInterval(timer);
return ;
}
},20);
}
}
</script>
</html>
以上内容为本文全部介绍,希望能为读者的技术学习提供有益参考,同时也感谢大家对本平台的支持与关注。