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 相关文章推荐
textarea中的手动换行处理的jquery代码
Feb 26 Javascript
javascript复制对象使用说明
Jun 28 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
Sep 09 Javascript
关于jQuery参考实例 1.0 jQuery的哲学
Apr 07 Javascript
JS是按值传递还是按引用传递
Jan 30 Javascript
详谈javascript中DOM的基本属性
Feb 26 Javascript
微信小程序 SocketIO 实例讲解
Oct 13 Javascript
分享javascript、jquery实用代码段
Oct 20 Javascript
详解AngularJS通过ocLazyLoad实现动态(懒)加载模块和依赖
Mar 01 Javascript
基于Bootstrap table组件实现多层表头的实例代码
Sep 07 Javascript
vue实现tab切换外加样式切换方法
Mar 16 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
Sep 14 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入门
2006/10/09 PHP
PHP比你想象的好得多
2014/11/27 PHP
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
JS注释所产生的bug 即使注释也会执行
2013/11/19 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
javascript实现简单查找与替换的方法
2015/07/22 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
mpvue将vue项目转换为小程序
2018/09/30 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
JavaScript实现轮播图特效
2020/04/10 Javascript
前端性能优化建议
2020/09/17 Javascript
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
python中使用sys模板和logging模块获取行号和函数名的方法
2014/04/15 Python
python实现的一个p2p文件传输实例
2014/06/04 Python
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
Python金融数据可视化汇总
2017/11/17 Python
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
Python中__slots__属性介绍与基本使用方法
2018/09/05 Python
python 处理string到hex脚本的方法
2018/10/26 Python
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
团员个人的自我评价
2013/12/02 职场文书
自荐书模板
2013/12/19 职场文书
人力资源管理系自荐信
2014/05/31 职场文书
奉献家乡演讲稿
2014/09/13 职场文书
我为党旗添光彩演讲稿
2014/09/13 职场文书
《黄山奇石》教学反思
2016/02/18 职场文书
2019学校运动会开幕词
2019/05/13 职场文书
深入理解MySQL中MVCC与BufferPool缓存机制
2022/05/25 MySQL