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 判断undefined的实现代码
Nov 26 Javascript
JavaScript中的匀速运动和变速(缓冲)运动详细介绍
Nov 11 Javascript
JavaScript实现简单图片滚动附源码下载
Jun 17 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
Jul 01 Javascript
javascript动态生成树形菜单的方法
Nov 14 Javascript
Javascript基础_简单比较undefined和null 值
Jun 14 Javascript
angular-ui-sortable实现可拖拽排序列表
Dec 28 Javascript
webpack 单独打包指定JS文件的方法
Feb 22 Javascript
Layer弹出层动态获取数据的方法
Aug 20 Javascript
webpack file-loader和url-loader的区别
Jan 15 Javascript
JS立即执行函数功能与用法分析
Jan 15 Javascript
一次微信小程序内地图的使用实战记录
Sep 09 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 定界符 使用技巧
2009/06/14 PHP
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
PHP贪婪算法解决0-1背包问题实例分析
2015/03/23 PHP
composer.lock文件的作用
2016/02/03 PHP
PHP解压tar.gz格式文件的方法
2016/02/14 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
arguments对象验证函数的参数是否合法
2015/06/26 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
BootStrap下jQuery自动完成的样式调整
2016/05/30 Javascript
vue params、query传参使用详解
2017/09/12 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
[02:06]DOTA2肉山黑名单魔法终结者 敌法师中文配音鉴赏
2013/06/17 DOTA
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
2017/05/25 Python
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
python腾讯语音合成实现过程解析
2019/08/01 Python
Python描述符descriptor使用原理解析
2020/03/21 Python
python ssh 执行shell命令的示例
2020/09/29 Python
Pycharm Plugins加载失败问题解决方案
2020/11/28 Python
Python Selenium异常处理的实例分析
2021/02/28 Python
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
银行实习生自我鉴定范文
2013/09/19 职场文书
蛋糕店的商业计划书范文
2014/01/27 职场文书
法制宣传实施方案
2014/03/13 职场文书
奠基仪式策划方案
2014/05/15 职场文书
购房个人委托书范本
2014/10/11 职场文书
2019学生会干事辞职信
2019/06/27 职场文书
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python
python超详细实现完整学生成绩管理系统
2022/03/17 Python
剑指Offer之Java算法习题精讲二叉树的构造和遍历
2022/03/21 Java/Android