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 相关文章推荐
快速解决vue2+vue-cli3项目ie兼容的问题
Nov 17 Vue.js
如何使用 vue-cli 创建模板项目
Nov 19 Vue.js
Vue用mixin合并重复代码的实现
Nov 27 Vue.js
vue3.0实现插件封装
Dec 14 Vue.js
8个非常实用的Vue自定义指令
Dec 15 Vue.js
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
Jan 05 Vue.js
vue3.0中使用element的完整步骤
Mar 04 Vue.js
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
Apr 17 Vue.js
详解Vue的sync修饰符
May 15 Vue.js
vue实现同时设置多个倒计时
May 20 Vue.js
vue实现锚点定位功能
Jun 29 Vue.js
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
Apr 11 Vue.js
Vue接口封装的完整步骤记录
Vue全家桶入门基础教程
vue实现可拖拽的dialog弹框
vue如何批量引入组件、注册和使用详解
vue组件的路由高亮问题解决方法
Vue通过懒加载提升页面响应速度
Vue详细的入门笔记
You might like
PHP多例模式介绍
2013/06/24 PHP
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
jquery 框架使用教程 AJAX篇
2009/10/11 Javascript
js获取元素在浏览器中的绝对位置
2010/07/24 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
JavaScript获取表单enctype属性的方法
2015/04/02 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
node.js的事件机制
2017/02/08 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
Python中的Classes和Metaclasses详解
2015/04/02 Python
Python中使用PDB库调试程序
2015/04/05 Python
用Python实现换行符转换的脚本的教程
2015/04/16 Python
快速排序的算法思想及Python版快速排序的实现示例
2016/07/02 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
Python实现的十进制小数与二进制小数相互转换功能
2017/10/12 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
应聘教师推荐信
2013/10/31 职场文书
元旦晚会邀请函
2014/02/01 职场文书
教师求职信
2014/06/17 职场文书
股指期货心得体会
2014/09/13 职场文书
四风自我剖析材料思想汇报
2014/10/01 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
2015年话务员工作总结
2015/04/29 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
酒店温馨提示语
2015/07/14 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书
Python中使用ipython的详细教程
2021/06/22 Python
Promise静态四兄弟实现示例详解
2022/07/07 Javascript