js高手来帮我解释一下这段代码的意思 5
lastScrollY=-0;
function backtop()
{
diffY=document.body.scrollTop;
percent=.1*(diffY-lastScrollY);
if(percent>0)
{
percent=Math.ceil(percent);
}
else
{
percent=Math.floor(percent);
}
document.all.toolTipLayer2.style.pixelTop+=percent;
lastScrollY=lastScrollY+percent;
}
window.setInterval("backtop()",1);
</script>
一句一句来,越详细越好 展开
lastScrollY=-0; // 定义变量最后一个 滚动的Y
function backtop() { // 定义定时器的回调函数backtop
diffY=document.body.scrollTop; // body 的scrollTop也就是当前滚动的长度为diffY
percent=.1*(diffY-lastScrollY); // 定义变量percent 为 diffY - lastScrollY 乘0.1
// 上面的意思为 body 的滚动高度 减去定义的高度 的十分之一 赋值给 percent变量
if(percent>0) {
percent=Math.ceil(percent);
} else {
percent=Math.floor(percent);
}
// 如果计算出来的值是大于0的 就上取整 否则就下取整 (如果不懂可以百度下这两个函数)
//document.all.toolTipLayer2.style.pixelTop+=percent;
// 然后给toolTipLayer2这个元素的 pixelTop属性。加上percent (因为定时器是每1毫秒执行
//一次所以说是不停的加上percent)
lastScrollY=lastScrollY+percent;
// lastScrollY 的值变为 lastScrollY和percent之和。
// 其实这段代码的含义就是 让一个元素不停的滚动, 因为lastScrollY每次都会成为之前
// 的lastScrollY和percent之和。 所以diffY 减去 lastScrollY 乘以0.1 的值就会越来越小
// 直到他们的值 小于0 后 被下取整后成为0 就不再滚动了。 也就是一个从快到慢的滚动过程
}
window.setInterval("backtop()",1);
<script language=javascript>
lastScrollY=-0;
function backtop()
{
//拿到当前滚动位置(吐槽一下,这个变量名起的实在是不太合意)
diffY=document.body.scrollTop;
//计算比上次滚动移动了多少,并乘以0.1
percent=.1*(diffY-lastScrollY);
//页面坐标系的顶部y=0,越往下y越大。
//所以移动距离大于零就说明是往下滚动
if(percent>0)
{
//比如说这次向下滚动了123px,那percent就是12.3,
//ceil是向上取整(比它大的第一个整数),就变成了13
percent=Math.ceil(percent);
}
else
{
//比如说这次向上滚动了321px,那percent就是-32.1
//floor是向下取整(比它小的第一个整数),变成了-33
percent=Math.floor(percent);
}
//让all里面的toolTipLayer2的top加上刚才的percent
//换句话说让toolTipLayer2跟着滚动的方向移动,移动的距离比滚动的距离小的多
document.all.toolTipLayer2.style.pixelTop+=percent;
//这里更新了lastScrollY,我们在下面做详细的分析
lastScrollY=lastScrollY+percent;
}
// 每隔1毫秒执行一次backtop()
window.setInterval("backtop()",1);
</script>
首先,整段代码应该是从window.setInterval("backtop()",1)开始的,设置了一个定时器,每1毫秒执行一次backtop()。
其次,搞懂几个关键变量的含义:
diffY=document.body.scrollTop 这个diffY就是滚动位置。每次页面滚动,它就会改变(所谓滚动位置,其实就是页面的垂直方向的第几个像素处在浏览器顶部)
lastScrollY这个东东,它的含义并不是上次的滚动位置。我也不知道用什么词来描述它比较好,就直接说它的作用吧:一旦它跟diffY不一样,它就会逐渐向diffY靠近,每次靠近的距离percent等于它俩的差值乘以0.1。
比如一开始lastScrollY是0,滚动位置diffY是100;它就会先增加(100-0)x0.1=10,变成10,然后增加(100-10)x0.1=9,变成19,然后增加(100-19)x0.1=8.1(向上取整得到9),变成28,然后增加(100-28)x0.1=7.2(向上取整得到8)。。。。一直到它等于滚动位置diffY。我们可以看到每次它移动的步长逐渐变短。
想象一下如果有一个东西一开始就在页面顶部,滚动页面的时候,它的位置按照lastScrollY来改变,那么它的移动方式就是开始的时候很快地向滚动位置移动,然后逐渐变慢,最后到达滚动位置。
那么如果有一个东西一开始在距离页面顶部Y0处,每次我们让它的Y0也按照3里的东西同样的速度移动,是不是就可以让它以同样的方式移动到滚动位置+Y0的位置上呢?答案是是的!
document.all.toolTipLayer2.style.pixelTop这个是toolTipLayer2处在页面上的位置Y0了。
欢迎追问
diffY=document.body.scrollTop; //获取网页被卷去的高
percent=.1*(diffY-lastScrollY); //获取滚动的百分比
if(percent>0)
{
percent=Math.ceil(percent); //百分比向上类型转换 eq:0.6和0.4就会转换为1
}
else
{
percent=Math.floor(percent); //百分比向下类型转换 eq:0.6和0.4就会转换为0
}
document.all.toolTipLayer2.style.pixelTop+=percent; //获取页面中的toolTipLayer2的元素然后设置最近一个定位的父对象顶部的位置
lastScrollY=lastScrollY+percent; //这一句就不用解释了吧
window.setInterval("backtop()",1); //没隔一秒调用一次定时器(调用你那个定义的方法)
记得给分额。。。
回答的不错,有过还有一个小问题,如果我想做到在网页拖用条放在最顶上的时候自定div的absolute中的top定位如果改这段代码,
目的:在不往下拉时toolTipLayer2的div在网页中的位置可以自行控制,在拉动网页的时候还是保存top为0,请问可以做到吗?
lastScrollY=-0; /**定义一个全局变量lastScrollY*/
function backtop() /**一个名字叫backtop的方法*/
{
diffY=document.body.scrollTop; /**定义一个全局变量diffY,并赋值;document.body.scrollTop这个没有前文我不知道是什么*/
percent=.1*(diffY-lastScrollY); /**定义一个全局变量percent,计算这个你看的懂的吧“*1”是把他的值变成number类型的*/
if(percent>0) /**判断*/
{
percent=Math.ceil(percent); /**执行Math.ceil,并赋值给percent*/
}
else
{
percent=Math.floor(percent); /**执行Math.floor,并赋值给percent*/
}
document.all.toolTipLayer2.style.pixelTop+=percent; /**给document.all.toolTipLayer2.style.pixelTop赋值;例子:a+=b-->a=a+b;document.all.toolTipLayer2.style.pixelTop这个没有前文我不知道是什么*/
lastScrollY=lastScrollY+percent; /**简单的加法运算*/
}
window.setInterval("backtop()",1); /**这是一个javescript网页页脚函数,该函数的意义是让浏览器定时执行一些设定好的函数代码,如:window.setInterval('abc()',3000);即浏览器第隔3称秒都会执行一次abc函数*/
</script>
/**
Math.ceil()是常见编程语言中的常用代码,ceil() 方法执行的是向上取整计算,它返回的是大于或等于函数参数,并且与之最接近的整数
Math.ceil(12.2)//返回13
Math.ceil(12.7)//返回13
Math.ceil(12.0)// 返回12
Math.floor
floor -- 原意 地板。
数学函数,求一个浮点数的地板,就是求一个最接近它的整数,它的值小于或等于这个浮点数。
例如:
Math.floor(0.60) -- 0
Math.floor(0.40) -- 0
Math.floor(5) -- 5
Math.floor(5.1) -- 5
Math.floor(-5.1) -- -6
Math.floor(-5.9) -- -6
*/