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 相关文章推荐
javascript的键盘控制事件说明
Apr 15 Javascript
Jquery实现textarea根据文本内容自适应高度
Apr 03 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
Aug 26 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
Jan 26 Javascript
Jquery中map函数的用法
Jun 03 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
Jul 25 Javascript
smartupload实现文件上传时获取表单数据(推荐)
Dec 12 Javascript
vue2导航根据路由传值,而改变导航内容的实例
Nov 10 Javascript
vue 设置proxyTable参数进行代理跨域
Apr 09 Javascript
Mac下安装vue
Apr 11 Javascript
vue强制刷新组件的方法示例
Feb 28 Javascript
vue滑动吸顶及锚点定位的示例代码
May 10 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
虫族 Zerg 历史背景
2020/03/14 星际争霸
php设计模式 Singleton(单例模式)
2011/06/26 PHP
PHP删除数组中的特定元素的代码
2012/06/28 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
2012/12/28 PHP
zf框架的db类select查询器join链表使用示例(zend框架)
2014/03/14 PHP
Yii框架form表单用法实例
2014/12/04 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
js 覆盖和重载 函数
2009/09/25 Javascript
jquery实现的鼠标拖动排序Li或Table
2014/05/04 Javascript
js实现图片拖动改变顺序附图
2014/05/13 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
2017/05/10 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
小程序跨页面交互的作用与方法详解
2020/01/07 Javascript
如何通过javaScript去除字符串两端的空白字符
2020/02/06 Javascript
Vue中component标签解决项目组件化操作
2020/09/04 Javascript
Python循环实现n的全排列功能
2019/09/16 Python
python多环境切换及pyenv使用过程详解
2019/09/27 Python
Python爬取腾讯视频评论的思路详解
2019/12/19 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
浅谈Python协程
2020/06/17 Python
pytorch随机采样操作SubsetRandomSampler()
2020/07/07 Python
Python实现一个简单的递归下降分析器
2020/08/01 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
基于PyTorch中view的用法说明
2021/03/03 Python
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
有模特经验的简历自我评价
2013/09/19 职场文书
医学专业个人求职自荐信格式
2013/09/23 职场文书
学校综治宣传月活动总结
2014/07/02 职场文书
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python