原生js实现移动端Touch滑动反弹
源码如下:
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="utf-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
- <title>移动端 Touch 滑动反弹</title>
- <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
- <style type="text/css">
- *{margin: 0;padding: 0}
- html,
- body{width: 100%;}
- aside{height: 100%;width: 100%;}
- /*列表的父盒子,限制高度*/
- /*注意设置overflow:hidden;样式后,超过这个盒子的ul将不会显示*/
- .draw{width: 60px;height: 500px;border: 2px solid #ccc;overflow: hidden;position: fixed;left: 10px;top: 50%;transform: translateY(-50%);}
- /*li设置了浮动,所以ul要清除浮动*/
- ul:after{content: "";display: block;visibility: hidden;height: 0;clear: both;}
- ul{zoom:1;}
- li{list-style: none;float: left;width: 60px;height: 60px;line-height: 60px;text-align: center;}
- </style>
- </head>
- <body>
- <aside class="main">
- <div class="draw" id="draw">
- <ul>
- <li style="background: orange;">列表一</li>
- <li style="background:yellowgreen;">列表二</li>
- <li style="background:yellow;">列表三</li>
- <li style="background:cyan;">列表四</li>
- <li style="background:orangered;">列表五</li>
- <li style="background:pink;">列表六</li>
- <li style="background:red;">列表七</li>
- <li style="background:purple;">列表八</li>
- <li style="background:violet;">列表九</li>
- <li style="background:brown;">列表十</li>
- </ul>
- </div>
- </aside>
- <!-- <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script> -->
- <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js"></script>
- </body>
- <script type="text/javascript">
- var draw = document.querySelector('#draw');
- var ul = draw.children[0];
- var startY = 0; //刚触碰到屏幕时候的手指信息
- var centerY = 0; //用来记录每一次触摸时上一次的偏移距离
- var maxDown = 450; //设定一个最大向下滑动的距离
- var maxUp = -(ul.offsetHeight - draw.offsetHeight + maxDown); //求得一个最大向上滑动的距离
- var maxDownBounce = -(ul.offsetHeight - draw.offsetHeight); //向下反弹值
- var maxUpBounce = 0; //向上反弹值
- //touchstart时,记录此时手指在Y轴上的落点距离可视顶部距离
- ul.addEventListener('touchstart',function(e){
- startY = e.changedTouches[0].clientY;
- })
- //touchmove时,记录此时手指在Y轴上的落点距离可视顶部距离
- ul.addEventListener('touchmove',function(e){
- //清除过度
- ul.style.transition = 'none';
- //获取差值
- var dy = e.changedTouches[0].clientY - startY;
- //上次的滑动距离加上本次滑动的距离
- var tempY = centerY + dy;
- //当上次滑动的距离加上本次滑动的距离大于设定的最大向下距离的时候
- if (tempY > maxDown) {
- tempY = maxDown;
- }
- //当上次滑动的距离加上本次滑动的距离小于设定的最大向下距离的时候
- else if (tempY < maxUp) {
- tempY = maxUp;
- }
- //设置ul在Y轴上的偏移
- ul.style.transform = 'translateY('+ tempY +'px)';
- })
- //touchend时,记录此时手指在Y轴上的落点距离可视顶部距离
- ul.addEventListener('touchend',function(e){
- //获取差值
- var dy = e.changedTouches[0].clientY - startY;
- //记录移动距离
- centerY = centerY + dy;
- //两次滑动的距离大于设定的向上反弹值
- if (centerY > maxUpBounce) {
- //让两次滑动滑动的距离等于设置的值
- centerY = maxUpBounce;
- //添加过度
- ul.style.transition = 'transform .5s';
- ul.style.transform = 'translateY('+centerY+'px)';
- }
- //两次滑动的距离小于设定的向下反弹值
- else if (centerY < maxUpBounce) {
- //让两次滑动的距离等于设置的值
- centerY = maxDownBounce;
- //添加过度
- ul.style.transition = 'transform .5s';
- ul.style.transform = 'translateY('+centerY+'px)';
- }
- })
- </script>
- </html>
效果图如下: