JS 轮播图(无缝连接的轮播图实现,含代码供参考)

需求:实现轮播图,图片无缝切换,自动播放。

实现效果:

思考一下:在图片列表后面多加一张图片,这张图片是第一张图片(为了确保无缝衔接)。图片就是平铺放在一个pic里面的,每次移动就是改变的pic的left值。

        

来撸代码~~。所有的代码放在最后面,这里只讲一些重要的方法:

为防止懵逼:先贴出封装函数move()的代码供参考

function move(ele, attr, speed, target, callback){
   //获取当前的位置
   //从左往右进行移动 --- current<target speed
   //从右往左进行移动 --- current>target -speed
   var current = parseInt(getStyle(ele, attr));
   //   810 > 800
   if(current>target){
	   speed = -speed;
   }

   //定时器累加问题 --- 先清除再开启
   clearInterval(ele.timer);

   ele.timer = setInterval(function(){
	   //获取元素的现在位置
	   var begin = parseInt(getStyle(ele, attr));
	   //步长
	   var step = begin + speed;

	   //判断当step>800, 让step = 800
	   //从左往右进行移动 --- speed>0 正值
	   //从右往左进行移动 --- speed<0 负值
	   //   -10              0            10           超过800直接变成  800
	   if(speed<0 && step<target || speed>0 && step>target){
		   step = target;
	   }

	   //赋值元素
	   ele.style[attr] = step + "px";

	   //让元素到达目标值时停止 800px
	   if(step == target){
		   clearInterval(ele.timer);
		   //当move函数执行完毕后, 就执行它了
		   //当条件都满足时才执行callback回调函数
		   callback && callback();
	   }

   },30)//步长是30
}

第一步:我们先来实现那个圆形按钮的点击事件。 //说明一下,setBtn();是设置按钮的背景跟随。像这样。

        

第二步:实现左右两个按钮的点击事件

先做右边的点击事件,实现

//onNext
            function Next(){
                index ++;         //len 指的是图片的数组的个数 - 2   因为span按钮只有5个,索引从0到4
                if(index > len)
                {
                    index = 0;
                }
                //                   - 移动单张图片的宽度 * index   回调函数
                move(pic,"left",20,-index * lis[0].offsetWidth,setBtn);
            }

做左边的点击事件,实现

function Pre(){
                //全局的索引值 减1
                index --;
                if(index < 0 )
                {
                    index = len - 1;
                    pic.style.left = -len * lis[0].offsetWidth + "px";

                }
                //没有使用回调函数 是为了做一个返回去的效果.
                move(pic,"left",20,-index * lis[0].offsetWidth);
                //按钮背景跟随
                setBtn();
            }

自动轮播,实现:

//自动轮播
            function autoPlay(){
                timer = setInterval(function(){
                    Next();
                },3000);
            }

