JavaScript运动框架 解决防抖动问题、悬浮对联(二)


Posted in Javascript onMay 17, 2017

本文实例是对JavaScript运动框架(一)的应用

scrollTop:有时候网页很长,其高度大于显示器高度,会产生滚动,那么在高度方向上,“滚走”的部分就是scrollTop

var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;

offsetTop:此属性可以获取元素的上外缘距离最近采用定位父元素内壁的距离,如果父元素中没有采用定位的,则是获取上外边缘距离文档内壁的距离。所谓的定位就是position属性值为relative、absolute或者fixed。

JavaScript运动框架 解决防抖动问题、悬浮对联(二)

图中,黑色框是网页文档,其高度:document.documentElement.scrollHeight;

绿色框是当前可见的客户区部分(不包括工具条,状态栏之类的),红色方框是要固定在客户区正中央的对联,假如网页高度很高,用户不停的滚动,要求对联以缓冲运动的形式保持在客户区右侧中央,(postion:fixed;可以做到,而且非常稳定的做到,滚动网页,div纹丝不动的焊在那里)。

但我们想让它运动性的最后落脚在目标位置:

1:可以直接计算好位置,硬赋值;
2:缓冲运动到目标位置,效果更柔和。
一般不用第一种硬来,因为视觉效果很差,很生硬。

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>运动框架(二)</title>
 <style type="text/css">
  * {
   padding: 0;
   margin: 0;
  }
  #div1 {
   width: 100px;
   height: 200px;
   background: orange;
   position: absolute;
   right: 0;
  }
 </style>
</head>
<body style="height: 30000000px;">
 <div id="div1"></div>
 <script type="text/javascript">
  var oDiv = document.getElementById('div1');
  var timer = null;
  window.onscroll = function() {
   //每次滚动网页,都要重新计算目标值,当前值就是offsetTop
   var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
   var target = (document.documentElement.clientHeight - oDiv.offsetHeight)/2 + scrollTop;
   //下面是硬赋值,计算好位置后,直接将值付给style.top,太生硬
   //oDiv.style.top = target;

   startMove(target);
  };
  function startMove(iTarget) {
   clearInterval(timer);
   timer = setInterval(function() {
    var speed = (iTarget - oDiv.offsetTop) / 10;
    speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
    if (iTarget == oDiv.offsetTop) {
     clearInterval(timer);
    } else {
     oDiv.style.top = oDiv.offsetTop + speed + 'px';
     document.title = iTarget + ',' + oDiv.offsetTop;
    }
   }, 30);
  }
 </script>
</body>
</html>

运行结果却有问题,对联不停地抖动,一上一下的抖动,也就是offsetTop不停的来回变化,如下两个图所示:

JavaScript运动框架 解决防抖动问题、悬浮对联(二)

JavaScript运动框架 解决防抖动问题、悬浮对联(二)

观察上面两个图,看title,计算出来的目标值是小数:267.5px,也就是对联最后应该停留的style.top值,speed = (267.5 - 267)/10 ?> 1 , 跨1px到 268,
speed = (267.5 - 268)/10 ?> -1,退1px,到267,始终到不了267.5的目标值,上一篇文章中让速度只能取整,并且计算机也不走小数个px,所以始终到不了267.5,就这么僵持着:跨一步,过了,退一步,狠了!来回抖动!
怎么解决,很简单,不允许目标值是个小数:取整!

var target = (document.documentElement.clientHeight - oDiv.offsetHeight)/2 + scrollTop;

改为:

var target = parseInt((document.documentElement.clientHeight - oDiv.offsetHeight)/2 + scrollTop);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
Apr 01 Javascript
jQuery EasyUI API 中文文档 可调整尺寸
Sep 29 Javascript
js 将json字符串转换为json对象的方法解析
Nov 13 Javascript
js加减乘除丢失精度问题解决方法
May 16 Javascript
javaScript实现滚动新闻的方法
Jul 30 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
Nov 30 Javascript
微信JSAPI支付操作需要注意的细节
Jan 10 Javascript
基于JavaScript实现本地图片预览
Feb 08 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
Dec 06 Javascript
微信小程序 wepy框架与iview-weapp的用法详解
Apr 10 Javascript
vue指令做滚动加载和监听等
May 26 Javascript
JavaScript, select标签元素左右移动功能实现
May 14 Javascript
vue之nextTick全面解析
May 17 #Javascript
Vue.js学习教程之列表渲染详解
May 17 #Javascript
JavaScript运动框架 解决速度正负取整问题(一)
May 17 #Javascript
深入理解Commonjs规范及Node模块实现
May 17 #Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
May 17 #Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
May 17 #Javascript
Angular.JS中的this指向详解
May 17 #Javascript
You might like
PHP之数组学习
2011/05/29 PHP
PHP将身份证正反面两张照片合成一张图片的代码
2017/04/08 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
js对象关系图 方便dom操作
2012/03/18 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
2014/01/06 Javascript
JavaScript插件化开发教程(五)
2015/02/01 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
2016/09/22 Javascript
canvas实现图像截取功能
2017/02/06 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
jQuery手风琴的简单制作
2017/05/12 jQuery
bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法
2017/05/25 Javascript
理解 JavaScript EventEmitter
2018/03/29 Javascript
浅谈JavaScript面向对象--继承
2019/03/20 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
python使用Berkeley DB数据库实例
2014/09/26 Python
python中os操作文件及文件路径实例汇总
2015/01/15 Python
进一步探究Python的装饰器的运用
2015/05/05 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
2016/06/07 Python
基于python中staticmethod和classmethod的区别(详解)
2017/10/24 Python
Python利用itchat对微信中好友数据实现简单分析的方法
2017/11/21 Python
Python3之文件读写操作的实例讲解
2018/01/23 Python
Python实现识别手写数字大纲
2018/01/29 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
python打造爬虫代理池过程解析
2019/08/15 Python
Python如何进行时间处理
2020/08/06 Python
python与js主要区别点总结
2020/09/13 Python
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
EJB与JAVA BEAN的区别
2016/08/29 面试题
邻里守望志愿服务活动方案
2014/08/15 职场文书
在职证明书模板
2015/06/15 职场文书
小学生教师节广播稿
2015/08/19 职场文书