vue 轮播图 原生js编写 ,直接复制代码即插即用

写了1天 我把它抽象成组件 ,下次要用的使用引用一下就好(代码在下面)

定时轮播

鼠标进入时候(用户操作)取消 定时轮播

鼠标按下 的x坐标 和 抬起的x坐标 不一样 就是在拖拽图片

不然就是单纯点击图片 进入对应页面

调用方

</template>

  <!--  数据 、 轮播图的 宽 和 高-->

  <swiper :imgList="imgList" style="width: 900px; height: 512px;"/>

</template>

<script>

    // 这三个是图片

    import lv_dou_gao_home from "@/assets/lv_dou_gao_home.jpg"

    import mk_44 from "@/assets/mk_44.jpg"

    import cxk_1 from "@/assets/cxk_1.jpg"

    export default {

        name: "xxx",

      data() {

        return {

          imgList: [

            {

              imgURI: lv_dou_gao_home,

              commodityId: 40

            },

            {

              imgURI: mk_44,

              commodityId: 16

            },

            {

              imgURI: cxk_1,

              commodityId: 35

            },

          ],

        }

      }

    }

</script>


轮播图 组件 代码

<template>

  <div class="swiperBox" ref="swiperBox"  @mouseup="mouseup" @mousemove="mousemove" @mouseenter="mouseenter"  @mouseleave="mouseleave">

    <div style="position: relative;">

      <!-- 左侧按钮 -->

      <div class="arrow-l" @click="indexSub()"><</div>

      <!-- 右侧按钮 -->

      <div class="arrow-r" @click="indexAdd()">></div>

      <!-- 核心的滚动区域 -->

      <ul class="imgList" ref="imgList">

        <li v-for="item in imgList">

          <img :src="item.imgURI" ref="img" @mousedown="mousedown($event, item.commodityId)" >

        </li>

        <li>

          <img :src="imgList[0].imgURI">

        </li>

      </ul>

      <!--下面的小圈圈-->

      <ul class="optionList">

        <li v-for="(item,index) in imgList">

          <div @click="indexOption=index" :class="{indexOption:show_indexOption==index}"></div>

        </li>

      </ul>

    </div>

  </div>

</template>

<script>

    export default {

        name: "swiper",

      props: ['imgList'],

      data(){

          return{

            flag_indexChange:true,

            indexOption:0,

            show_indexOption:0,

            flag_move:false,

            mousedown_clientX:0,

            img_commodityId:0,

          }

      },

      computed:{

        listLength(){

          return this.imgList.length;

        },

        imgWidth(){

          return this.$refs.swiperBox.offsetWidth;

        }

      },

      watch:{

        indexOption(val){

          this.show_indexOption = val;

          this.animate(val)

        }

      },

      mounted(){

        this.$refs.swiperBox.firstChild.style.width = this.imgWidth + "px";

        this.$refs.swiperBox.firstChild.style.height = this.$refs.swiperBox.offsetHeight + "px";

        this.$refs.imgList.style.width = (this.listLength +1) + "00%";

        var imgArray =  document.querySelectorAll('.imgList img');

        for (var i =0;i < (this.listLength +1);i++){

          imgArray[i].style.width = this.imgWidth + "px";

          imgArray[i].style.height = this.$refs.swiperBox.offsetHeight + "px";

        }

        this.set_swiperBox_timer();

      },

      methods:{

        set_swiperBox_timer(){

          clearInterval(this.$refs.swiperBox.timer);

          let tempThis = this;

          this.$refs.swiperBox.timer = setInterval(function() {

            tempThis.indexAdd();

          },2000);

        },

        animate(index, callback){

          let target = -index* this.imgWidth;

          let obj = this.$refs.imgList;

          let tempThis = this;

          // 先清除以前的定时器,只保留当前的一个定时器执行

          clearInterval(obj.timer);

          obj.timer = setInterval(function() {

            // 步长值写到定时器的里面

            // 把我们步长值改为整数 不要出现小数的问题

            var step = (target - obj.offsetLeft) / 10;

            step = step > 0 ? Math.ceil(step) : Math.floor(step);

            if (obj.offsetLeft == target) {

              // 停止动画 本质是停止定时器

              clearInterval(obj.timer);

              tempThis.flag_indexChange = true;

              callback && callback(tempThis); //如果又回调函数 就执行

            }

            // 把每次加1 这个步长值改为一个慢慢变小的值  步长公式:(目标值 - 现在的位置) / 10

            obj.style.left = obj.offsetLeft + step + 'px';

          }, 15);

        },

        indexAdd(){

          if (this.flag_indexChange){

            this.flag_indexChange = false;

            var temp_index = this.indexOption+1;

            if (temp_index != this.listLength){

              this.indexOption =temp_index;

            }else {

              //先 show_indexOption = 0    这样 小圈圈 才和图片同步刷新 (不信就注释看看)

              this.show_indexOption = 0;

              this.animate(temp_index, function (tempThis) {

                tempThis.$refs.imgList.style.left = '0px';

                tempThis.indexOption =0;

              });

            }

          }

        },

        indexSub(){

          if (this.flag_indexChange){

            this.flag_indexChange = false;

            if (this.indexOption != 0){

              this.indexOption =this.indexOption - 1;

            }else {

              //看下面的mousemove函数  拖拽图片 松开鼠标 不用this.$refs.imgList.style.left = -(this.listLength * this.imgWidth) + 'px';

              if (false == this.flag_move){

                this.$refs.imgList.style.left = -(this.listLength * this.imgWidth) + 'px';

              } else {

                this.flag_move = false;

              }

              this.indexOption =this.listLength - 1;

            }

          }

        },

        mousedown(event, commodityId){

          this.mousedown_clientX = event.clientX;

          this.img_commodityId = commodityId;

          event.preventDefault();

        },

        mouseup(event, commodityId){

          if (0 != this.mousedown_clientX){

            var difference =  this.mousedown_clientX - event.clientX ;

            this.mousedown_clientX = 0;

            //如果 差值为不为0  鼠标按下 的x坐标 和 抬起的x坐标 不一样

            //就是在拖拽图片

            if ( 0 != difference) {

              difference > 0 ?  this.indexAdd() : this.indexSub();

            }else {

              //打开该图片对应的商品页面

              this.click_img();

            }

          }

        },

        mouseleave(event){

          if (0 != this.mousedown_clientX){

            var difference =  this.mousedown_clientX - event.clientX ;

            this.mousedown_clientX = 0;

            difference > 0 ?  this.indexAdd() : this.indexSub();

          }

          this.set_swiperBox_timer();

        },

        mouseenter(){

          // 操作过程不要定时器 干扰

          clearInterval(this.$refs.swiperBox.timer);

        },

        mousemove(event){

          if (0 != this.mousedown_clientX){

            var difference =  this.mousedown_clientX - event.clientX ;

            console.log(difference)

            if (0 < difference || 0!=this.indexOption){

              this.$refs.imgList.style.left = -(this.indexOption * this.imgWidth + difference )+ 'px';

            } else {

              this.$refs.imgList.style.left = -(this.listLength * this.imgWidth  + difference)+ 'px';

              this.flag_move = true;

            }

          }

        },

        click_img(){

          const {href} = this.$router.resolve({

            name:'commodityPage',

            query:{

              commodityId:this.img_commodityId

            }

          });

          window.open(href,'_blank');

        }

      }

    }

