首页 > 代码库 > 【JS学习】无缝滚动

【JS学习】无缝滚动

一、无缝滚动——基础

效果演示

物体运动基础

  让Div移动起来

  offsetLeft的作用,可以想到有offsetLeft就会有offsetRight,还会有offsetWight/offsetHeight

  用定时器让物体连续移动

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>运动基础</title>

<style>
#div1{
    width:200px;
    height:200px;
    background:red;
    position:absolute;
    left:200px;
    top:150px;
    margin:50px;
    }
</style>
<script>
/*可以使用定时器,每隔一段时间,将left改大一点*/
setInterval(function () {
    var oDiv=document.getElementById(‘div1‘);
    oDiv.style.left=oDiv.offsetLeft+10+‘px‘;/*每隔30毫秒将div左边距增加10像素,所以div会不断像右边移动*/
    },30);
</script>
</head>

<body>
<div id="div1">
</div>
</body>
</html>

 

二、无缝滚动

(1)效果原理

  让ul一直向左移动

(2)赋值li

  innerHTML和+=

  修改ul的width

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<style>
div,ul,li,body{
    margin:0;
    padding:0;
    }
    
#div1{
    /*div的宽必须容纳4张图的位置,178乘4*/
    width:712px;
    height:108px;
    margin:100px auto;
    position:relative;
    background:red;
    }
/*给ul设置绝对定位,是因为如果图片太多,每次都要设置left太麻烦,所以可以直接移动ul*/    
#div1 ul{
    position:absolute;
    left:0;
    top:0;
    }
    
#div1 ul li{
    float:left;
    width:178px;
    height:108px;
    list-style:none;
    }
</style>
<script>
window.onload=function ()
{
    var oDiv=document.getElementById(‘div1‘);
    var oUl=oDiv.getElementsByTagName(‘ul‘)[0];
    var aLi=oUl.getElementsByTagName(‘li‘);
    
    oUl.innerHTML=oUl.innerHTML+oUl.innerHTML;//8个li一起滚动
    oUl.style.width=aLi[0].offsetWidth*aLi.length+‘px‘;//整个ul的宽度,等于1个li的宽度乘li的数量
    
    setInterval(function(){
        oUl.style.left=oUl.offsetLeft-2+‘px‘;
    }, 30);
    }
</script>

</head>

<body>
<div id="div1">
    <ul>
        <li><img src="http://www.mamicode.com/img2/1.jpg" /></li>
        <li><img src="http://www.mamicode.com/img2/2.jpg" /></li>
        <li><img src="http://www.mamicode.com/img2/3.jpg" /></li>
        <li><img src="http://www.mamicode.com/img2/4.jpg" /></li>
    </ul>
</div>
</body>
</html>

 

(3)滚动过界后,重设位置

  判断过界

向左滚动

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<style>
div,ul,li,body{
    margin:0;
    padding:0;
    }
    
#div1{
    /*div的宽必须容纳4张图的位置,178乘4*/
    width:712px;
    height:108px;
    margin:100px auto;
    position:relative;
    background:red;
    overflow:hidden;
    /*把超过div1容器宽度的ul部分隐藏掉,让大家一直只看到4个*/
    }
/*给ul设置绝对定位,是因为如果图片太多,每次都要设置left太麻烦,所以可以直接移动ul*/    
#div1 ul{
    position:absolute;
    left:0;
    top:0;
    }
    
#div1 ul li{
    float:left;
    width:178px;
    height:108px;
    list-style:none;
    }
</style>
<script>
window.onload=function ()
{
    var oDiv=document.getElementById(‘div1‘);
    var oUl=oDiv.getElementsByTagName(‘ul‘)[0];
    var aLi=oUl.getElementsByTagName(‘li‘);
    
    oUl.innerHTML=oUl.innerHTML+oUl.innerHTML;//8个li一起滚动
    oUl.style.width=aLi[0].offsetWidth*aLi.length+‘px‘;//整个ul的宽度,等于1个li的宽度乘li的数量
    
    setInterval(function(){
        if(oUl.offsetLeft<-oUl.offsetWidth/2)
        {
            oUl.style.left=‘0‘;
            }
        oUl.style.left=oUl.offsetLeft-2+‘px‘;
    }, 30);
    }
</script>

</head>

