vue实现无缝轮播效果(跑马灯)


Posted in Vue.js onMay 14, 2021

本文实例为大家分享了vue实现无缝轮播效果的具体代码,供大家参考,具体内容如下

1.首先创建两个vue组件Sweiper.vue和SweiperItem.vue;

2.将两个组件引入页面,Sweiper.vue中用v-model传参(v-model 其实是语法糖,默认属性value和默认事件input);
代码中我是通过v-model的selcted将值传给Sweiper(子组件),自动轮播时子组件再通过触发input事件将即将显示的值传回给父组件

3.核心是要让selected的值传到SweiperItem中,与SweiperItem中的name值相等判该显示哪张图片;

<template>
  <div>
    <Sweiper v-model="selected">
      <!--v-model是个语法糖,相当于value和input事件-->
      <Sweiper-item  name="item1">
        <div class="item">
          <img :src="getImg('01')" alt="">
        </div>
      </Sweiper-item>
      <Sweiper-item name="item2">
        <div class="item">
          <img :src="getImg('02')" alt="">
        </div>
      </Sweiper-item>
      <Sweiper-item name="item3">
        <div class="item">
          <img :src="getImg('03')" alt="">
        </div>
      </Sweiper-item>
    </Sweiper>
  </div>
</template>
这里的图片没有通过数组用v-for循环,方便大家看其结构形式
<script>
  import Sweiper from "../components/Sweiper.vue";
  import SweiperItem from "../components/SweiperItem.vue";
  export default {
    name: "mySweiper",
    components: {
      Sweiper,
      SweiperItem
    },
    data() {
      return {
        selected: "item1",//默认第一张
      }
    },
    methods:{
      getImg(url){
        return "img/"+url+".jpg"
      },

    },
    mounted(){
      /*setInterval(()=>{
       this.selected="item2"
  },3000)
  此时因为mounted只执行一次,所以还是不变,需要在Sweiper写一个watch监听
    }*/这一步注释是因为换到Sweiper组件中写了
  }
</script>
<style >
  .item{
    /*border: 1px solid black;*/
  }
  .item>img{
    width: 100%;
    /*height: 0.1rem;*/
  }
</style>

Sweiper.vue

<template>
  <div class="Sweiper">
    <slot></slot>
  </div>
</template>
<script>

  export default {
    name: "Sweiper",
    data() {
      return{
        current:''
      }
    },
    props:{
      value:{
        type:String,
        default:""
      },
    },
    mounted(){
      //自动轮播时查找name值用indexOf的方法遍历出当前轮播的下表
      this.names=this.$children.map(child=>{
       return child.name
      });
      this. showImg();
      this. paly()
    },
    methods:{
      showImg(){
        this.current=this.value||this.$children[0].name;
        //当前实例的直接子组件
        this.$children.map(vm=>{
          vm.selected=this.current
        })
      },

      paly(){
        //每次轮播把图片做调整
        this.timer=setInterval(()=>{
          //indexOf返回某个指定字符串首次出现的位置
          const index=this.names.indexOf(this.current);
          let newIndex=index+1;
          //严谨一点
          if (newIndex===this.names.length){
             newIndex=0;
          }
          this.$emit("input",this.names[newIndex])
        },3000)
      }
    },
    watch:{
      //监听value值,发生变化就改变selected
      value(){
        this. showImg()
      }
    },
    beforeDestroy() {
      //实列销毁前
      clearInterval(this.timer)
    }
  };
</script>
<style>
  .Sweiper{
    /*border: 1px solid black;*/
    width: 100%;
    height: 4rem;
    overflow: hidden;
    margin: 0 auto;
    position: relative;
  }
</style>

SweiperItem.vue

<template>
  <transition>
    <div class="Sweiper-item" v-show="isShow">
      <slot></slot>
    </div>
  </transition>
</template>
<script>
  export  default {
    name:"SweiperItem",
    data(){
      return{
        selected:""
      }
    },
    props:{
      name:{
        type:String,
        required:true
      },
    },
    mounted(){

    },
    computed:{
      isShow(){
        return this.selected===this.name;
      }
    }
  };

</script>
<style>
  .v-enter-active,.v-leave-active{
    transition: all 1s linear;
  }
  .v-leave-to{
    transform:translate(-100%);
  }
  .v-enter{
    transform: translate(100%);
  }
  .v-enter-active{
    position: absolute;
    top:0;
    left: 0;
  }
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
Vue实现简单购物车功能
Dec 13 Vue.js
vue中如何添加百度统计代码
Dec 19 Vue.js
vue 组件基础知识总结
Jan 26 Vue.js
Vue 实现可视化拖拽页面编辑器
Feb 01 Vue.js
Vue多选列表组件深入详解
Mar 02 Vue.js
Vue全家桶入门基础教程
May 14 Vue.js
详解Vue的options
May 15 Vue.js
vue2实现provide inject传递响应式
May 21 Vue.js
Vue提供的三种调试方式你知道吗
Jan 18 Vue.js
Vue的生命周期一起来看看
Feb 24 Vue.js
vue中div禁止点击事件的实现
Apr 02 Vue.js
vue如何在data中引入图片的正确路径
Jun 05 Vue.js
Vue接口封装的完整步骤记录
Vue全家桶入门基础教程
vue实现可拖拽的dialog弹框
vue如何批量引入组件、注册和使用详解
vue组件的路由高亮问题解决方法
Vue通过懒加载提升页面响应速度
Vue详细的入门笔记
You might like
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
什么是短波收听SWL
2021/03/01 无线电
PHP 身份证号验证函数
2009/05/07 PHP
php 编写安全的代码时容易犯的错误小结
2010/05/20 PHP
PHP strncasecmp字符串比较的小技巧
2011/01/04 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
基于php中使用excel的简单介绍
2013/08/02 PHP
PHP获取一个字符串中间一部分字符的方法
2014/08/19 PHP
php将html转成wml的WAP标记语言实例
2015/07/08 PHP
用js来解决ajax读取页面乱码
2010/11/28 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
用jQuery toggleClass 实现鼠标移上变色
2014/05/14 Javascript
js动态创建标签示例代码
2014/06/09 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
JS实现网站菜单拖拽移位效果的方法
2015/09/24 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
基于vue-video-player自定义播放器的方法
2018/03/21 Javascript
angularjs $http调用接口的方式详解
2018/08/13 Javascript
element-ui中Table表格省市区合并单元格的方法实现
2019/08/07 Javascript
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
[38:32]完美世界DOTA2联赛循环赛 Forest vs DM 第二场 11.06
2020/11/06 DOTA
python读取TXT每行,并存到LIST中的方法
2018/10/26 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
2019/06/25 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
python 贪心算法的实现
2020/09/18 Python
Paper Cape官网:美国婴儿和儿童服装品牌
2019/11/02 全球购物
公务员平时考核实施方案
2014/03/11 职场文书
会计人员岗位职责
2014/03/19 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
2015年校本培训工作总结
2015/07/24 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书