[前端] js实现点击切换和自动播放的轮播图

2636 0
黑夜隐士 2022-10-21 15:52:19 | 显示全部楼层 |阅读模式
本文实例为大家分享了js实现点击切换和自动播放的轮播图,供大家参考,具体内容如下
轮播图案例
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.   <title>Document</title>
  7. </head>
  8. <body>
  9. <script>
  10.   // 1、布局
  11.   // 2、定义当前第几张图片和应该向什么方向运动
  12.   // 3、将需要放置的图片根据方向放在前面或者后面
  13.   // 4、将整个容器向左或者向右移动
  14.   // 5、完成后将上一次的图片删除
  15.   // imgCon  放置所有图片的容器
  16.   // dotList 放置小圆点列表
  17.   // bnList  放置左右按钮的数组
  18.   // imgList 放置所有图片的数组
  19.   // pos   确认当前图片是第几张
  20.   // direction图片运行的方向
  21.   // imgSrcList 图片地址数组
  22.   var imgCon,ul,preDot;
  23.   var pos=0,
  24.     x=0,
  25.     bool=false;
  26.     dotList=[],
  27.     imgList=[],
  28.     bnList=[],
  29.     time=300,
  30.     imgSrcList=["./img/a.png","./img/b.png","./img/c.png","./img/d.png","./img/e.png"]
  31.     direction=""
  32.     autoBool=false;
  33.   const WIDTH=1500;
  34.   const HEIGHT=500;
  35.   const LEFT=Symbol();
  36.   const RIGHT=Symbol();
  37.   const SPEED=40;
  38.   init();
  39.   /*
  40.     init() 初始化函数
  41.     1、创建轮播图外层容器
  42.     2、创建轮播图图片容器
  43.     3、创建按钮列表
  44.     4、创建小圆点列表
  45.     5、将轮播图容器放在body中
  46.     6、切换小圆点,因为当前是第0张,所以让第一个小圆点背景为红色
  47.     7、将小圆点容器设置水平居中
  48.     8、设置时间间隔,每16毫秒执行animation函数一次,因为一秒是1000毫秒
  49.       一秒中执行60次,就是60帧频,每次花费的时间是16.6666毫秒
  50.     9、给最外层的轮播图增加事件侦听,一个是鼠标进入,一个是鼠标离开
  51.   */
  52.   function init(){
  53.     var carousel=ce("div",{
  54.       width:WIDTH+"px",
  55.       height:HEIGHT+"px",
  56.      position:"relative",
  57.       margin:"auto",
  58.       overflow:"hidden"
  59.     });
  60.     createImgCon(carousel);
  61.     createButton(carousel);
  62.     createDotList(carousel);
  63.     document.body.appendChild(carousel);
  64.     changeDot();
  65.     ul.style.left=(WIDTH-ul.offsetWidth)/2+"px";
  66.     setInterval(animation,16);
  67.     carousel.addEventListener("mouseenter",mouseHandler);
  68.     carousel.addEventListener("mouseleave",mouseHandler);
  69.   }
  70.   /*
  71.     轮播图进入和离开的事件函数
  72.     1、如果进入轮播图,设置自动轮播的开关是false,不会自动轮播
  73.       并且重新将计时设置为300
  74.     2、如果离开轮播图,设置自动轮播开关是true,就会自动轮播了
  75.   */
  76.   function mouseHandler(e){
  77.     if(e.type==="mouseenter"){
  78.       autoBool=false;
  79.       time=300;
  80.     }else if(e.type==="mouseleave"){
  81.       autoBool=true;
  82.     }
  83.   }
  84.   /*
  85.     创建元素
  86.     参数:
  87.       type  创建元素的类型,字符串
  88.       style  创建元素的样式,对象,使用对象方式给出该容器的样式
  89.     1、根据类型创建元素
  90.     2、将给入的样式设置给元素的行内样式
  91.     3、返回创建好的元素
  92.   */
  93.   function ce(type,style){
  94.     var elem=document.createElement(type);
  95.     // ES6的方法,将后面的对象中的属性复制到前面对象中
  96.     Object.assign(elem.style,style);// 等同于下面写法
  97.     /* for(var prop in style){
  98.       elem.style[prop]=style[prop];
  99.     } */
  100.     return elem;
  101.   }
  102.   /*
  103.     创建轮播图容器和图片
  104.     参数:
  105.       parent 父容器,将创建好的容器和图片放在父容器内
  106.     1、创建图片容器,容器宽度是两张图片的宽度
  107.     2、根据所有轮播图地址数组,创建所有图片并且放在数组imgList中
  108.     3、将第0张图片放在创建图片容器imgCon中
  109.     4、将图片容器放在整个轮播图容器中
  110.   */
  111.   function createImgCon(parent){
  112.     imgCon=ce("div",{
  113.       position:"absolute",
  114.       width:2*WIDTH+"px",
  115.       height:HEIGHT+"px",
  116.       left:0
  117.     });
  118.     for(var i=0;i<imgSrcList.length;i++){
  119.       var img=ce("img",{
  120.         width:WIDTH+"px",
  121.         height:HEIGHT+"PX"
  122.       });
  123.       img.src=imgSrcList[i];
  124.       imgList.push(img);
  125.     }
  126.     imgCon.appendChild(imgList[0]);
  127.     parent.appendChild(imgCon);
  128.   }
  129.   /*
  130.     创建左右按钮函数
  131.     参数:
  132.       parent 父容器,将创建好的按钮放在父容器内
  133.     1、创建按钮地址数组
  134.     2、循环这个地址数组,创建所有图片,并且放置对应的位置
  135.     3、设置图片地址
  136.     4、将按钮图片放在轮播图容器中
  137.     5、给左右按钮增加点击事件执行函数bnClickHander
  138.   */
  139.   function createButton(parent){
  140.     // 局部变量
  141.     var arr=["left","right"];
  142.     for(var i=0;i<arr.length;i++){
  143.       var img=ce("img",{
  144.         position:"absolute",
  145.         // (外容器高度-当前图片高度) / 2 垂直居中
  146.         top:(HEIGHT-60)/2 +"px",
  147.         // 如果是第0张图片,左边按钮,定位居左50像素,否则none
  148.         left:i===0 ? "50px" : "none",
  149.         // 如果是第1张图片,右边按钮,定位居右50像素,否则none
  150.         right:i===1 ? "50px" : "none",
  151.       });
  152.       img.src=`./img/${arr[i]}.png`;
  153.       bnList.push(img);
  154.       parent.appendChild(img);
  155.       img.addEventListener("click",bnClickHander);
  156.     }
  157.   }
  158.   /*
  159.     创建小圆点容器
  160.     参数:
  161.       parent 父容器,将创建好的小圆点放在父容器内
  162.     1、创建ul设置样式
  163.     2、根据图片地址的数组,循环若干次,有多少图片就循环多少次创建小圆点
  164.     3、将每个小圆点存在数组dotList中
  165.     4、将小圆点放在ul中
  166.     5、给ul增加点击事件,实际是点击小圆点,事件委托
  167.   */
  168.   function createDotList(parent){
  169.     ul=ce("ul",{
  170.       listStyle:"none",
  171.       margin:0,
  172.       padding:0,
  173.       position:"absolute",
  174.       bottom:"50px"
  175.     });
  176.     for(var i=0;i<imgSrcList.length;i++){
  177.       var dot=ce("li",{
  178.         width:"28px",
  179.         height:"28px",
  180.         borderRadius:"50%",
  181.         border:"2px solid #FF0000",
  182.         float:"left",
  183.         marginLeft:i===0 ? "0px" : "15px"
  184.       });
  185.       dotList.push(dot);
  186.       ul.appendChild(dot);
  187.     }
  188.     // dotList=Array.from(ul.children);
  189.     parent.appendChild(ul);
  190.     ul.addEventListener("click",dotClickHandler);
  191.   }
  192.   /*
  193.     点击左右按钮事件函数
  194.     e  点击事件  MouseEvent
  195.     e.target 是被点击的按钮图片
  196.     如果bool是true,也就是当前轮播图正在播放时,点击按钮跳出,不继续执行
  197.     1、判断被点击图片的地址里面是包含有left.png字符串
  198.     如果有,就是点击左侧按钮,反之就是右侧按钮
  199.     2、如果点击了左侧按钮,当前图片下标-1
  200.     如果小于0,让它为当前图片地址数量-1,最大应有的图片下标,并且设置方向是向右运动
  201.     3、如果点击了右侧按钮,当前图片下标+1,如果大于当前图片地址数量-1,就让它为0
  202.     回到最开始第0张图片,并且设置方向是向右运动
  203.   */
  204.   function bnClickHander(e){
  205.     if(bool) return;
  206.     // 查找图片的src地址中是否包含
  207.     if(e.target.src.includes("left.png")){
  208.       pos--;
  209.       // imgSrcList.length-1图片数组的长度减一,也就是pos根据图片数组的长度来定值
  210.       if(pos<0) pos=imgSrcList.length-1;
  211.       direction=RIGHT;
  212.     }else{
  213.       pos++;
  214.       if(pos>imgSrcList.length-1) pos=0;
  215.       direction=LEFT;
  216.     }
  217.     createNextImg();
  218.   }
  219.   /*
  220.     小圆点点击事件函数
  221.     e 鼠标事件对象 MouseEvent
  222.     e.target 是鼠标点击的目标
  223.     因为使用是事件委托,因此判断点击目标是不是li,如果不是就跳出
  224.     如果bool是true,也就是当前轮播图正在播放时,点击按钮跳出,不继续执行
  225.     1、判断点击目标是否是li,不是跳出
  226.     2、获取当前点击的小圆点时数组中第几个
  227.     3、如果当前的点击小圆点的下标和当前展示图片的下标相同时,跳出不处理
  228.     4、如果大于当前展示图片的下标,方向设置为向左运动,反之向右
  229.     5、将当前点击的下标设为当前应展现图片的下标
  230.   */
  231.   function dotClickHandler(e){
  232.     if(bool) return;
  233.     // if(e.target.nodeName!="LI") return;
  234.     if(e.target.constructor!==HTMLLIElement) return;
  235.     var index=dotList.indexOf(e.target);
  236.     if(index===pos) return;
  237.     direction=index>pos ? LEFT : RIGHT;
  238.     pos=index;
  239.     createNextImg();
  240.   }
  241.   /*
  242.     创建下一张需要显示的图片
  243.     当点击左右按钮和当点击小圆点时,触发该函数
  244.     1、如果方向想左运动,给图片容器尾部添加新的图片
  245.     2、如果方向向有运动,给图片容器的最头部添加新图片
  246.     但是这个时候原图被挤到最后,然后将整个容器向左移动一个图片宽度
  247.     3、设置完成后,设置bool是true,这时候就打开了动画的播放开关
  248.     动画就可以完成播放了
  249.     4、切换当前小圆点
  250.   */
  251.   function createNextImg(){
  252.     // console.log(direction,pos,imgList[pos]);
  253.     if(direction===LEFT){
  254.       imgCon.appendChild(imgList[pos]);
  255.       x=0;
  256.     }else if(direction===RIGHT){
  257.       // insertBefore要插入的元素,插入在谁的前面
  258.       imgCon.insertBefore(imgList[pos],imgCon.firstElementChild);
  259.       imgCon.style.left=-WIDTH+"px";
  260.       x=-WIDTH;
  261.     }
  262.     bool=true;
  263.     changeDot();
  264.   }
  265.   /*
  266.     切换小圆点
  267.     preDot是对上一次小圆点的引用变量
  268.     刚开始第一次时,没有引用,因此不执行,并且设置第一次设置了第0个萧远山
  269.     更改了第0个小圆点的背景色
  270.     第二次进来上次小圆点的引用时第0个,所以就将上次的小圆点修改背景透明
  271.     将本次小圆点设置给这个引用,并且修改背景色
  272.     再次进入就可以修改原来的,设置新的
  273.   */
  274.   function changeDot(){
  275.     if(preDot){
  276.       preDot.style.backgroundColor="rgba(255,0,0,0)";
  277.     }
  278.     preDot=dotList[pos];
  279.     preDot.style.backgroundColor="rgba(255,0,0,0.5)";
  280.   }
  281.   /*
  282.     每16毫秒执行该函数一次
  283.     1、执行imgConMove这个函数,让图片移动的方法
  284.     2、执行自动轮播
  285.   */
  286.   function animation(){
  287.     imgConMove();
  288.     autoplay();
  289.   }
  290.   /*
  291.     每16毫秒让图片移动一次
  292.     开始的时候就一直运行,因为有一个bool值判断,如果false时,一直不能进入
  293.     如果可以进入
  294.     1、如果方向为左
  295.       不断让变量x递减,每16毫秒减40像素,设置图片容器位置,图片容器就可以移动了
  296.       当图片容器的第一张图完全移动到最左侧以后,也就是x小于等于负的图片宽度
  297.       设置bool值false,16毫秒后进入时直接跳出
  298.       删除掉移到最左侧的图片,后面的图片会补充到最前面,设置将x为0,让整个容器向后挪回初始位置
  299.     2、如果方向向右
  300.       x不断增加40像素
  301.       如果x大于0,表示左侧的图片已经移到中间位置,原图片移到了右侧
  302.       这个时候停止运动,bool设为false,x设为初始的0,删除右侧的图片
  303.   */
  304.   function imgConMove(){
  305.     if(!bool) return;
  306.     if(direction===LEFT){
  307.       x-=SPEED;
  308.       if(x<=-WIDTH){
  309.         imgCon.firstElementChild.remove();
  310.         x=0;
  311.         bool=false;
  312.       }
  313.       imgCon.style.left=x+"px";
  314.     }else if(direction===RIGHT){
  315.       x+=SPEED;
  316.       if(x>=0){
  317.         bool=false;
  318.         x=0;
  319.         imgCon.lastElementChild.remove();
  320.       }
  321.       imgCon.style.left=x+"px";
  322.     }
  323.   }
  324.   /*
  325.     自动轮播
  326.     1、如果自动轮播开关是fasle时,跳出
  327.     2、time不断减少
  328.     3、如果time大于0就不继续执行跳出
  329.     4、time等于0,设置time初始为300
  330.     5、创建一个点击事件对象
  331.     6、向右侧按钮抛发这个点击事件
  332.   */
  333.   function autoplay(){
  334.     if(!autoBool) return;
  335.     time--;
  336.     if(time>0) return;
  337.     time=300;
  338.     var evt=new MouseEvent("click");
  339.     bnList[1].dispatchEvent(evt);
  340.   }
  341. </script>
  342. </body>
  343. </html>
复制代码
效果展示




以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持中国红客联盟。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行