JS错误记录 - 右侧悬浮框 - 缓冲运动
程序员文章站
2022-06-30 11:48:48
本次练习错误总结: 第二次写的代码批注: 错误代码: 正确代码: ......
本次练习错误总结:
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>
上一篇: 简单的全选和反选功能以及选中传值实现
下一篇: 2019年初“找工作”搜索量超历年十倍