JS错误记录 - 右侧悬浮框 - 缓冲运动
本次练习错误总结:
1. 正确:
startMove( document.documentElement.clientHeight - oDiv.offsetHeight + scrollTop);
错误:
startMove(document.documentElement.clientHeight - oDiv.offsetTop + scrollTop);
startMove(iTarget); 这个函数的目标点 iTarget 应该是 可视窗高度 – div的高度 + 滚动条上方的滚动距离
div的高度是 offsetHeight,是一整个div的高度。 div的offsetTop是它的top位置值。
2. 必须用timer指定定时器,否则清除定时器时清除不了。
timer = setInterval(function (){ },30) // 不能直接写setInterval(function (){ },30)
3. 函数作用域问题?? (感觉经常犯这种错误)
var speed = (iTarget - oDiv.offsetTop)/4;
该速度变量是定时器使用,所以要定义在定时器的函数里面。 而不是定义到startMove( ); 这个运动函数里。
4.
startMove(document.documentElement.clientHeight - oDiv.offsetHeight + scrollTop);
//这里末尾不应该加‘px’, 括号内是函数的参数,而不是赋值给样式!
且后面定时器里 if(oDiv.offsetTop == iTarget) offsetTop返回值为数字。 iTarget不需要px单位。
5. clearInterval ( ); 清除定时器是在startMove ( ); 运动函数里面的一开始去清除,而不是外面。且应该在括号内指定(timer)。
6. 该段代码oDiv获取过两次。在window.onscroll函数和 function startMove( )里分别获取了。
因为运动函数和窗口启动自带的滚动条函数不是包含关系,所以要重新获取一遍div变量。
7. 定时器格式 setInterval ( function () { },30) 括号里要跟function函数。
8.
if(iTarget==oDiv.offsetTop) //应该是oDiv.offsetTop == iTarget,即运动的位置达到了目标值
疑问
为什么window.onscroll函数 和后面的startMove函数是分别运行的关系,而不是包含关系?
第二次写的代码批注:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>右侧悬浮框</title>
<style>
#div1{
width: 100px;
height: 150px;
background-color: plum;
position: absolute;
right: 0;
bottom: 0;
}
</style>
<script>
window.onscroll = function () {
var oDiv = document.getElementById('div1');
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //startMove(document.documentElement.clientHeight-oDiv.offsetTop+scrollTop);
startMove(document.documentElement.clientHeight-oDiv.offsetHeight+scrollTop);
//这里应该是oDiv.offsetHeight,不是offsetTop。 区别是???
}; var timer = null; function startMove(iTarget) { clearInterval(timer); var oDiv = document.getElementById('div1'); //setInterval(function (){ 这里没用timer指定定时器。。。所以前面清除定时器和这里对应不上。
timer = setInterval(function (){
var speed = (iTarget - oDiv.offsetTop)/4; //这个变量是定时器里面使用的,要定义到定时器的函数里。
speed = speed>0? Math.ceil(speed):Math.floor(speed); if (oDiv.offsetTop == iTarget)
{
clearInterval(timer);
}
else
{
oDiv.style.top = oDiv.offsetTop + speed + 'px';
}
},30)
}
</script>
</head>
<body style="height: 2000px";>
<div id="div1">
</div>
</body>
</html>
错误代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>右侧悬浮框</title>
<style>
#div1{
width: 100px;
height: 150px;
background-color: palevioletred;
position: absolute;
right: 0;
bottom: 0;
}
</style>
<script>
window.onscroll = function () {
var oDiv = document.getElementById('div1');
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; startMove(document.documentElement.clientHeight - oDiv.offsetHeight + scrollTop); //这里末尾不应该加‘px’! 括号内是函数的参数,而不是赋值给样式!
}; var timer = null;
//clearInterval(); //此处是否需要清除? 要清除,是在startMove运动开始里面去清除。 //timer=setInterval(function startMove(iTarget) //写法错误,定时器是在startMove函数里面开启,定时器和函数不是同级的。
function startMove(iTarget)
{
var oDiv = document.getElementById('div1');
//运动函数和窗口启动自带的滚动条函数不是包含关系,所以要重新获取一遍div变量。 clearInterval(timer); timer=setInterval(function () { //setInterval格式:括号里面要跟个函数function
var speed = (iTarget - oDiv.offsetTop)/4; // speed不是前面startMove传参的,是新的变量,这里要用var!!
speed=speed>0?Math.ceil(speed):Math.floor(speed); //if(iTarget==oDiv.offsetTop){ //应该是oDiv.offsetTop == iTarget,即运动的位置达到了目标值
if(oDiv.offsetTop == iTarget)
{
clearInterval(timer);
}
else
{
oDiv.style.top = oDiv.offsetTop+speed+'px';
}
},30);
}
</script>
</head>
<body style="height: 2000px;">
<div id="div1">
</div>
</body>
</html>
正确代码:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
<style>
#div1 {width:100px; height:150px; background:red; position:absolute; right:0; bottom:0;}
</style>
<script>
window.onscroll=function ()
{
var oDiv=document.getElementById('div1');
var scrollTop=document.documentElement.scrollTop||document.body.scrollTop; //oDiv.style.top=document.documentElement.clientHeight-oDiv.offsetHeight+scrollTop+'px';
startMove(document.documentElement.clientHeight-oDiv.offsetHeight+scrollTop);
//可视窗高度-div高度+滚动条顶部距离
}; var timer=null; function startMove(iTarget)
{
var oDiv=document.getElementById('div1');
//为什么要分别获取div1??
// 为什么window.onscroll函数 和后面的startMove函数是分别运行的关系,而不是包含关系? clearInterval(timer);
timer=setInterval(function (){
var speed=(iTarget-oDiv.offsetTop)/4;
speed=speed>0?Math.ceil(speed):Math.floor(speed); if(oDiv.offsetTop==iTarget)
{
clearInterval(timer);
}
else
{
oDiv.style.top=oDiv.offsetTop+speed+'px';
}
}, 30);
}
</script>
</head> <body style="height:2000px;">
<div id="div1"></div>
</body>
</html>
JS错误记录 - 右侧悬浮框 - 缓冲运动的更多相关文章
- js右侧悬浮框
示例:屏幕右侧悬浮框 原理:oDiv.style.top = document.documentElement.clientHeight - oDiv.offsetHeight + scrollTop ...
- JS错误记录 - getStyle代替offset、任意值运动框
本次练习错误总结: 1. 改变border的宽度,属性名称不是直接写border,而是borderWidth. 2. 运动函数 -- 清除定时器 -- 开启新的定时器. 不是在新定时器开启之后再清除 ...
- JS:“分享到”之类的悬浮框的运动原理(代码)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- JS错误记录 - 微博发布
<style> *{ margin: 0; padding: 0;} #ul1{ width: 400px; height: 400px; border: 1px solid #000; ...
- [Javascript]右侧悬浮框
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JS错误记录 - dom操作 - 排序
本次练习错误总结: 1. for循环要套到按钮的onclick里面,否则onclick点击事件无法依次执行. 2. var n1, var n2 这两个变量是arr.sort排序使用的,所以应该放在s ...
- JS错误记录 - 事件 - 拖拽
错误总结: 1. var disX = 0; 现在window.onload里声明变量,而不是在事件oDiv.onmousedown里面声明并赋值. 对于这个还不是很明白. 2. onmoused ...
- JS错误记录 - 按左右箭头div移动、一串div跟着鼠标移动
本次练习错误总结: 1. div跟着用户操作而移动,首先必须要绝对定位,否则无法移动. 2. if条件语句里面是双等号,不是单等号(赋值). 3. 坐标值没有Right,只能offsetLeft 加减 ...
- JS错误记录 - To-do List
var data = (localStorage.getItem('todolist'))? JSON.parse(localStorage.getItem('todolist')) : { todo ...
随机推荐
- 2018年湘潭大学程序设计竞赛 Fibonacci进制
Fibonacci数是非常有名的一个数列,它的公式为 f(n)=f(n-1)+f(n-2),f(0)=1,f(1)=2. 我们可以把任意一个数x表示成若干不相同的Fibonacci数的和, 比如说1 ...
- ES6学习笔记(十一)Object的继承者Reflect
1.概述 Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API.Reflect对象的设计目的有这样几个. (1) 将Object对象的一些明显属于语言内部的方法(比如O ...
- python 任何基础问题,包括语法等
*)copy()和deep copy() 参考链接:https://blog.csdn.net/qq_32907349/article/details/52190796 *)OPP面向对象编程 *)接 ...
- 一个Web报表项目的性能分析和优化实践(四):MySQL建立索引,唯一索引和组合索引
先大致介绍下项目的数据库信息. 数据库A:主要存放的通用的表,如User.Project.Report等. 数据库B.C.D:一个项目对应一个数据库,而且这几个项目的表是完全一样的. 数据库表的特点 ...
- java流1----InputStream、OutputStream、Reader、Writer
字节流和字符流 顾名思义,字节流就是操作的是字节,字符流操作的就是字符.其中字节流又可以分为字节输入流(InputStream)和字节输出流(OutputStream).同样的字符流也可以分为字符输入 ...
- vmware下minimum安装centos后配置网络
原文出处:http://www.cnblogs.com/lanhj/p/3785553.html 昨晚用vmware安装centos时选择minimum安装,目的熟悉基本配置. 上来想yum一个vim ...
- LicManager系统对各license类型终端客户机器的监控
与catia软件相似.以下这些软件都是汽车project设计软件.对汽车工业的的研发设计有着不可替代的作用.但它们都有着不同于各自的优势与不足之处. 可是在LicManager许可监控系统下,它们都是 ...
- Redis封装值ZSet
/// <summary> /// Sorted Sets是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列 /// 1.带有权重的元素 ...
- JS中部分 Array 对象方法介绍
1.concat() concat() 方法用于连接两个或多个数组.该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本 <script type="text/javascrip ...
- springboot 前后端分离开发解决跨域访问
最近新学习了Java EE开发框架springboot,我在使用springboot前后台分离开发的过程中遇到了跨域求问题.在网上寻找答案的过程中发现网上的解决方案大多比较零散,我在这里整理一个解决方 ...