博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
应用JavaScript搭建一个简易页面图片无缝滚动效果
阅读量:5732 次
发布时间:2019-06-18

本文共 3765 字,大约阅读时间需要 12 分钟。

  页面图片无缝滚动JavaScript原理:移动的区块包含图片内容,区块相对父级元素进行定位脱离文档流。再令区块的left值每隔固定的时间进行等量减少(或增大)从而实现区块的匀速运动。由于每次间隔移动的时间设置很短,会“欺骗”人的眼睛,形成无缝滚动效果。

  脱离文档流:父元素为相对定位position:relative,区块为绝对定位;position:absolute。

  每隔固定时间进行left的变化:使用函数setInterval();

  设置HTML文档以及样式:

  滚动区域宽度=图片宽度x图片数目

  178x4=712

  基础的JavaScript代码:

window.οnlοad=function(){    var oDiv1=document.getElementById("div1");    var oUl=oDiv1.getElementsByTagName("ul")[0];    var aLi=oDiv1.getElementsByTagName("li");    //oUl的left值为当前获取的left值减去2px    function move()    {        oUl.style.left=oUl.offsetLeft-2+'px';        }    setInterval(move(),100);    };

  【问题:在JavaScript中,函数是否带括号有什么区别?】

  在向左移动后露出oDiv,图片截断,没有连续性。解决方案:oUl内的li元素在原有基础上增加1倍,并且根据新的li的宽度重新设计oUl的宽度值。在oUl的left值减少至一个oDiv1宽度值时(刚好四个图片偏移完毕),令其left值归零,重新开始oUl的left值偏移。

  增加后的JavaScript代码:

window.οnlοad=function(){    var oDiv1=document.getElementById("div1");    var oUl=oDiv1.getElementsByTagName("ul")[0];    var aLi=oDiv1.getElementsByTagName("li");    //li的数目翻倍    oUl.innerHTML=oUl.innerHTML+oUl.innerHTML;    //oUl的宽度重新计算    oUl.style.width=aLi[0].offsetWidth*aLi.length+'px';    /*判断若oUl已经偏移一次完毕(未增加li以前的宽度),那么令oUl的left值归零,否则left值就在当前的基础上加2px*/    function move()    {        if(-oUl.offsetLeft>=oUl.offsetWidth/2)        {            oUl.style.left=0;        }        else        {            oUl.style.left=oUl.offsetLeft-2+'px';            }    }    setInterval(move,100);                       };

  (1)此例中的offsetLeft为负值,比较需要注意正负号。oUl.offsetLeft>=712的写法就是没有考虑其值为负,虽然没有语法上的错误,但是逻辑上if的条件判断就是失效了;

  向左移动的无缝滚动已经完毕。倘若需要向右滚动呢?

function move()    {        if(oUl.offsetLeft>0)        {            oUl.style.left=-oUl.offsetWidth/2+'px';        }           oUl.style.left=oUl.offsetLeft+2+'px';        }    setInterval(move,100);

 

 (2)oUl的oUl.style.left=-oUl.offsetWidth/2+'px'中忘了写'px'导致代码无法正常运行,但是控制台不报错。

  (3)明明HTML的排序布局,ul都是以左边对齐div元素的左边,为什么在向右滚动时,开始会变成以右边对齐div元素的右边?到底是什么改变了布局?

  鼠标移入图片,滚动立即停止,鼠标移出图片,滚动继续。JavaScript代码:

function move()    {        if(-oUl.offsetLeft>oUl.offsetWidth/2)        {            oUl.style.left='0';        }        oUl.style.left=oUl.offsetLeft-2+"px";    }    var timer=setInterval(move,100);        oDiv1.onmouseover=function()    {        clearInterval(timer);                }    oDiv1.onmouseout=function()    {        timer=setInterval(move,100);        }

 

  (4)js的变量赋值为函数时,变量定义的函数是否立即被执行,譬如:var timer=setInterval(move,100);?

  

  实现点击按钮,控制图片的左右滚动方向

  添加按钮HTML代码:

 

     JavaScript代码:
window.οnlοad=function(){    var oDiv1=document.getElementById("div1");    var oUl=oDiv1.getElementsByTagName("ul")[0];    var aLi=oDiv1.getElementsByTagName("li");    var oBtn1=document.getElementById("btn1");    var oBtn2=document.getElementById("btn2");    var speed=2;    //li的数目翻倍    oUl.innerHTML=oUl.innerHTML+oUl.innerHTML;    //oUl的宽度重新计算    oUl.style.width=aLi[0].offsetWidth*aLi.length+'px';        function move()    {        if(-oUl.offsetLeft>oUl.offsetWidth/2)        {            oUl.style.left='0';        }           if(oUl.offsetLeft>0)        {            oUl.style.left=-oUl.offsetWidth/2+"px";        }        oUl.style.left=oUl.offsetLeft+speed+"px";    }    var timer=setInterval(move,100);        oBtn1.onclick=function()    {         speed=-2;        }            oBtn2.onclick=function()    {          speed=2;        }        oDiv1.onmouseover=function()    {        clearInterval(timer);                }        oDiv1.onmouseout=function()    {        timer=setInterval(move,100);        }    }

 

 (5)函数move()的重新合成构造在编写代码时不太清晰。为speed赋值时,错误的添加了var关键字 oBtn2.οnclick=function()

  {

  var speed=2;

  }

  这种写法与

  oBtn2.οnclick=function()

  {

  speed=2;

  }

  的区别在哪里?

 

转载于:https://www.cnblogs.com/f6056/p/9322365.html

你可能感兴趣的文章
第 68 章 Logical Volume Manager (LVM)
查看>>
膝盖中了一箭之康复篇-第八个月暨2月份目标总结
查看>>
IPA提交APPStore问题记录(一)
查看>>
有利于seo优化的网站地图不能取巧
查看>>
快照产品体验优化
查看>>
ASCII
查看>>
ibatis SqlMap not found
查看>>
Android SD卡创建文件和文件夹失败
查看>>
Ubuntu 14.04 vsftp refusing to run with writable root inside chroot问题解决方法
查看>>
Intellij IDEA远程调试tomcat
查看>>
hadoop的学习论坛
查看>>
替代Windows Cmd的利器PowerCmd
查看>>
Struts2 学习小结
查看>>
Linux IPMI 安装配置实用
查看>>
烂泥:wordpress迁移到docker
查看>>
.扒渣机的性能及优势 
查看>>
Linux下磁盘保留空间的调整,解决df看到的空间和实际磁盘大小不一致的问题
查看>>
RSA 生成公钥、私钥对
查看>>
C# ASP.NET 权限设计 完全支持多数据库多语言包的通用权限管理系统组件源码
查看>>
测试工具综合
查看>>