记vue中自定义实现轮播图(不引用插件)

原文链接

所用方法和思想跟上面原文一样,就是增加了样式,以及记录如何修改里面的属性。

实现原理
图片滑动即margin-left或者left的改变(和图片滑动方向有关),
点击切换即点击相应按钮,跳转到相关图片(数值判断)

<template>
  <div id="lunbo">
    <div
      class="lunbo"
      :style="{
           transition:slide+'s',
           marginLeft:-screen*num +'px'
      }"
    >
      <img v-for="(item,index) in miaosha" :key="index" :src="item.icon" alt />
    </div>

    <div class="buttons">
      <div
        class="button"
        v-for="(item,index) in button"
        :key="index"
        :class="{active:buttonVis(index)
           }"
        @click="changeImg(index)"
      ></div>
      <!-- 此处将button的值传过去用于判断是否给button添加active的class属性值,从而改变按钮的颜色 -->
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      miaosha: [
        {
          num: 0,
          icon: require("../../assets/images/project/1.png")
        },
        {
          num: 1,
          icon: require("../../assets/images/project/1.png")
        },
        {
          num: 2,
          icon: require("../../assets/images/project/1.png")
        },

        {
          num: 3,
          icon: require("../../assets/images/project/1.png")
        }
      ],
      button: [0, 1, 2, 3],
      //切换图片的时间
      slide: 1,
      //图片的个数
      num: 0,
      //定时器的名称
      timer: null,
      //屏幕的尺寸
      screen: null,
      //定时器每张图停留的时间
      min: 3000
    };
  },
  methods: {
    //此处用于切换图片时按钮颜色的高亮
    buttonVis(index) {
      if (index == this.num) {
        return true;
      } else {
        return false;
      }
    },
    //点击按钮切换图片时,让num等于当前按钮的index值     num改变,图片也随之改变
    //此处让slide=0是为了点击瞬间切换,而不是倒退轮播图
    changeImg(index) {
      this.num = index;
      this.slide = 0;
    },
    //此方法主要用于判断图片轮播的距离
    get() {
      //获取屏幕的宽度,以实现随着页面的改变,图片滑动的距离改变
      this.screen = document.body.clientWidth * 0.4;

      if (this.num == 3) {
        this.slide = 0;
        //当滑动到第四章图片时,切换的时间为0s,这样不会出现轮播倒滑的效果
        this.num = 0;
      } else {
        this.slide = 1;
        this.num++;
        // console.log(this.num)
      }
    }
  },
  mounted() {
    this.timer = setInterval(this.get, this.min);
  },

  //关闭页面之前摧毁定时器
  beforeDestroy() {
    clearInterval(this.timer);
    // this.timer = null
  }
};
</script>
<style scoped>
/*最顶层的容器,宽度只能够显示一张图片*/
/* width设置轮播图的大小  */
#lunbo {
  width: 40%;
  overflow: hidden;
  text-align: center;
  position: relative;
  border-radius: 1rem;
  margin: 0 auto;
}

/*轮播图所在容器,宽度为父容器的四倍,这里设置了4张轮播图,轮播图滑动时,一个两秒的滑动特效*/
/* 有几张轮播图宽度设置多少倍 */
.lunbo {
  width: 400%;
  transition: 2s;
  background-color: #fff;
}

/* 图片的宽度=1除以轮播图的张数 */
.lunbo img {
  width: 25%;
}

.buttons {
  position: absolute;
  left: 50%;
  top: 90%;
  transform: translate(-50%, -50%);
  display: flex;
}
.button {
  display: inline-block;
  margin-left: 10px;
  width: 20px;
  height: 4px;
  border-radius: 2px;
  background-color: white;
}
.active {
  background-color: red;
}

</style>

比如你有几张轮播修改的点(六点)

  • </script>标签里面
    1、data中的miaosha数组里面加入你想插入图片的序号和相对地址
    2、data中的button: [0, 1, 2, 3]中设置相对应的数组,有几张图片从零到几写上去
    3、get()方法中
    this.screen = document.body.clientWidth * 0.4; 0.4替换成下面css中定义的的父盒子的width
    if (this.num == 3) 3替换成 轮播图片数 - 1

  • <style>标签里面
    1、父盒子width设置大小,和上面获取屏幕宽度对应

/*最顶层的容器,宽度只能够显示一张图片*/
/* width设置轮播图的大小,越大越大  */
#lunbo {
  width: 40%;
  overflow: hidden;
  text-align: center;
  position: relative;
  border-radius: 1rem;
  margin: 0 auto;
}

2、子盒子 width设置大小,有几张轮播图宽度设置多少倍

/*轮播图所在容器,宽度为父容器的四倍,这里设置了4张轮播图,轮播图滑动时,一个两秒的滑动特效*/
/* 有几张轮播图宽度设置多少倍 */
.lunbo {
  width: 400%;
  transition: 2s;
  background-color: #fff;
}

3、设置图片大小=1/轮播图的张数

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

推荐阅读更多精彩内容