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 相关文章推荐
CodeMirror2 IE7/IE8 下面未知运行时错误的解决方法
Mar 29 Javascript
IE下双击checkbox反应延迟问题的解决方法
Mar 27 Javascript
原生JS实现旋转木马式图片轮播插件
Apr 25 Javascript
微信小程序 欢迎界面开发的实例详解
Nov 30 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
Feb 05 Javascript
深入理解Angular4中的依赖注入
Jun 07 Javascript
基于zepto.js实现手机相册功能
Jul 11 Javascript
JS解决position:sticky的兼容性问题的方法
Oct 17 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
Feb 21 Javascript
浅析TypeScript 命名空间
Mar 19 Javascript
Ajax常用封装库——Axios的使用
May 08 Javascript
JS中forEach()、map()、every()、some()和filter()的用法
May 11 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中strtotime函数使用方法详解
2011/11/27 PHP
PHP批量采集下载美女图片的实现代码
2013/06/03 PHP
php中spl_autoload详解
2014/10/17 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
php实现的顺序线性表示例
2019/05/04 PHP
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
基于Bootstrap实现城市三级联动
2017/11/23 Javascript
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
webpack external模块的具体使用
2018/03/10 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
[02:38]2018年度DOTA2最佳劣单位选手-完美盛典
2018/12/17 DOTA
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
Python画柱状统计图操作示例【基于matplotlib库】
2018/07/04 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
2019/07/04 Python
Python requests获取网页常用方法解析
2020/02/20 Python
Python tcp传输代码实例解析
2020/03/18 Python
python高级特性简介
2020/08/13 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
2013/04/24 HTML / CSS
为什么UNION ALL比UNION快
2016/03/17 面试题
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
毕业生个人求职的自我评价
2013/10/28 职场文书
招股说明书范本
2014/05/06 职场文书
大学生国庆节65周年演讲稿范文
2014/09/25 职场文书
师德师风个人整改措施
2014/10/27 职场文书
医院营销工作计划
2015/01/16 职场文书
高温慰问简报
2015/07/21 职场文书
2015国庆节感想
2015/08/04 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
Python中的 enumerate和zip详情
2022/05/30 Python