美文网首页web基础学习之路
第九周第二天笔记之渐隐渐现轮播图实例es6版面向对象+原生JS

第九周第二天笔记之渐隐渐现轮播图实例es6版面向对象+原生JS

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

1 渐隐渐现轮播图实例之es6面向对象+原生JS

  • 思路:
    • 目的:使页面在特定时间间隔后,不断的改变图片,添加一个效果,使其达到渐隐渐现的显现;
    • 整体思想:将所有图片定位在一个位置,让其相互覆盖,通过改变层级来使指定的图片显示在最上面,添加一个效果,目的是将透明度从0改变到1的过程,慢慢变化;
  • 知识点:
    • 封装的animate()函数的调用执行,是针对window来执行的,向里面传入的实参中,可以是实例的一些数据
    • for循环中用var声明定义i,不会形成私有作用域,所以添加事件后,事件中的i是错的,但是可以用let来声明定义i,这样每循环一次就会形成私有作用域,保存住实时i,当添加事件后,里边i为实时i,相当于闭包思想;
    • 构造函数中的函数中添加事件后,事件中的this不再是实例,所以需要在事件外新建一个变量赋值实例,然后在事件中使用该变量;
  • 代码:
    • JS代码:
     //创建类
     class Fand{
         constructor(opt){
             opt=opt||{};
             //获取元素
             this.oWrap=opt.ele;
             this.duration=opt.duration || 1000;
             this.boxBanner=utils.getByClass("boxbanner",this.oWrap)[0];
             this.aImg=this.oWrap.getElementsByTagName("img");
             this.oUl=this.oWrap.getElementsByTagName("ul")[0];
             this.aLi=this.oWrap.getElementsByTagName("li");
             this.aLeft=utils.getByClass("Left")[0];
             this.aRight=utils.getByClass("Right")[0];
             this.data=null;
             this.n=null;
             this.timer=null;
             this.init();
         }
         init(){
             //获取数据
             this.getData1();
             //绑定数据
             this.bind();
             //图片懒加载,添加定时器,目的是像延迟加载
             setTimeout(this.showImg.bind(this),1000);
             //自动轮播
             this.timer=setInterval(this.autoMove.bind(this),3000);
         }
         //获取数据
         getData1(){
             var _this=this;
             var xml=new XMLHttpRequest();
             xml.open("GET","data/data5.txt?"+Math.random(),false);
             xml.onreadystatechange=function () {
                 if(xml.readyState==4 && /^2\d{2}$/.test(xml.status)){
                     _this.data=utils.jsonParse(xml.responseText);
                 }
             };
             xml.send();
         }
         //绑定数据
         bind(){
            var str="";
            var strli="";
            for(var i=0; i<this.data.length; i++){
                var cur=this.data[i];
                str+=`<img src="" realImg="${cur.imgSrc}" alt=""/>`;
                strli+=i==0?`<li class="active"></li>`:"<li></li>";
            }
            this.boxBanner.innerHTML=str;
            utils.css(this.aImg[0],{
                zIndex:1,
                opacity:1
            });
            this.oUl.innerHTML=strli;
            this.oUl.style.zIndex=1;
         }
         //图片懒加载
         showImg(){
             for(var i=0; i<this.aImg.length; i++){
                 this.lazyImg(this.aImg[i]);
             }
         }
         lazyImg(img){
             var frgImg=new Image();
             frgImg.src=img.getAttribute("realImg");
             frgImg.onload=function () {
                 img.src=this.src;
                 frgImg=null;
             };
             frgImg.onerror=function () {
                 img.style.backgroundColor="red";
                 frgImg=null;
             }
         }
         //自动轮播
         autoMove(){
             this.n++;
             this.n%=this.aImg.length;
             //n取值为1,2,3,0,1,2,3,0,1
             this.setBanner();
         }
         setBanner() {
             //哪张图片的索引等于this.n,就让哪张图片显示
             for (var i = 0; i < this.aImg.length; i++) {
                 if (i == this.n) {
                     this.aImg[i].style.zIndex = 1;
                     //运动效果
                     //animate函数是window调用,然后在实例中传入实参,实参中的this指向当前实例;
                     animate({
                         ele: this.aImg[i],
                         target: {opacity: 1},
                         duration: this.duration,
                         callback:function () {
                             //在封装animate函数时,设置回调函数中的this为元素
                             var siblings=utils.siblings(this);
                             for(var i=0; i<siblings.length; i++){
                                 utils.css(siblings[i],"opacity",0);
                             }
                         }
                     })
                 } else {
                     utils.css(this.aImg[i], "zIndex", 0);
                 }
             }
             //焦点跟随自动轮播
             this.bannerTip();
         }
         bannerTip(){
             for(var i=0; i<this.aLi.length; i++){
                 /*if(i==this.n){
                     this.aLi[i].className="active";
                 }else{
                     this.aLi[i].className="";
                 }*/
                 this.aLi[i].className=i==this.n?"active":null;
             }
         }
     }
     //升级版
     class Fina extends Fand{
         constructor(opt){
             super(opt);
             this.Event();
         }
         Event(){
             //鼠标移入停止,移出继续
             this.overOut();
             //焦点手动点击切换
             this.handlebtn();
             //左右按钮手动点击切换
             this.handLeftright();
         }
         overOut(){
             var _this=this;
             this.oWrap.onmouseover=function () {
                 clearInterval(_this.timer);
                 _this.aLeft.style.display=_this.aRight.style.display="block";
             };
             this.oWrap.onmouseout=function () {
                 _this.aLeft.style.display=_this.aRight.style.display="none";
                 _this.timer=setInterval(_this.autoMove.bind(_this),3000);
             }
         }
         handlebtn(){
             var _this=this;
             for(let i=0; i<this.aLi.length; i++){
                 this.aLi[i].onclick=function () {
                     //for循环中,用let设置,则每次循环均形成一个私有作用域,相当于闭包,保存住i值
                     _this.n=i;
                     _this.setBanner();
                 }
             }
         }
         handLeftright(){
             var _this=this;
             this.aRight.onclick=function () {
                 _this.autoMove();
             };
             this.aLeft.onclick=function () {
                 if(_this.n<=0){
                     _this.n=_this.aImg.length;
                 }
                 _this.n--;
                 _this.setBanner();
             }
         }
     }
    
    • HTML代码:
     <!DOCTYPE html>
     <html lang="en">
     <head>
         <meta charset="UTF-8">
         <title>渐隐渐现轮播图实例</title>
         <style>
             *{
                 margin: 0;
                 padding: 0;
                 list-style: none;
             }
             .wrap{
                 width: 750px;
                 height: 290px;
                 margin: 20px auto;
                 position: relative;
                 background: url("image/7.png") center no-repeat;
                 background-size: cover;
             }
             .wrap .boxbanner{
                 position: relative;
                 width: 750px;
                 height: 290px;
             }
             .wrap .boxbanner img{
                 position: absolute;
                 left: 0;
                 top: 0;
                 width: 100%;
                 height: 100%;
                 opacity: 0;
                 filter:alpha(opacity:0);
             }
             .wrap ul{
                 height: 20px;
                 position: absolute;
                 right: 40px;
                 bottom: 20px;
             }
             .wrap ul li{
                 float: left;
                 width: 20px;
                 height: 20px;
                 border-radius: 50%;
                 background-color: lightslategray;
                 margin-left: 20px;
             }
             .wrap ul li.active{
                 background-color: red;
             }
             .wrap a{
                 position: absolute;
                 width: 43px;
                 height: 67px;
                 top: 50%;
                 margin-top: -34px;
                 background: url("image/6.png") no-repeat lightslategray;
                 opacity: 0.8;
                 filter: alpha(opacity:80);
                 z-index: 1;
                 display: none;
             }
             .wrap a:hover{
                 opacity: 1;
                 filter: alpha(opacity:100);
             }
             .wrap a.Left{
                 left: 20px;
                 background-position: 0 0;
             }
             .wrap a.Right{
                 right: 20px;
                 background-position: -62px 0;
             }
         </style>
     </head>
     <body>
     <div class="wrap" id="wrap">
         <div class="boxbanner">
             <!--<img src="image/1.jpg" alt=""/>
             <img src="image/2.jpg" alt=""/>
             <img src="image/3.jpg" alt=""/>
             <img src="image/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="JS/utils.js"></script>
     <script src="JS/moveEffect.js"></script>
     <script src="JS/animatSuper.js"></script>
     <script src="JS/lunbo.js"></script>
     <script>
         var oWrap=document.getElementById("wrap");
         /*var f1=new Fand({
             ele:oWrap,
             duration:700
         });*/
         var f1=new Fina({
             ele:oWrap,
             duration:700
         });
     </script>
     </body>
     </html>
    

相关文章

网友评论

    本文标题:第九周第二天笔记之渐隐渐现轮播图实例es6版面向对象+原生JS

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