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 相关文章推荐
namespace.js Javascript的命名空间库
Oct 11 Javascript
JS 数字转换研究总结
Dec 26 Javascript
多种方法实现load加载完成后把图片一次性显示出来
Feb 19 Javascript
js隐式全局变量造成的bug示例代码
Apr 22 Javascript
Javascript中的几种URL编码方法比较
Jan 23 Javascript
javascript实现超炫的向上滑行菜单实例
Aug 03 Javascript
javascript中数组和字符串的方法对比
Jul 20 Javascript
js实现4个方向滚动的球
Mar 06 Javascript
微信小程序常见页面跳转操作简单示例
May 01 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
Jul 25 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
Sep 09 Javascript
实现vuex原理的示例
Oct 21 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
ecshop实现smtp发送邮件
2015/02/03 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
JS中 用户登录系统的解决办法
2013/04/15 Javascript
JQuery记住用户名和密码的具体实现
2014/04/04 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
详解Javascript中的Object对象
2016/02/28 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
详解vue slot插槽的使用方法
2017/06/13 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
基于jstree使用AJAX请求获取数据形成树
2017/08/29 Javascript
微信小程序之多文件下载的简单封装示例
2018/01/29 Javascript
Vue.js仿Select下拉框效果
2020/02/18 Javascript
[55:23]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
windows系统中python使用rar命令压缩多个文件夹示例
2014/05/06 Python
Python编程实现删除VC临时文件及Debug目录的方法
2017/03/22 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
Python实现京东秒杀功能代码
2019/05/16 Python
在Django下创建项目以及设置settings.py教程
2019/12/03 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
详解CSS3选择器的使用方法汇总
2015/11/24 HTML / CSS
什么叫做SQL注入,如何防止
2016/10/04 面试题
仓库门卫岗位职责
2013/12/22 职场文书
员工安全责任书范本
2014/07/24 职场文书
机械操作工岗位职责
2014/08/08 职场文书
党的群众路线对照检查材料范文
2014/09/24 职场文书
服装区域经理岗位职责
2015/04/10 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
2015年园林绿化工作总结
2015/05/23 职场文书
2015年普法依法治理工作总结
2015/05/26 职场文书
《黄道婆》教学反思
2016/02/22 职场文书
廉洁自律承诺书2016
2016/03/25 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL