本身寫了一個vue輪播圖插件,本身感受還能夠,但不怎麼熟悉vue但願大神們能指出錯誤或很差的地方。css
效果:
vue
<template> <div class="vuecarousel"> <div class="contain" @mouseenter="stop" @mouseleave="start" :style="{width: imgWidth + 'px', height: imgHeight + 'px'}" //顯示區域(圖片)大小 > <ul class="ul"> <li class="items" v-for="(img, index) in imgs" :key="index" v-show="index == showIndex" > <img :src="img.src" alt="輪播圖"> </li> </ul> <ul class="dots" :style="{width: imgs.length * (dotWidth + 10) + 'px', height: dotWidth + 'px'}" //顯示小圓點容器大小 > <li v-for="(img, index) in imgs" :key="index" :class="index == showIndex ? 'active' : ''" @click="showIndex = index" :style="{width: dotWidth + 'px', height: dotWidth + 'px'}" //顯示小圓點大小 > </li> </ul> <div class="control" v-show="show"> <span class="left" @click="previous"><</span> <span class="right" @click="next">></span> </div> </div> </div> </template> <script> export default { name: 'VueCarousel', created () { this.timer = setInterval(() => { this.next(); }, this.delay) }, beforeDestroy () { clearInterval(this.timer); }, props: { imgs:{ type: Array, required: true }, delay:{ type: Number, default: function(){ return 2000; } }, imgWidth:{ default: function(){ return 400; } }, imgHeight:{ default: function(){ return 302; } }, dotWidth:{ default: function(){ return 20; } } }, data(){ return { showIndex: 0, //顯示第幾個圖片 timer: null, // 定時器 show: false // 先後按鈕顯示 } }, methods: { previous(){ if(this.showIndex <= 0){ this.showIndex = this.imgs.length - 1; }else{ this.showIndex --; } }, next () { if(this.showIndex >= this.imgs.length - 1){ this.showIndex = 0; }else{ this.showIndex ++; } }, start(){ this.show = false; clearInterval(this.timer); this.timer = setInterval(() => { this.next(); }, this.delay) }, stop () { this.show = true; clearInterval(this.timer); } } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped lang="scss" scoped> .contain { position: relative; top: 50%; left: 50%; transition: all .8s; transform: translateX(-50%); color: #fff; overflow: hidden; cursor: pointer; .ul { height: 100%; list-style: none; .items { position: absolute; top: 0px; width: 100%; height: 100%; img { width: 100%; height: 100%; } } } .dots { position: absolute; left: 50%; bottom: 30px; height: 10px; transform: translateX(-50%); li { float: left; width: 10px; height: 10px; margin: 0px 5px; border-radius: 50%; transition: all .3s; background-color: antiquewhite; list-style: none; } .active { background-color: blue; } } .control { .left { position: absolute; top: 50%; left: 10px; padding: 5px; transform: translateY(-50%); font-size: 20px; cursor: pointer; &:hover { background-color: rgba($color: #000000, $alpha: 0.3); } } .right { position: absolute; top: 50%; right: 10px; padding: 5px; transform: translateY(-50%); font-size: 20px; cursor: pointer; &:hover { background-color: rgba($color: #000000, $alpha: 0.3); } } } } </style>
調用:app
<template> <div id="app"> <VueCarousel :imgs="imgs" //圖片 :delay="2000" //延時 :imgWidth="400" //圖片寬度 :imgHeight="302" //圖片高度 :dotWidth="20" //下方小圓點大小 /> </div> </template> <script> import VueCarousel from './components/VueCarousel.vue' export default { name: 'app', components: { VueCarousel }, data () { return { imgs:[ {src: require('@/static/images/1.png')}, {src: require('@/static/images/2.png')}, {src: require('@/static/images/3.png')}, {src: require('@/static/images/4.png')}, {src: require('@/static/images/5.png')} ] } } } </script>