JS实现横向轮播图(中级版)


Posted in Javascript onJanuary 18, 2020

本文实例为大家分享了JS实现横向轮播图的具体代码,供大家参考,具体内容如下

描述:

轮播图,中级,横向buton或者底部数字控制轮播,可以实现自动轮播(注释了,使用的话将其注释消掉),解决了初级版本的点1再点5时多张图片滑动的问题,核心只有两张图在切换,加入了图片加载。

效果:

JS实现横向轮播图(中级版)

代码:

js文件:

/*
* 工厂模式
* */
 
var Method=(function () {
 return {
  loadImage:function (arr,callback) {
   var img=new Image();
   img.arr=arr;
   img.list=[];
   img.num=0;
   img.callback=callback;
//   如果DOM对象下的事件侦听没有被删除掉,将会常驻堆中
//   一旦触发了这个事件需要的条件,就会继续执行事件函数
   img.addEventListener("load",this.loadHandler);
   img.self=this;
   img.src=arr[img.num];
  },
 
  loadHandler:function (e) {
   this.list.push(this.cloneNode(false));
   this.num++;
   if(this.num>this.arr.length-1){
    this.removeEventListener("load",this.self.loadHandler);
    this.callback(this.list);
    return;
   }
   this.src=this.arr[this.num];
  },
 
  $c:function (type,parent,style) {
   var elem=document.createElement(type);
   if(parent) parent.appendChild(elem);
   for(var key in style){
    elem.style[key]=style[key];
   }
   return elem;
  }
 }
})();

html文件:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <script src="js/Method.js"></script>
</head>
<body>
 <script>
  var imgCon,ul,prevLi;
  var arr=["img/a.jpeg","img/b.jpeg","img/c.jpeg","img/d.jpeg","img/e.jpeg"];
  var position=0;
  var direction="";
  var carouselBool=false;
  var autoBool=false;
  var time=240;
  const WIDTH=1200;
  const HEIGHT=400;
  init();
  function init() {
   createCarousel();
   createLiAndImg();
   changeLi();
   setInterval(animation,16)
  }
 
  function createCarousel() {//创建默认的div模板 用于装图片
   var carousel=Method.$c("div",document.body,{
    width: WIDTH+"px",
    height: HEIGHT+"px",
    position: "relative",
    margin: "auto",
    overflow:"hidden"
   });
   carousel.addEventListener("mouseenter",mouseHandler);
   carousel.addEventListener("mouseleave",mouseHandler);
   imgCon=Method.$c("div",carousel,{//图片轮播 div
    width: WIDTH+"px",
    height: HEIGHT+"px",
    position:"absolute",
    left: 0,
    fontSize: 0
   });
   ul=Method.$c("ul",carousel,{//装5个按钮的ul
    position: "absolute",
    bottom: "20px",
    listStyle: "none",
    margin: "auto"
   });
   var leftBn=Method.$c("img",carousel,{//左 按钮
    position: "absolute",
    left: "20px",
    top:"170px"
   });
   leftBn.src="img/left.png";
   var rightBn=Method.$c("img",carousel,{//右 按钮
    position: "absolute",
    right: "20px",
    top:"170px"
   });
   rightBn.src="img/right.png";
   leftBn.addEventListener("click",clickHandler);
   rightBn.addEventListener("click",clickHandler)
 
  }
  function createLiAndImg() {
   for(var i=0;i<arr.length;i++){//arr 事先装好了 5个图片
    var li=Method.$c("li",ul,{//每个li的数据
     width: "20px",
     height: "20px",
     border:"1px solid red",
     borderRadius:"10px",
     float:"left",
     marginLeft:"8px"
    });
    li.num=i;
    li.addEventListener("click",liClickHandler);
   }
   ul.style.left=(WIDTH-ul.offsetWidth)/2+"px";
   var img=Method.$c("img",imgCon,{
    width: WIDTH+"px",
    height: HEIGHT+"px"
   });
   img.src=arr[position];
  }
 
  function mouseHandler(e) {
   e = e || window.event;
   if(e.type==="mouseenter"){//鼠标划上 自动暂停
    autoBool=false;
   }else if(e.type==="mouseleave"){//鼠标离开 自动开始
    autoBool=true;
   }
  }
 
  function clickHandler(e) {//左右button的键位判断 点击事件
   e = e || window.event;
   if(carouselBool) return;
   if(~this.src.indexOf("left")){
    position--;
    if(position<0) position=arr.length-1;
    direction="right";
   }else{
    position++;
    if(position>arr.length-1) position=0;
    direction="left";
   }
 
   createCarouselImg();
  }
 
  function liClickHandler(e) {
   e = e || window.event;
   if(carouselBool) return;
   if(this.num===position) return;
   if(this.num>position){
    direction="left";
   }else{
    direction="right";
   }
   position=this.num;
   createCarouselImg();
  }
  
  function createCarouselImg() {
   if(direction!=="left" && direction!=="right")return;
   var img=Method.$c("img",null,{
    width: WIDTH+"px",
    height: HEIGHT+"px"
   });
   img.src=arr[position];
   imgCon.style.width=WIDTH*2+"px";
   if(direction==="left"){
    imgCon.appendChild(img);
   }else if(direction==="right"){
    imgCon.insertBefore(img,imgCon.firstElementChild);
    imgCon.style.left=-WIDTH+"px";
   }
   changeLi();
   carouselBool=true;
  }
 
  function changeLi() {
   if(prevLi){
    prevLi.style.backgroundColor="rgba(255,0,0,0)";
   }
   prevLi=ul.children[position];
   prevLi.style.backgroundColor="rgba(255,0,0,0.5)";
  }
  
  function animation() {
   carouselMovie();
   carouselAuto();
  }
  
  function carouselMovie() {
   if(!carouselBool) return;
   if(direction==="left"){
    if(imgCon.offsetLeft<=-WIDTH){
     carouselBool=false;
     imgCon.firstElementChild.remove();
     imgCon.style.left="0px";
     return;
    }
    imgCon.style.left=imgCon.offsetLeft-40+"px";
    return;
   }
   if(imgCon.offsetLeft>=0){
    carouselBool=false;
    imgCon.lastElementChild.remove();
    return;
   }
   imgCon.style.left=imgCon.offsetLeft+30+"px";
  }
  /*
  * 自动轮播函数
  * 1、如果当前autoBool是false,就不进行自动轮播
  *  这个变量是鼠标进入轮播图时是false,离开时
  *  才会变化为false
  * 2、让time--,因为这个函数没16毫秒执行一次,如果
  * 每次进来就让time-1,然后判断time是否小于等于0,如果
  * 小于等于0,说明这个函数已经进入了240次,每次16毫米,
  * 合计就是4秒钟。这样可以控制让轮播图每4秒自动播放下张
  * 图片
  * 3、如果time小于等于0,就重新让time等于240,等待下次进入
  * 4、设置图片播放定位+1,如果大于了图片的数量,就让它为0
  * 5、设置轮播图方向是向左运动
  * 6、执行创建轮播图片,并且继续后面的任务
  *
  *
  *
  * */
  function carouselAuto() {
   if(!autoBool)return;
   time--;
   if(time>0)return;
   //当time减到0时,就不继续减了,进入下面
   time=240;
   position++;
   if(position>arr.length-1) position=0;
   direction="left";
   createCarouselImg();
  }
 </script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ComboBox 和 DateField 在IE下消失的解决方法
Aug 30 Javascript
jQuery对象的selector属性用法实例
Dec 27 Javascript
JavaScript实现的浮动层框架用法实例分析
Oct 10 Javascript
js+html5实现的自由落体运动效果代码
Jan 28 Javascript
ES6所改良的javascript“缺陷”问题
Aug 23 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
Sep 14 Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
Sep 23 Javascript
javascript常用的设计模式
Feb 09 Javascript
详解JS中的attribute属性
Apr 25 Javascript
vue.js 实现评价五角星组件的实例代码
Aug 13 Javascript
js通过canvas生成图片缩略图
Oct 02 Javascript
jquery实现拖拽添加元素功能
Dec 01 jQuery
vue.js+ElementUI实现进度条提示密码强度效果
Jan 18 #Javascript
JS数组方法concat()用法实例分析
Jan 18 #Javascript
JS实现纵向轮播图(初级版)
Jan 18 #Javascript
JS数组方法reverse()用法实例分析
Jan 18 #Javascript
JS实现横向轮播图(初级版)
Jun 24 #Javascript
JS数组方法shift()、unshift()用法实例分析
Jan 18 #Javascript
微信小程序开发中var that =this的用法详解
Jan 18 #Javascript
You might like
PHP中is_dir()函数使用指南
2015/05/08 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
2016/11/20 PHP
php实现连接access数据库并转txt写入的方法
2017/02/08 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
php如何比较两个浮点数是否相等详解
2019/02/12 PHP
用js实现的抽象CSS圆角效果!!
2007/05/03 Javascript
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
弹出最简单的模式化遮罩层的js代码
2013/12/04 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
javascript实现倒计时(精确到秒)
2015/06/26 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
jquery实现网站列表切换效果的2种方法
2016/08/12 Javascript
jQuery post数据至ashx实例详解
2016/11/18 Javascript
Angularjs修改密码的实例代码
2017/05/26 Javascript
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
2019/02/14 jQuery
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
2019/12/04 Python
Python验证码截取识别代码实例
2020/05/16 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
松下电器美国官方商店:Panasonic美国
2016/10/14 全球购物
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
学生自我鉴定
2013/12/18 职场文书
基层工作经历证明
2014/01/13 职场文书
心理健康课教学反思
2014/02/13 职场文书
大学奖学金获奖感言
2014/08/15 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
刑事上诉状(无罪)
2015/05/23 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书