<body>
<div id="div1">
    <ul>
        <li><img src="http://www.mamicode.com/img2/1.jpg" /></li>
        <li><img src="http://www.mamicode.com/img2/2.jpg" /></li>
        <li><img src="http://www.mamicode.com/img2/3.jpg" /></li>
        <li><img src="http://www.mamicode.com/img2/4.jpg" /></li>
    </ul>
</div>
</body>
</html>

向右滚动

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<style>
div,ul,li,body{
    margin:0;
    padding:0;
    }
    
#div1{
    /*div的宽必须容纳4张图的位置,178乘4*/
    width:712px;
    height:108px;
    margin:100px auto;
    position:relative;
    background:red;
    overflow:hidden;
    /*把超过div1容器宽度的ul部分隐藏掉,让大家一直只看到4个*/
    }
/*给ul设置绝对定位,是因为如果图片太多,每次都要设置left太麻烦,所以可以直接移动ul*/    
#div1 ul{
    position:absolute;
    left:0;
    top:0;
    }
    
#div1 ul li{
    float:left;
    width:178px;
    height:108px;
    list-style:none;
    }
</style>
<script>
window.onload=function ()
{
    var oDiv=document.getElementById(‘div1‘);
    var oUl=oDiv.getElementsByTagName(‘ul‘)[0];
    var aLi=oUl.getElementsByTagName(‘li‘);
    
    oUl.innerHTML=oUl.innerHTML+oUl.innerHTML;//8个li一起滚动
    oUl.style.width=aLi[0].offsetWidth*aLi.length+‘px‘;//整个ul的宽度,等于1个li的宽度乘li的数量
    
    setInterval(function(){
        //当ul的left刚好大于0的时候,立刻把整体UL向左拉回一半,即ul整体宽度的一半。
        if(oUl.offsetLeft>0)
        {
            oUl.style.left=-oUl.offsetWidth/2+‘px‘;
            }
        oUl.style.left=oUl.offsetLeft+2+‘px‘;
    }, 30);
    }
</script>

</head>

<body>
<div id="div1">
    <ul>
        <li><img src="http://www.mamicode.com/img2/1.jpg" /></li>
        <li><img src="http://www.mamicode.com/img2/2.jpg" /></li>
        <li><img src="http://www.mamicode.com/img2/3.jpg" /></li>
        <li><img src="http://www.mamicode.com/img2/4.jpg" /></li>
    </ul>
</div>
</body>
</html>

(4)无缝滚动的扩展,鼠标移入滚动的图片后能够暂停——移入停止定时器和移出开启定时器

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<style>
div,ul,li,body{
    margin:0;
    padding:0;
    }
    
#div1{
    /*div的宽必须容纳4张图的位置,178乘4*/
    width:712px;
    height:108px;
    margin:100px auto;
    position:relative;
    background:red;
    overflow:hidden;
    /*把超过div1容器宽度的ul部分隐藏掉,让大家一直只看到4个*/
    }
/*给ul设置绝对定位,是因为如果图片太多,每次都要设置left太麻烦,所以可以直接移动ul*/    
#div1 ul{
    position:absolute;
    left:0;
    top:0;
    }
    
#div1 ul li{
    float:left;
    width:178px;
    height:108px;
    list-style:none;
    }
</style>
<script>
window.onload=function ()
{
    var oDiv=document.getElementById(‘div1‘);
    var oUl=oDiv.getElementsByTagName(‘ul‘)[0];
    var aLi=oUl.getElementsByTagName(‘li‘);
    
    oUl.innerHTML=oUl.innerHTML+oUl.innerHTML;//8个li一起滚动
    oUl.style.width=aLi[0].offsetWidth*aLi.length+‘px‘;//整个ul的宽度,等于1个li的宽度乘li的数量
    
    function move ()
    {
        //当ul的left刚好大于0的时候,立刻把整体UL向左拉回一半,即ul整体宽度的一半。
        if(oUl.offsetLeft>0)
        {
            oUl.style.left=-oUl.offsetWidth/2+‘px‘;
            }
        oUl.style.left=oUl.offsetLeft+2+‘px‘;
    };
    
    var timer=setInterval(move, 30);
    
    /*当鼠标移入图片时,图片停止滚动,可以给整个div添加事件*/
    oDiv.onmouseover=function()
    {
        /*当鼠标移入时,把定时器关掉*/
        clearInterval(timer);
        };
    /*当鼠标移出的时候,希望图片可以继续移动*/
    oDiv.onmouseout=function()
    {
        timer=setInterval(move, 30);
        /*必须把定时器启动的动作放在变量timer里面,当鼠标移入时,停止变量timer就代表停止了定时器;当鼠标移出时,启动变量timer,就代表重启了定时器。
        如果直接写setInterval(move, 30);而不是赋值给timer,那么在下一次移入鼠标时,图片不会停止,移出出鼠标后图片还会加速移动。
        因为此时有一个没被timer赋值的定时器一直在跑,即使鼠标移入停止的只是被timer赋值的定时器,图片不会停止移动,因为停止定时器的动作影响不了没有被timer赋值的定时器。
        反而会使鼠标移开之后,未被timer赋值的定时器在已经启动的同时又启动了一次,导致图片移动速度加倍*/
        };
    
    };
