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 相关文章推荐
网页里控制图片大小的相关代码
Jun 13 Javascript
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
May 16 Javascript
JS 控件事件小结
Oct 31 Javascript
防止按钮在短时间内被多次点击的方法
Mar 10 Javascript
js拖拽功能实现代码解析
Nov 28 Javascript
JavaScript Ajax实现异步通信
Dec 14 Javascript
详解vue数据渲染出现闪烁问题
Jun 29 Javascript
jsTree事件和交互以及插件plugins详解
Aug 29 Javascript
微信小程序switch组件使用详解
Jan 31 Javascript
JavaScript使用百度ECharts插件绘制饼图操作示例
Nov 26 Javascript
原生js实现分页效果
Sep 23 Javascript
vue中的计算属性和侦听属性
Nov 06 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获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
php实现数组中出现次数超过一半的数字的统计方法
2018/10/14 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
jquery validate demo 基础
2015/10/29 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
2016/05/09 Javascript
深入分析javascript中console命令
2016/08/14 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
vue移动端裁剪图片结合插件Cropper的使用实例代码
2017/07/10 Javascript
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
React通过redux-persist持久化数据存储的方法示例
2019/02/14 Javascript
Vue中的this.$options.data()和this.$data用法说明
2020/07/26 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
[06:53]2018DOTA2国际邀请赛寻真——为复仇而来的Newbee
2018/08/15 DOTA
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
提升Python程序运行效率的6个方法
2015/03/31 Python
在Python中使用itertools模块中的组合函数的教程
2015/04/13 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
python生成带有表格的图片实例
2019/02/03 Python
centos7中安装python3.6.4的教程
2019/12/11 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
python操作链表的示例代码
2020/09/27 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
日本乐天官方海外转运服务:Rakuten Global Express
2018/11/30 全球购物
大学生在校表现评语
2014/12/31 职场文书
公司借款担保书
2015/09/22 职场文书
纯html+css实现Element loading效果
2021/08/02 HTML / CSS