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

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>
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容