</script>

<style scoped>

  .arrow-l, .arrow-r{

    cursor: pointer;

    display: none;

    position: absolute;

    top: 45%;

    width: 24px;

    height: 40px;

    background: rgba(0, 0, 0, .3);

    text-align: center;

    line-height: 40px;

    color: #fff;

    font-size: 18px;

    z-index: 2;

  }

  .arrow-r{

    right: 0px;

  }

  .swiperBox:hover .arrow-l, .swiperBox:hover .arrow-r{

    display: block;

  }

  .swiperBox{

    /*写在 swiperBox 的div 里面了,这样swiperBox 可以不relative*/

    /*position: relative;*/

    overflow: hidden;

    /*写在调用方了*/

    /*top: -520px;*/

    /*left: 23%;*/

    /*width: 900px;*/

    /*height: 512px;*/

  }

  .imgList img{

    cursor: pointer;

    /*写 mounted()里面了*/

    /*width: 900px;*/

    /*height: 512px;*/

  }

  .imgList{

    padding: 0px;

    position: absolute;

    /*width: 9900%;*/  /*写 mounted()里面了*/

    list-style: none;

  }

  .imgList li{

    float: left;

  }

  .optionList{

    position: absolute;

    bottom: 15px;

    left: 50px;

    list-style: none;

  }

  .optionList li{

    float: left;

    z-index: 2;

  }

  .optionList li div{

    cursor: pointer;

    border-radius: 20px;

    border: 2px solid rgba(255, 255, 255, 0.5);

    margin: 0px 7px;

    width: 15px;

    height: 15px;

    transition:background 0.5s;

    -moz-transition:background 0.5s; /* Firefox 4 */

    -webkit-transition:background 0.5s; /* Safari and Chrome */

    -o-transition:background 0.5s; /* Opera */

  }

  .indexOption{

    background: white;

  }

</style>

如果对于学习编程有很多疑惑,没有思路,不知道如何有效率的学习,可以添加我的前端交流学习群895757445,需要最新系统的学习教程也可以管我要。做了很多年开发,对于学习方式,如何提高自己的技术有一定的经验,术业有专攻,多跟有经验的人交流学习,对这个行业信息了解的多,职业发展的空间就越大

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

推荐阅读更多精彩内容