所有代码实现:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            .slider{
                width: 500px;
                height: 300px;
                border: 1px solid;
                margin: 50px auto;
                position: relative;
                /* overflow: hidden; */
            }
            .slider .pic{
                /* width: 500px; */
                /* width: calc(500px*6); */
                height: 300px;
                position: absolute;
                left: 0;
            }
            .slider .pic li{
                width: 500px;
                height: 300px;
                list-style: none;
                float: left;
            }
            .slider .pic li img{
                width: 100%;
                height: 100%;
            }
            .slider .btn{
                width: 150px;
                height: 20px;
                position: relative;
                margin: 0 auto;
                top: 260px;
            }
            .slider .btn span{
                float: left;
                width: 20px;
                height: 20px;
                background-color: #000000;
                color: #fff;
                border-radius:50%;
                font-size: 12px;
                text-align: center;
                line-height: 20px;
                margin: 0 5px;
                cursor: pointer;
            }
            .bigBtn{
                width: 100%;
                height: 50px;
                position: absolute;
                top: 50%;
                margin-top: -25px;
            }
            .bigBtn div{
                width: 50px;
                height: 50px;
                background-color: #000000;
                color: #fff;
                font-size: 30px;
                text-align: center;
                line-height: 50px;
                cursor: pointer;
            }
            .bigBtn div:nth-child(1){
                float: left;
            }
            .bigBtn div:nth-child(2){
                float: right;
            }
            .bg{
                background-color: greenyellow !important;
            }
            #sliderBox{
                margin: 0 auto;
                width: 500px;
                height: 300px;
                overflow: hidden;
                position: absolute;
                top: 0;
                left: 0;
            }
        </style>
    </head>
    <body>
        <div class="slider">
            <div id="sliderBox">
                <div class="pic">
                    <ul>
                        <li><img src="img/pic1.jpg" ></li>
                        <li><img src="img/pic2.jpg" ></li>
                        <li><img src="img/pic3.jpg" ></li>
                        <li><img src="img/pic4.jpg" ></li>
                        <li><img src="img/pic5.jpg" ></li>
                        <li><img src="img/pic1.jpg" ></li>
                    </ul>
                </div>
            </div>
            <div class="btn">
                <span>1</span>
                <span>2</span>
                <span>3</span>
                <span>4</span>
                <span>5</span>
            </div>
            <div class="bigBtn">
                <div class="previous">&lt;</div>
                <div class="next">&gt;</div>
            </div>
        </div>
        <script src="js/move.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            //获取所有元素
            let slider = document.querySelector(".slider")
            let lis = document.querySelectorAll("li");
            let spanBtns = document.querySelectorAll(".btn span");
            let previous = document.querySelector(".previous");
            let next = document.querySelector(".next");
            let pic = document.querySelector(".pic");
            //设置元素的索引值 全局索引
            var index = 0;
            //图片数组的长度  4
            let len = lis.length - 1 ;
            //设置初始pic长度.
            pic.style.width = (len + 2)*parseInt(getStyle(lis[0],"width"))+ "px";
            //设置定时器
            let timer = null;
            // 圆形按钮点击事件 使用的是let变量,即不会发生先循环完毕,再执行事件
            for(let j = 0 ; j < len ; j++)
            {
                //spanBtns就是存圆形按钮元素的数组.  index是全局的一个值,用来作为索引值.
                spanBtns[j].onclick = function(){
                    index = j;
                    //这里使用了一个封装的移动函数.
                    //第一个参数值是需要改变的元素,第二个是属性
                    //第三个是步长. 第四个是目标位置. 第五个参数是回调函数.
                    move(pic,"left",20,-index*lis[0].offsetWidth,function(){
                        setBtn();
                    });
                }
            }
            function setBtn(){
                if(index >= len)
                {
                    index = 0;
                    pic.style.left = 0;
                }
                for(var i = 0 ; i < len ; i++)
                {
                    spanBtns[i].className = "";
                }
                spanBtns[index].className = "bg";
            }
            //onNext
            function Next(){
                index ++;
                if(index > len)
                {
                    index = 0;
                }
                //                   - 移动单张图片的宽度 * index   回调函数
                move(pic,"left",20,-index * lis[0].offsetWidth,setBtn);
            }
            function Pre(){
                //全局的索引值 减1
                index --;
                if(index < 0 )
                {
                    index = len - 1;
                    pic.style.left = -len * lis[0].offsetWidth + "px";

                }
                //没有使用回调函数 是为了做一个返回去的效果.
                move(pic,"left",20,-index * lis[0].offsetWidth);
                //按钮背景跟随
                setBtn();
            }
            //绑定点击事件
            previous.onclick = Pre;
            next.onclick = Next;

            slider.onmouseover = function(){
                clearInterval(timer);
            }
            slider.onmouseout = function(){
                autoPlay();
            }
            //自动轮播
            function autoPlay(){
                timer = setInterval(function(){
                    Next();
                },3000);
            }
            setBtn();
            autoPlay();
        </script>
    </body>
</html>

引用的js文件:

/*
    封装move函数

    ele 要传递的元素

    attr 属性 --- 字符串

    speed  速度  正负值

    target 目标值(结束位置)

    callback 回调函数 --- 当这个函数执行完毕后,再去调用它
*/
function move(ele, attr, speed, target, callback){
   //获取当前的位置
   //从左往右进行移动 --- current<target speed
   //从右往左进行移动 --- current>target -speed
   var current = parseInt(getStyle(ele, attr));
   //   810 > 800
   if(current>target){
       speed = -speed;
   }

   //定时器累加问题 --- 先清除再开启
   clearInterval(ele.timer);

   ele.timer = setInterval(function(){
       //获取元素的现在位置
       var begin = parseInt(getStyle(ele, attr));
       //步长
       var step = begin + speed;

       //判断当step>800, 让step = 800
       //从左往右进行移动 --- speed>0 正值
       //从右往左进行移动 --- speed<0 负值
       //   -10              0            10           超过800直接变成  800
       if(speed<0 && step<target || speed>0 && step>target){
           step = target;
       }

       //赋值元素
       ele.style[attr] = step + "px";

       //让元素到达目标值时停止 800px
       if(step == target){
           clearInterval(ele.timer);
           //当move函数执行完毕后, 就执行它了
           //当条件都满足时才执行callback回调函数
           callback && callback();
       }

   },30)
}

//获取元素的方式 --- 注意点:如果在IE浏览器下, 要指定默认的值, 如果不指定获取的是auto
function getStyle(obj, name){
   if(window.getComputedStyle){
       return getComputedStyle(obj, null)[name];
   }else{
       return obj.currentStyle[name];
   }
}

