2015-06-05怎么说呢,我想要实现的功能是很简单的,但是过程中,遇到不少问题。

我要实现的功能是页面右侧有辆小车,鼠标滚动或者拉动滚动条,小车消失,在底部点击“返还顶部”按钮后,页面缓慢向上滚动,同时小车出现,定位在屏幕底部不动,待页面滚动到顶部时,小车缓慢向上滑动(一开始是让小车匀速滑动的,后来加了个变速效果,让小车移动得更好看),制作一种动态效果。并且过程可重复进行。

div结构如下:

<div id="myAll" style="top:220px;">
<div id="myCar"><img id="myPhoto" src="http://www1.pcauto.com.cn/test/pcauto131219/test/up.png" widht="40px" height="56px"></div>
<div id="myText">
<p class="myXian">|</p>
<div class="myOwn">宝马92万起价居家必备</div>
</div>
</div>

其初始样式如下:

#myCar{width:40px;height:56px;position:absolute;right:0px;display:block;}
#myAll{width:45px;height:286px;position:absolute;top:220px;right:50px;display:block;text-align:center}
#myText{width:20px;height:230px;position:absolute;top:52px;right:10px;display:block;}
.myXian{text-align:center;background-color:white;line-height:10px;background-color: transparent;}
.myOwn{text-align:center;border:2px solid;border-radius:15px;background-color:red;}

(1)页面开始滚动,小车消失,很简单,代码如下:

window.onscroll=function(){
document.getElementById("myCar").style.position="fixed";
document.getElementById("myCar").style.display="none";
}

(2)在页面底部点击“返回顶部”按钮,页面缓慢向上滚动。“缓慢”,要求的是改变滚动条的速度,懵懂的我百度了一会,终于有了眉目。在页面滚动的同时,小车出现然后固定在页面上不动。利用timer=setInterval("runToTop()",5),让滚动条每次上移10px的距离,来达到减速的效果。

function runToTop(){
currentPosition=document.documentElement.scrollTop || document.body.scrollTop;
currentPosition-=10;
if(currentPosition>0)
{
window.scrollTo(0,currentPosition); //这里的0表示横坐标,currentPosition表示竖坐标
document.getElementById("myAll").style.top="500px";
document.getElementById("myAll").style.position="fixed";
document.getElementById("myAll").style.display="block";
}
}

(3)当滚动条到达最顶部的时候,小车要缓慢向上移动,创建动态的效果。

//代码接上面的if
else
{
setInterval(function(){
if(myTop>200){ //当小车从下往上移时与顶部的距离大于200时,小车持续上移
 document.getElementById("myAll").style.top=myTop+"px"; 
document.getElementById("myAll").style.position="absolute";
document.getElementById("myAll").style.display="block";
myTop-=25; }} ,100);}
window.scrollTo(0,0); //currentPosition的值可能为负数,这时需要把页面滚到顶部
clearInterval(timer);  //清除掉定时器,否则再次拉动滚动条向下的时候会有矛盾
}

(4)如果你觉得到此完成了任务,你就错了。执行程序之后,我发现其中存在冲突,在点击“返回顶部”,执行runToTop()方法的同时,window.onscroll方法也一起被执行了,这2个方法中小车的可见性(display属性值)是不同的,貌似window.onscroll的优先级比较高,掩盖掉了runTop()方法,导致小车并没有显示在页面上。后来,想到的解决方法是在window.onscroll方法中加入一个变量,适当改变它的值达到控制这个方法是否执行的目的。应用如下:

var isOk=true;   //初始值
window.onscroll=function(){
if(isOk==true)
{
document.getElementById("myAll").style.position="fixed";
document.getElementById("myAll").style.display="none";
}
}

(5)到此,貌似差不多可以了,但是运行起来还是发现了bug:小车虽第一次可以正常滑动,但是第二次点击“返回顶部”按钮起,小车的情况就和第一次不同了,大概知道是runToTop()方法的逻辑有些问题。我调试程序发现,第二次之后,if(myTop>200){ }里的代码,始终没有执行,原来小车经过第一次运动之后,全局变量myTop已经小于200了,需要对值进行一个重新赋值:

 myTop=500;//把mytop复原
timer=setInterval("runToTop()",5);

(6)最后还是有问题,纠结了很久,终于找到了原因,记得上面的代码中,我清掉了定时器timer吗(忘了烦请往回看看)?定时器timer中包含着一个让小车缓慢移动的定时器,删掉timer但是里面的子定时器还存在,导致小车运动速度过快,压根看不见了。解决方法,适时删除子定时器。

function myClick()
{
clearInterval(m); //此处需要清除上次所按“返回顶部”后设置的定时器
changeLenght=0.2;
changeLenght1=0.2;
myTop=500;//把mytop复原
timer=setInterval("runToTop()",5);
}

(7)小车移动采用了先加速,后减速的运动方式,最终的代码如下:

if(myTop>50)
{
m=setInterval(function(){ if(myTop>250){
document.getElementById("myAll").style.top=myTop+"px";
document.getElementById("myAll").style.position="absolute";
document.getElementById("myAll").style.display="block";
//不是匀速运动
//myTop-=1; myTop-=changeLenght;
//每次移动的距离增加0.02
changeLenght+=0.02;
}
//当车子离顶部的距离大于250时做加速运动,小于250时做减速运动
if(myTop<250&&myTop>50){
document.getElementById("myAll").style.top=myTop+"px";
document.getElementById("myAll").style.position="absolute";
document.getElementById("myAll").style.display="block"; myTop-=changeLenght;
//每次移动的距离减少0.02
changeLenght-=0.02;
}
}
,1);} //把开始动的时间减小就不会闪了
window.scrollTo(0,0);
clearInterval(timer);
isOk=true; //删除父定时器时,子的还在!!!!!!!!!!!!!!!!
}

程序终于正常运行了,做完不禁有点感叹,动手比较少,所以逻辑不够严谨,思路不够清晰。

JS实现会动的小车的更多相关文章

  1. D3.js 让图表动起来

    D3 支持制作动态的图表.有时候,图表的变化需要缓慢的发生,以便于让用户看清楚变化的过程,也能给用户不小的友好感. 一.什么是动态效果 绘制完成后不再发生变化的,这是静态的图表. 动态的图表,是指图表 ...

  2. JS限制 获取动太ID,播放视频

    JS限制textarea字数 function textdown(e) {textevent = e ; ) { return; } ) { alert("大侠,我手机屏幕小,先输入这么多字 ...

  3. 【js】插件—动效Velocity.js

    Velocity.js——加速JavaScript动画 一款替代jQuery的$ .animate()动效的插件.兼容IE8和Android2.3及以上. 相比较优点: 1.它比JQuery更快,并实 ...

  4. JS特效@缓动框架封装及应用

    | 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.变量CSS样式属性获取/赋值方法 给属性赋值:(既能获取又能赋值) 1)div.style.width 单个赋值:点语法,这个方法比较固定 ...

  5. 利用velocity.js将svg动起来

    关于velocity.js Velocity.js是一款jquery动画引擎插件,它拥有与jquery中的$.animate()相同的API,还打包了颜色动画,转换,循环,easing效果,类动画.滚 ...

  6. animation js控制 缓动效果

    <!DOCTYPE html><html><head><meta charset="utf-8" /><title>缓动 ...

  7. js控制div动起来

    代码: <html> <head> <title>让div动的测试</title> <script language="javascri ...

  8. JS实现缓动动画效果

    原理如下: 假设要从数值A变化到数值B,如果是线性运动,则每次移动距离是一样:如果是缓动,每次移动距离不一样.那如何才能不一样呢?很简单,按比例移动就可以. 例如:每次移动剩余距离的一半. 对吧,超容 ...

  9. python + selenium + Js 处理轮动条

    selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 常见场景: 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的. 这时候需要借 ...

随机推荐

  1. External Storage 数据存储

    一些数据存储的封装:http://hubingforever.blog.163.com/blog/static/17104057920129198236599/ External Storage数据存 ...

  2. ubuntu下导入kali源

    Kali-Linux之前的渗透神器BackTrack是基于Ubuntu的,界面比较友好,字体渲染看起来也比较舒服(也可能是本人用惯了 Ubuntu的缘故).后来官方终止BackTrack,开发Kali ...

  3. git学习笔记09-bug分支-自己的分支改到一半了-要去改bug怎么办?

    当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交: 并不是你不想提交,而是工作只进行到一半,还没法 ...

  4. java中类名.class、实例.getclass()区别

    import java.util.HashSet; import java.util.Iterator; /** * Created by GOD on 2016/1/23. * Class对象的生成 ...

  5. nodePPT 这可能是迄今为止最好的网页版PPT

    demo例子为:http://qdemo.sinaapp.com/#0 下载地址为:https://github.com/ksky521/nodeppt/

  6. ubuntu 安装遇到黑屏

    1.安装了ubuntu之后,进入登录页面,然后用输入密码后就黑屏了,按ctrl+alt+f1都没用,也进不去命令界面,查找资料后发现是必须在虚拟机->设置->硬件->显示器,上把加速 ...

  7. 播放列表文件用于HTTP实时流的使用

    广告播放清单(Discontinuities): 通常你会想要提供一系列的电影,在每个电影前面显示一些品牌(广告),让用户知道这些电影来自你的特定网站.一种方法是简单地将广告与每部电影合并.但是如果你 ...

  8. JAVA 调用命令并输出

    public class test10 { /** * @param args */ public static void main(String[] args) throws Exception { ...

  9. jdk和eclipse位数不一致出错

    32位的eclipse无法打开:找不64位jdk6的jvm.dll文件(64位的没有这个文件).网上说法可以通过设置eclipse初始化文件xxx.ini改变方式: 直接换成了同位数的了,没去试了.

  10. mysql概要(十二)事务

    1.特性 2.开启结束取消事务:需要选择支持事务的引擎 3,隐式提交事务: 4.事务的隔离级别: