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入门教程(5) js Screen屏幕对象
Jan 31 Javascript
javascript 兼容所有浏览器的DOM扩展功能
Aug 01 Javascript
jquery实现图片翻页效果
Dec 23 Javascript
jquery修改属性值实例代码(设置属性值)
Jan 06 Javascript
JavaScript原生对象常用方法总结(推荐)
May 13 Javascript
jQuery轻松实现无缝轮播效果
Mar 22 jQuery
js实现本地图片文件拖拽效果
Jul 18 Javascript
vue debug 二种方法
Sep 16 Javascript
JavaScript数组去重的几种方法
Apr 07 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
May 22 Javascript
通过GASP让vue实现动态效果实例代码详解
Nov 24 Javascript
jQuery实现王者荣耀手风琴效果
Jan 17 jQuery
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
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
2012/06/17 PHP
分享一段PHP制作的中文拼音首字母工具类
2014/12/11 PHP
php+mysql数据库实现无限分类的方法
2014/12/12 PHP
对laravel的session获取与存取方法详解
2019/10/08 PHP
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
深入学习JavaScript对象
2015/10/13 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
jQuery使用cookie与json简单实现购物车功能
2016/04/15 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
微信小程序之圆形进度条实现思路
2018/02/22 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
JavaScript中常用的3种弹出提示框(alert、confirm、prompt)
2020/11/10 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
python实现一次创建多级目录的方法
2015/05/15 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
Python学习之os模块及用法
2020/06/03 Python
python生成xml时规定dtd实例方法
2020/09/21 Python
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
美国乡村商店:Plow & Hearth
2016/09/12 全球购物
英国网上自行车商店:Tredz Bikes
2019/10/29 全球购物
我的中国梦演讲稿400字
2014/08/19 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
2015年党支部公开承诺书
2015/01/22 职场文书
幼儿园母亲节活动总结
2015/02/10 职场文书
一个成功的互联网创业项目,必须满足这些要求
2019/08/23 职场文书
web前端之css水平居中代码解析
2021/05/20 HTML / CSS
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