zoukankan      html  css  js  c++  java
  • Vue2 轮播图组件 slide组件

    Vue2原生始轮播图组件,支持宽度自适应、高度设置、轮播时间设置、左右箭头按钮控制,圆点按钮切换,以及箭头、圆点按钮是否显示。
    <v-carousel :slideData="slideData"  :height="450" :begin="0" :interval="3000" :dot="true" :arrow="true"></v-carousel>



    话不多说直接上源码
    轮播图应用页面 componentspublichome.vue
    <template>
      <div id="home">
        <v-carousel :slideData="slideData"  :height="450" :begin="0" :interval="3000" :dot="true" :arrow="true"></v-carousel>
      </div>
    </template>
    <script>
     
      import carousel from "./public/carousel";
    
    
      export default {
        name: 'home',
        data() {
          return {
            slideData:[
              {
                title:'这是一个Vue轮播图组件',
                src:require('../assets/pic1.jpg'),
                url:'/show/499'
              },
              {
                title:'这是一个Vue轮播图组件',
                src:require('../assets/pic2.jpg'),
                url:'/show/499'
    
              },
              {
                title:'这是一个Vue轮播图组件',
                src:require('../assets/pic3.jpg'),
                url:'/show/499'
              },
              {
                title:'这是一个Vue轮播图组件',
                src:require('../assets/pic4.jpg'),
                url:'/show/499'
              },
              {
                title:'这是一个Vue轮播图组件',
                src:require('../assets/pic5.jpg'),
                url:'/show/499'
              },
            ]
          }
        },
        components:{
          'v-carousel': carousel,
        },
        methods: {
         
        },
        mounted() {
        }
      }
    </script>
    <style scoped>
    </style>

    轮播图组件页面 srccomponentspubliccarousel.vue  

    <template>
      <div id="carousel">
        <div class="carousel" ref="carousel"  v-bind:style="{height:height+'px'}">
          <transition-group tag="ul" class="slide clearfix"  :name="transitionName" >
            <li v-for="(item,index) in slideData" :key="index" v-show="index==beginValue" v-bind:style="{height:height+'px'}" >
              <router-link :to="item.url">
                <img :src="item.src">
                <div class="title">{{item.title}}</div>
              </router-link>
            </li>
          </transition-group>
          <div class="up" @click="up" v-show="arrow"></div>
          <div class="next" @click="next" v-show="arrow"></div>
          <div class="slideDot" v-show="dot">
            <span v-for="(item,index) in slideData" :class="{active:index==beginValue}" @click="change(index)" :key="index"></span>
          </div>
        </div>
    
      </div>
    </template>
    
    <script>
      export default {
        name: "carousel",
        data(){
          return{
            setInterval:'',
            beginValue:0,
            transitionName:'slide'
          }
        },
        beforeDestroy() {
          // 组件销毁前,清除监听器
          clearInterval(this.setInterval);
        },
        methods:{
          change(key){
            if(key>(this.slideData.length-1)){
              key=0;
            }
            if(key<0){
              key=this.slideData.length-1;
            }
    
    
            this.beginValue=key;
          },
          autoPlay(){
            //console.log(this.$refs.carousel.getBoundingClientRect().width);
            this.transitionName='slide';
            this.beginValue++
            if(this.beginValue>=this.slideData.length){
              this.beginValue=0;
              return;
            }
          },
          play(){
            this.setInterval=setInterval(this.autoPlay,this.interval)
          },
          mouseOver(){ //鼠标进入
            //console.log('over')
            clearInterval(this.setInterval)
          },
          mouseOut(){ //鼠标离开
            //console.log('out')
            this.play()
          },
          up(){ //上一页
            --this.beginValue;
            this.transitionName='slideBack';
            this.change(this.beginValue);
    
          },
          next(){ //下一页
            ++this.beginValue;
            this.transitionName='slide';
            this.change(this.beginValue);
          }
    
        },
        mounted(){
          var box = this.$refs.carousel; //监听对象
          box.addEventListener('mouseover',()=>{
            this.mouseOver();
          })
          box.addEventListener('mouseout',()=>{
            this.mouseOut();
          })
          this.beginValue=this.begin;
          this.play();
    
        },
        props:{
          height:{
            type: Number,
            default: 600
          },
          dot:{
            type: Boolean,
            default: true
          },
          arrow:{
            type: Boolean,
            default: true
          },
          interval:{
            type: Number,
            default: 5000
          },
          begin:{
            type: Number,
            default: 0
          },
          slideData:{
            type: Array,
            default: function () {
              return [];
            }
    
          }
        }
      }
    </script>
    
    <style scoped>
    
      .slide{position: relative;margin: 0;padding: 0; overflow: hidden; 100%; height:450px;}
      .slide li{list-style: none;position: absolute; 100%; height:450px;}
      .slide li img{ 100%; height:450px;cursor:pointer}
      .slide li .title{position: absolute; left:0; bottom: 0; padding: 10px 20px;  100%; background: rgba(0,0,0,.35);color: #fff;font-size: larger; text-align: center}
    
      .slideDot{position: absolute;z-index: 999; bottom: 60px;right:15px; }
      .slideDot span{display: inline-block;  30px; height: 7px; background:rgba(255,255,255,.65); margin-left: 5px;}
      .slideDot span.active{background:rgba(255,255,255,1);}
      .up,.next{position: absolute; left:0; top: 50%; margin-top: -32px; cursor: pointer;  64px;height: 64px;
        background-repeat: no-repeat;
        background-position: 50% 50%;
      }
      .up{background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABSklEQVRoQ9Xa220CMRCF4XMqIB0kdJASSCfpIDWlAzqAElIC6SBUMNFIywsCtB7PjX336v/k3YexTBQ+IvIC4AvAN8mTJYWWRR5rROQdwAGAIk4kt5b3lgCu4rX7l+TbUwBuxJ8B7Ej+tAd4xys47ROKiE8DRMWnACLjwwHR8aGAjPgwQFZ8CCAz3h2QHe8KqIh3A1TFuwAq46cB1fFTgA7xZkCXeBOgU/wwoFv8EKBj/GpA1/gRgJ4e7JaZdWqGtcy9j9asGilFRM9sXpcX/QH4sA7hVQA9wzkC2HRDrNoBjV7+g3aI1YCuiCFAR8QwoBvCBOiEMAO6IKYAHRDTgGqEC6AS4QaoQrgCKhDugGxECCATEQbIQoQCMhDhgGhECiASkQaIQqQCIhDpgDuI57orcQNxJqmXPoafkh24VIqIXvD4BLC3HtP8A6pfGkB3vbyXAAAAAElFTkSuQmCC");}
      .next{left: auto;right:0;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABOElEQVRoQ9Xa0W0CQQyEYU9JqShQAXSSEgIdUAIlQAd04milezgdOiHZ4/GGN5C8/N/u060Olvy4+8nMngDuyaVC4whNLUPufjazn+XrEcAls15klgkY/y9HpACj2N3Hrn+vdk+KSAO6ERRAJ4IG6EJQAR0IOkCNKAEoEWUAFaIUoECUA6oREkAlQgaoQkgBFQg5gI1oATARbQAWohXAQLQDsogpABnENIAoYirADuILwGPvxmJGwK+ZHVbB/wfg7tv4K4A15u0gpjmBSPzQTAGIxk8ByMS3A7LxrQBGfBuAFd8CYMbLAex4KaAiXgaoipcAKuPLAdXxpQBFfBlAFV8CUMbTAep4KqAjngboiqcAOuPTgM27EmO9j8+we7cL0d9Tj5QbgDw+fQLLPc54Y+UF4BbdxczcH9Le8DFn39OvAAAAAElFTkSuQmCC");}
      .up:hover{background-color: rgba(0,0,0,.3)}
      .next:hover{background-color: rgba(0,0,0,.3)}
    
    
      /*进入过渡生效时的状态*/
      .slide-enter-active{
        transform:translateX(0);
        transition: all 1s ease;
      }
    
      /*进入开始状态*/
      .slide-enter{
        transform:translateX(-100%);
      }
    
      /*离开过渡生效时的状态*/
      .slide-leave-active{
        transform:translateX(100%);
        transition: all 1s ease;
      }
    
      /*离开过渡的开始状态*/
      .slide-leave{
        transform:translateX(0);
      }
    
      /*进入过渡生效时的状态*/
      .slideBack-enter-active{
        transform:translateX(0);
        transition: all 1s ease;
      }
    
      /*进入开始状态*/
      .slideBack-enter{
        transform:translateX(100%);
      }
    
      /*离开过渡生效时的状态*/
      .slideBack-leave-active{
        transform:translateX(-100%);
        transition: all 1s ease;
      }
    
      /*离开过渡的开始状态*/
      .slideBack-leave{
        transform:translateX(0);
      }
    
    </style>
    

      

  • 相关阅读:
    jQuery的标签选择器$('p')、类选择器$('.myClass')、id选择器$('#myId')
    jQuery Validate验证框架与 jQuery ajaxSubmit的联合使用
    23种设计模式(一) 单例模式
    java 常见的几种运行时异常RuntimeException
    Servlet 生命周期、工作原理
    throw与throws的区别
    Apache Shiro java安全框架
    web.xml 中<context-param>与<init-param>的区别与作用
    web.xml 中CharacterEncodingFilter类的学习
    web.xml中的contextConfigLocation在spring中的作用
  • 原文地址:https://www.cnblogs.com/gmajip/p/9113824.html
Copyright © 2011-2022 走看看