要移植使用的话,新建一个move.js 将最下面的代码拷进去 放在js文件夹下。

类似这样的目录即可。

下次的博客一定会写更好的。加油。

原文地址:https://www.cnblogs.com/kindMonster/p/11676959.html

时间: 2024-08-07 11:06:55

JS 轮播图(无缝连接的轮播图实现,含代码供参考)的相关文章

告别组件之教你使用原生js和css写移动端轮播图

在工作中由于项目需要要写一个轮播图,本想使用组件直接调用实现快速开发,但是一想到自己经常使用组件但是让自己手写的话确实一点都不会. 一个不会手写组件的前端程序员不是一个好程序员!于是打算自己手写一个. 老规矩,首先看一下最终效果,这个最终可以实现定时自动播放,触摸滑动,手动修改下面横条效果等功能. 项目中使用到的HTML代码如下 <div class="banner"> <ul class="clearfix"> <li><

js实现淘宝首页图片轮播效果

原文:http://ce.sysu.edu.cn/hope2008/Education/ShowArticle.asp?ArticleID=10585 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>淘宝首页图片轮播效果</title> <style> <!-- * {margin: 0;padding:0;} body

JS图片自动和可控的轮播切换特效

详细内容请点击 点击这里查看效果: http://hovertree.com/texiao/js/1.htm HTML文件代码如下:  <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8"/> <title>JS图片自动和可控的轮播切换特效 - 何问起 HoverTree</ti

js无缝轮播 和淡入淡出轮播

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> *{margin:0;padding:0;} ul,li{ list-style: none; } #banner{ width: 800px; height: 400px; margin: 30

轮播图片 高效图片轮播,两个imageView实现

该轮播框架的优势: 文件少,代码简洁 不依赖任何其他第三方库,耦合度低 同时支持本地图片及网络图片 可修改分页控件位置,显示或隐藏 自定义分页控件的图片,就是这么个性 自带图片缓存,一次加载,永久使用 性能好,占用内存少,轮播流畅 实际使用 我们先看demo,代码如下 运行效果 轮播实现步骤 接下来,笔者将从各方面逐一分析. 层级结构 最底层是一个UIView,上面有一个UIScrollView以及UIPageControl,scrollView上有两个UIImageView,imageView

WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放、图片立体轮播、图片倒影立体滚动)效果实现

原文:WPF技术触屏上的应用系列(四): 3D效果图片播放器(图片立体轮放.图片立体轮播.图片倒影立体滚动)效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,54寸大屏电脑电视一体机.要求有很炫的展示效果,要有一定的视觉冲击力,可触控操作.当然满足客户的要求也可以有其它途径.但鉴于咱是搞 .NET技术的,首先其冲想到的微软WPF方面,之前对WPF的了解与学习也只是停留在比较浅的层面,没有进一步深入学习与应用.所以在项目接来以后,也就赶鸭子上架了

幸福村站——成都传智播客程序员写出你的烧烤代码

又是一个阳光明媚,风和日丽之天,如果作为程序员的你还在键盘上苦苦的想着下一串代码该怎么写的话,那你就弱爆了.俗语说得好,学习要劳逸结合,写代码更是需要清晰的思维,在传智播客Java基础班开班一个月后,班主任决定带着这群"猿猴们"去传说中的"幸福村"放松放松,我们也跟着一起去感受程序员们的烧烤代码的幸福吧! 带着好奇的心理走进了"幸福梅林站",一个又一个的农家乐园开始浮现在我们眼前,那里朴素的民风和美丽的风景让我们暂时忘却了学习上的烦恼和城市里的喧

Echarts生成饼状图、条形图以及线形图 JS封装

1.在我们开发程序中,经常会用到生成一些报表,比方说饼状图,条形图,折线图等.不多说了,直接上封装好的代码,如下Echarts.js所示 以下代码是封装在Echarts.js文件中 /** * Created by Administrator on 2015/8/7. */ var charec; // 路径配置 require.config({ paths: { echarts: 'http://echarts.baidu.com/build/dist' } }); // 按需加载所需图表 r

H3C组播系列之IP组播概述

一.组播的基本介绍 组播指发送源将产生的单一IP数据包通过网络发送给一组特定接收者的网络传输方式.组播结合了单播和广播的优点,在进行点到多点传输时,发送源不需要关心接受者的数目,仅需要发送一份报文:路由器仅关心接口下是否有接收者,同样不需要关心接收者的数量,所以在路由器之间的链路上也仅传送一份报告. 和单播相比,组播减轻了发送源的负担,并且提高了链路的有效利用率.此外,发送源可以同时发送报文给多个接收者,可以满足低延时应用的需求. 和广播相比,组播方式下路由器仅在有接收者的接口复制报文,报文最终