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单元格多列合并的实现
Nov 26 Vue.js
vue添加自定义右键菜单的完整实例
Dec 08 Vue.js
vue实现购物车的小练习
Dec 21 Vue.js
Vue 简单实现前端权限控制的示例
Dec 25 Vue.js
vue+element UI实现树形表格
Dec 29 Vue.js
vue 组件基础知识总结
Jan 26 Vue.js
Vue如何实现变量表达式选择器
Feb 18 Vue.js
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 Vue.js
vue中axios封装使用的完整教程
Mar 03 Vue.js
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 Vue.js
vue实现列表垂直无缝滚动
Apr 08 Vue.js
vue3.0 数字翻牌组件的使用方法详解
Apr 20 Vue.js
Vue接口封装的完整步骤记录
Vue全家桶入门基础教程
vue实现可拖拽的dialog弹框
vue如何批量引入组件、注册和使用详解
vue组件的路由高亮问题解决方法
Vue通过懒加载提升页面响应速度
Vue详细的入门笔记
You might like
关于php支持分块与断点续传文件下载功能代码
2014/05/09 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
php实现将上传word文件转为html的方法
2015/06/03 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
一个简单的js动画效果代码
2010/07/20 Javascript
通过Jquery遍历Json的两种数据结构的实现代码
2011/01/19 Javascript
JavaScript的递归之递归与循环示例介绍
2013/08/05 Javascript
Jquery插件easyUi表单验证提交(示例代码)
2013/12/30 Javascript
JavaScript onkeydown事件入门实例(键盘某个按键被按下)
2014/10/17 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
2016/08/01 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
javascript实现复选框全选或反选
2017/02/04 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
2017/09/02 Javascript
webpack HappyPack实战详解
2019/10/08 Javascript
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
Python的Django框架使用入门指引
2015/04/15 Python
Python实现SVN的目录周期性备份实例
2015/07/17 Python
Python字符串转换成浮点数函数分享
2015/07/24 Python
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
Python实现PS滤镜的旋转模糊功能示例
2018/01/20 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
2020/02/20 Python
parser.add_argument中的action使用
2020/04/20 Python
python多线程爬取西刺代理的示例代码
2021/01/30 Python
爱尔兰灯和灯具网上商店:Lights.ie
2018/03/26 全球购物
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
师范生的个人求职信范文
2014/01/04 职场文书
总经理任命书范本
2014/06/05 职场文书
社区党建工作方案
2014/06/10 职场文书
老人再婚离婚协议书范本
2014/10/27 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
市场营销计划书范文
2015/01/16 职场文书