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输出列表实现代码
Sep 12 Javascript
jquery validate在ie8下的bug解决方法
Nov 13 Javascript
JavaScript通过join函数连接数组里所有元素的方法
Mar 20 Javascript
HTML页面定时跳转方法解析(2种任选)
Dec 22 Javascript
使用use注册Vue全局组件和全局指令的方法
Mar 08 Javascript
JS实现监控微信小程序的原理
Jun 15 Javascript
JavaScript面向对象继承原理与实现方法分析
Aug 09 Javascript
JavaScript实现学生在线做题计时器功能
Dec 05 Javascript
深入浅出了解Node.js Streams
May 27 Javascript
如何进行微信公众号开发的本地调试的方法
Jun 16 Javascript
使用layui 的layedit定义自己的toolbar方法
Sep 18 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
Dec 15 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实现简单洗牌算法
2013/06/18 PHP
php绘制一个矩形的方法
2015/01/24 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
Docker配置PHP开发环境教程
2016/12/21 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
PHP实用小技巧之调用录像的方法
2019/12/05 PHP
PHP 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
超详细的JS弹出窗口代码大全
2020/04/18 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
如何使用VuePress搭建一个类型element ui文档
2019/02/14 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
python字符串常用方法
2018/06/14 Python
Python GUI编程完整示例
2019/04/04 Python
Ubuntu下Anaconda和Pycharm配置方法详解
2019/06/14 Python
python字符串替换re.sub()实例解析
2020/02/09 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
Python中return函数返回值实例用法
2020/11/19 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
瑞士首家网上药店折扣店:McDrogerie
2020/12/22 全球购物
下面关于"联合"的题目的输出是什么
2013/08/06 面试题
个人查摆问题整改措施
2014/10/04 职场文书
不同意离婚答辩状
2015/05/22 职场文书
小学生家长意见
2015/06/03 职场文书
生日宴会祝酒词
2015/08/10 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL