美文网首页web基础学习之路
第八周第五天笔记之es6+面向对象+jQuery版左右切换轮播图

第八周第五天笔记之es6+面向对象+jQuery版左右切换轮播图

作者: 果木山 | 来源:发表于2018-09-16 23:56 被阅读0次

    1 es6+面向对象+jQuery版左右切换轮播图实例

    • 思路:
      • es6中面向对象的创建,用class创建类
      • 全局属性放在构造函数中,作为实例的私有属性,方法放在原型上,作为公有方法调用
      • 创建一个公共属性init,作为所有逻辑思维的调用
      • 然后再创建多个公共属性函数,作为每个步骤的定义函数,调用的时候,用this调用;
      • 调用时,创建实例,实例调用init方法,也可以将其放在构造函数中调用;
    • 知识点:
      • 定时器回调函数中的this指向问题,回调函数中的this指向window,利用箭头函数保证函数中的this指向实例;
      • 事件中回调函数中的this指向问题,跟定时器相同,均为window,利用箭头函数保证this指向实例;
      • 焦点手动点击切换函数中的三种设置,点击事件中获取当前元素可以用ev.target获得;
      • 箭头函数在普通函数中设置为:var fn=()=>{},在对象中设置为:fn:()=>{};
    • 代码:
      • JS代码:
       //面向对象就是创建一个类,es6中创建类用class
       //全局属性放在构造函数中,作为实例的私有属性,方法放在原型上,作为公有方法调用
       class Carousel{
           //私有属性放在constructor上
           constructor(){
               this.oWrap=$(".wrap");
               this.boxBanner=this.oWrap.find(".boxbanner");
               this.aImg=null;
               this.oUl=this.oWrap.find("ul");
               this.aLi=null;
               this.aLeft=this.oWrap.find(".Left");
               this.aRight=this.oWrap.find(".Right");
               this.data=null;
               this.n=null;
               this.timer=null;
           }
           //公有方法直接创建函数
           init(){
               //所有逻辑思维的调用
               //1 获取数据
               this.getData();
               //2 绑定数据
               this.blind();
               //3 图片延迟加载
               setTimeout(()=>{
                   this.lazyImg();
               },1000);
               //4 图片自动轮播
               //定时器中的回调函数的this指向window,利用箭头函数将this改为实例
               clearInterval(this.timer);
               this.timer=setInterval(()=>{
                   this.autoMove();
               },2000);
               //5 焦点的自动轮播
               //6 鼠标移入停止,鼠标移出继续
               this.cursorMouse();
               //7 点击焦点手动切换
               this.handleLi3();
               //8 点击左右按钮手动切换
               this.leftrightMove();
           }
           //函数的定义阶段
           getData(){
               //第一种方法:可以新建一个变量,储存住实例this;
               //var _this=this;
               $.ajax({
                   type: "get",
                   url: "data/data2.txt?"+Math.random(),
                   async: false,
                   dataType: "json",
                   //success函数中的this指向ajax对象
                   /*success:function (val) {
                       _this.data=val;//使用变量获取实例this
                   }*/
                   //第二种方法:利用箭头函数可以拿到实例this
                   success:(val)=>{
                       //此时this为实例this
                       this.data=val;
                   }
               })
           }
           blind(){
               var str="";
               var strli="";
               $.each(this.data,function (index, item) {
                   str+=`<img src="" realImg="${item.imgSrc}" alt="">`;
                   strli+=index==0?`<li class="active"></li>`:`<li></li>`;
               });
               str+=`<img src="" realImg="${this.data[0].imgSrc}" alt="">`;
               this.boxBanner.html(str);
               this.oUl.html(strli);
               this.aImg=this.boxBanner.children("img");
               this.boxBanner.css("width",this.aImg.length*this.aImg[0].offsetWidth);
               this.aLi=this.oUl.children("li");
           }
           lazyImg(){
               this.aImg.each(function (index, item) {
                   var frgImg=new Image();
                   frgImg.src=$(item).attr("realImg");
                   frgImg.onload=function () {
                       item.src=this.src;
                       frgImg=null;
                   };
                   frgImg.onerror=function () {
                       alert("图片加载错误");
                   }
               });
           }
           autoMove(){
               if(this.n>=this.aImg.length-1){
                   this.boxBanner.css("left",0);
                   this.n=0;
               }
               this.n++;
               //this.n%=this.aImg.length;
               this.boxBanner.stop().animate({left:-this.n*750},1000);
               //n取值为1,2,3,4,1,2,3,4
               this.autoMoveli();
           }
           autoMoveli(){
               var i=this.n%(this.aImg.length-1);
               this.aLi.eq(i).addClass("active").siblings("li").removeClass("active");
           }
           cursorMouse(){
               this.oWrap.mouseover(()=>{
                   clearInterval(this.timer);
                   this.aLeft.show();
                   this.aRight.show();
               }).mouseout(()=>{
                   this.aLeft.hide();
                   this.aRight.hide();
                   clearInterval(this.timer);
                   this.timer=setInterval(()=>{
                       this.autoMove();
                   },2000);
               });
           }
           //焦点手动切换
           //第一种方法:创建变量,保存实例this,然后使用时直接使用变量;
           /*handleLi(){
               var _this=this;
               this.aLi.click(function () {
                   _this.n=$(this).index();
                   _this.boxBanner.stop().animate({left:-_this.n*750},1000);
                   _this.autoMoveli();
               });
           }*/
           //第二种方法:利用点击事件中ev.target能获取点击事件的元素,利用箭头函数保证this始终为实例
           /*handleLi2(){
               this.aLi.click((ev)=> {
                   //箭头函数中的this为实例
                   //点击事件中ev.target代表被点击元素,为原生元素
                   this.n=$(ev.target).index();
                   this.boxBanner.stop().animate({left:-this.n*750},1000);
                   this.autoMoveli();
               });
           }*/
           //第三种方法:利用实例each遍历aLi,然后获得索引值,利用箭头函数保证this始终指向实例;
           handleLi3(){
               this.aLi.each((index, item)=> {
                   //用箭头函数后,里面的this为实例
                   $(item).click(()=> {
                       this.n=index;
                       this.boxBanner.stop().animate({left:-this.n*750},1000);
                       this.autoMoveli();
                   })
               });
           }
           leftrightMove(){
               this.aRight.click(()=>{
                   this.autoMove();
               });
               this.aLeft.click(()=>{
                   if(this.n<=0){
                       this.n=this.aImg.length-1;
                       this.boxBanner.css("left",-this.n*750);
                   }
                   this.n--;
                   this.boxBanner.stop().animate({left:-this.n*750},1000);
                   this.autoMoveli();
               })
           }
       }
      
      • JS代码优化:
       class Carousel {
           //私有属性
           constructor(){
               this.oWrap=$(".wrap");
               this.oBox=$(".wrap .boxbanner");
               this.oUl=$(".wrap ul");
               this.oLeft=$(".wrap .Left");
               this.oRight=$(".wrap .Right");
               this.aImg=null;
               this.aLi=null;
               this.data=null;
               this.timer=null;
               this.imgWid=null;
               this.m=null;
               this.n=0;
               this.init();
           }
           //公共方法
           init(){
               this.getData();
           }
           //获取后台数据
           getData(){
               var _this=this;
               $.ajax({
                   url:"./ajax/data.txt",
                   type:"get",
                   dataType:"json",
                   success:function (val) {
                       _this.data=val;
                       _this.insertDom();
                       _this.autoMove();
                       _this. mouseEvent();
                   },
                   error:function (err) {
                       console.log(err);
                   }
               })
           }
           //插入dom中
           insertDom(){
               var imgFrg=document.createDocumentFragment();
               var liFrg=document.createDocumentFragment();
               $(this.data).each(function (index,item) {
                   var oImg=new Image();
                   var oLi=document.createElement("li");
                   oImg.setAttribute("realImg",item.imgSrc);
                   if(index===0){
                       $(oLi).addClass("active");
                   }
                   imgFrg.append(oImg);
                   liFrg.append(oLi);
               });
               var extImg=new Image();
               extImg.setAttribute("realImg",this.data[0].imgSrc);
               imgFrg.append(extImg);
               this.oBox.append(imgFrg);
               this.oUl.append(liFrg);
               imgFrg=null;
               liFrg=null;
               //获取img和li元素
               this.aImg=this.oBox.children("img");
               //img的个数
               this.m=this.aImg.length;
               //img的宽度
               this.imgWid=this.aImg[0].offsetWidth;
               this.aLi=this.oUl.children("li");
               //需要重新设置宽高
               this.oBox.css("width",this.imgWid*this.m);
               this.oUl.css("width",this.aLi[0].offsetWidth*this.m+parseFloat($(this.aLi[1]).css("marginLeft"))*(this.m-2));
               this.oUl.css("marginLeft",-this.oUl[0].offsetWidth/2);
               //图片懒加载
               setTimeout(this.showImgs.bind(this),300);
               //手动点击li
               this.handleLi();
           }
           //图片懒加载
           showImgs(){
               var _this=this;
               this.aImg.each(function () {
                   _this.lazyLoad(this);
               })
           }
           lazyLoad(ele){
               if(ele.loaded) return;
               var Img=new Image();
               Img.src=ele.getAttribute("realImg");
               Img.onload=function () {
                   ele.src=this.src;
                   ele.loaded=true;
                   Img=null;
               };
               Img.onerror=function () {
                   console.log("图片加载失败");
                   ele.loaded=true;
                   Img=null;
               }
           }
           //自动轮播
           autoMove(){
               clearInterval(this.timer);
               this.timer=setInterval(this.move.bind(this),3000);
           }
           move(){
               if(this.n===this.m-1){
                   this.n=0;
                   this.oBox.css("left",0);
               }
               this.n++;
               this.animaTo();
           }
           animaTo(){
               this.oBox.stop().animate({
                   left:-this.n*this.imgWid
               },1000);
               this.autoLi();
           }
           //li自动轮播
           autoLi(){
               var s=this.n%5;
               this.aLi.eq(s).addClass("active").siblings("li").removeClass("active");
           }
           //鼠标事件
           mouseEvent(){
               this.oWrap.mouseover(()=>{
                   clearInterval(this.timer);
                   this.oLeft.show();
                   this.oRight.show();
               }).mouseout(()=>{
                   this.autoMove();
                   this.oLeft.hide();
                   this.oRight.hide();
               });
               this.oLeft.click(()=>{
                   if(this.n===0){
                       this.n=this.m-1;
                       this.oBox.css("left",-this.n*this.imgWid);
                   }
                   this.n--;
                   this.animaTo();
               });
               this.oRight.click(this.move.bind(this));
           }
           //手动点击li达到跳转效果
           handleLi(){
               this.aLi.each((index,item)=>{
                   $(item).click((e)=>{
                       this.n=$(e.target).index();
                       this.animaTo();
                   })
               })
           }
       }
      
      • html代码:
       <!DOCTYPE html>
       <html lang="en">
       <head>
           <meta charset="UTF-8">
           <title>es6+面向对象+jQuery版左右切换轮播图</title>
           <style type="text/css">
               *{
                   margin: 0;
                   padding: 0;
                   list-style: none;
               }
               .wrap{
                   width: 750px;
                   height: 292px;
                   margin: 30px auto;
                   position: relative;
                   background: url("image1/7.png") center no-repeat lightslategray;
                   background-size: cover;
                   overflow: hidden;
               }
               .wrap .boxbanner{
                   position: absolute;
                   left: 0;
                   top: 0;
                   width: 3000px;
                   height: 292px;
               }
               .wrap .boxbanner img{
                   float: left;
                   width: 750px;
                   height: 292px;
                   vertical-align: middle;
                   border: 0;
               }
               .wrap ul{
                   position: absolute;
                   width: 140px;
                   left: 50%;
                   margin-left: -70px;
                   bottom: 10px;
               }
               .wrap ul li{
                   width: 20px;
                   height: 20px;
                   border-radius: 50%;
                   background-color: lightslategray;
                   float: left;
                   cursor: pointer;
               }
               .wrap ul li+li{
                   margin-left: 20px;
               }
               .wrap ul li.active{
                   background-color: orangered;
               }
               .wrap a{
                   position: absolute;
                   width: 43px;
                   height: 67px;
                   top:50%;
                   margin-top: -30px;
                   background-image: url("image1/6.png");
                   background-repeat: no-repeat;
                   opacity: 0.5;
                   filter: alpha(opacity=50);
                   display: none;
               }
               .wrap a.Left{
                   left: 10px;
                   background-position: 0 0;
               }
               .wrap a.Right{
                   right: 10px;
                   background-position: -63px 0;
               }
               .wrap a:hover{
                   opacity: 1;
                   filter: alpha(opacity=100);
               }
           </style>
       </head>
       <body>
       <div class="wrap">
           <div class="boxbanner">
               <!--<img src="image1/1.jpg" alt="">
               <img src="image1/2.jpg" alt="">
               <img src="image1/3.jpg" alt="">
               <img src="image1/4.jpg" alt="">-->
           </div>
           <ul>
               <!--<li class="active"></li>
               <li></li>
               <li></li>
               <li></li>-->
           </ul>
           <a href="javascript:void(0);" class="Left"></a>
           <a href="javascript:void(0);" class="Right"></a>
       </div>
       <script src="jquery.js"></script>
       <script src="banner2.js"></script>
       <script>
           new Carousel();
       </script>
       </body>
       </html>
      

    相关文章

      网友评论

        本文标题:第八周第五天笔记之es6+面向对象+jQuery版左右切换轮播图

        本文链接:https://www.haomeiwen.com/subject/sjgqnftx.html