</script>

</head>

<body>
<div id="div1">
    <ul>
        <li><img src="http://www.mamicode.com/img2/1.jpg" /></li>
        <li><img src="http://www.mamicode.com/img2/2.jpg" /></li>
        <li><img src="http://www.mamicode.com/img2/3.jpg" /></li>
        <li><img src="http://www.mamicode.com/img2/4.jpg" /></li>
    </ul>
</div>
</body>
</html>

(5)2个小按钮改变无缝滚动的方向——修改speed

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<style>
div,ul,li,body{
    margin:0;
    padding:0;
    }
    
#div1{
    /*div的宽必须容纳4张图的位置,178乘4*/
    width:712px;
    height:108px;
    margin:100px auto;
    position:relative;
    background:red;
    overflow:hidden;
    /*把超过div1容器宽度的ul部分隐藏掉,让大家一直只看到4个*/
    }
/*给ul设置绝对定位,是因为如果图片太多,每次都要设置left太麻烦,所以可以直接移动ul*/    
#div1 ul{
    position:absolute;
    left:0;
    top:0;
    }
    
#div1 ul li{
    float:left;
    width:178px;
    height:108px;
    list-style:none;
    }
</style>
<script>
window.onload=function ()
{
    var oDiv=document.getElementById(‘div1‘);
    var oUl=oDiv.getElementsByTagName(‘ul‘)[0];
    var aLi=oUl.getElementsByTagName(‘li‘);
    var speed=-2;
    
    oUl.innerHTML=oUl.innerHTML+oUl.innerHTML;//8个li一起滚动
    oUl.style.width=aLi[0].offsetWidth*aLi.length+‘px‘;//整个ul的宽度,等于1个li的宽度乘li的数量
    
    function move ()
    {
        if(oUl.offsetLeft<-oUl.offsetWidth/2)
        {
            oUl.style.left=‘0‘;
            }
        
        //当ul的left刚好大于0的时候,立刻把整体UL向左拉回一半,即ul整体宽度的一半。
        if(oUl.offsetLeft>0)
        {
            oUl.style.left=-oUl.offsetWidth/2+‘px‘;
            }
        oUl.style.left=oUl.offsetLeft+speed+‘px‘;
    };
    
    var timer=setInterval(move, 30);
    
    /*当鼠标移入图片时,图片停止滚动,可以给整个div添加事件*/
    oDiv.onmouseover=function()
    {
        /*当鼠标移入时,把定时器关掉*/
        clearInterval(timer);
        };
    /*当鼠标移出的时候,希望图片可以继续移动*/
    oDiv.onmouseout=function()
    {
        timer=setInterval(move, 30);
        };
        
    document.getElementsByTagName(‘a‘)[0].onclick=function()
    {
        speed=-2;//变量speed为-2就是向左滚动
        };
    document.getElementsByTagName(‘a‘)[1].onclick=function()
    {
        speed=2;//变量speed为2就是向右滚动
        };
    };
</script>

</head>

<body>
<a href="http://www.mamicode.com/javascripe:;">向左走</a>
<a href="http://www.mamicode.com/javascripe:;">向右走</a>
<div id="div1">
    <ul>
        <li><img src="http://www.mamicode.com/img2/1.jpg" /></li>
        <li><img src="http://www.mamicode.com/img2/2.jpg" /></li>
        <li><img src="http://www.mamicode.com/img2/3.jpg" /></li>
        <li><img src="http://www.mamicode.com/img2/4.jpg" /></li>
    </ul>
</div>
</body>
</html>

【JS学习】无缝滚动