VUE開發(fā)一個(gè)圖片輪播的組件示例代碼
本人剛學(xué)習(xí)vue,用vue做了個(gè)圖片輪播,下面我來(lái)記錄一下,有需要了解VUE開發(fā)一個(gè)圖片輪播的組件的朋友可參考。希望此文章對(duì)各位有所幫助。
完成效果圖如下:
vue開發(fā)的思路主要是數(shù)據(jù)綁定,代碼如下:
<template> <div ref="root" style="user-select: none;-webkit-user-select: none;overflow: hidden"> <div class="sliderPanel" :class="{transitionAni:ani}" :style="{height:height,transform:translateX}"> <div v-for="item in itemList" class="verticalCenter picbox" :style="{left:item.x+'px'}"> <img :style="{width:width,top:top}" :src="item.url" style="min-height: 100%"> </div> </div> <div @click="clickLeft" class="arrowLeft verticalCenter horizaCenter"> <img src="./image/arrow.png" style="transform: rotate(180deg)"> </div> <div @click="clickRight" class="arrowRight verticalCenter horizaCenter"> <img src="./image/arrow.png"> </div> <div class="arrowBottom verticalCenter horizaCenter" > <img src="./image/arrow.png" style="transform: rotate(90deg) scale(0.7)"> </div> <div class="sliderBar horizaCenter"> <div v-for="(item,index) in imgArray" @click="clickSliderCircle(index)" class="circle" :class="{circleSelected:item.selected}"> </div> </div> </div> </template> <script> const SCREEN_WIDTH=document.body.clientWidth const SCREEN_HEIGHT=document.body.scrollHeight var left,center,right var selectIndex=0 var count=0 var second=3//slider 時(shí)間間隔 var timer=null var ani=null var debugScale=1.0//測(cè)試用可調(diào)整為小于1 var Direction={left:'left',right:'right'}; var autoDirection=Direction.right var canClick=true export default({ data:function(){ return{ width:'100%', height:SCREEN_HEIGHT+'px', top:0, ani:true, translateX:'scale('+debugScale+') translateX(0px)', imgArray:[ { x:0, title1:'現(xiàn)在,在您的實(shí)驗(yàn)室', tilte2:'也可以輕松完成無(wú)創(chuàng)DNA產(chǎn)前檢測(cè)', title3:'了解詳細(xì)流程', click_url:'http://www.berrygenomics.com/products/nextseq-cn500/cn500test/', url:'static/image/1.jpg', selected:false, }, { x:0, title1:'Sequel開啟新基因組時(shí)代', tilte2:'覆蓋十余種胎兒染色體疾病,體驗(yàn)升級(jí),呵護(hù)加倍', title3:'了解更多', click_url:'http://www.berrygenomics.com/products/nextseq-cn500/cn500test/', url:'static/image/2.jpg', }, { x:0, title1:'BRCA1/2全外顯子基因突變檢測(cè)', tilte2:'也可以輕松完成無(wú)創(chuàng)DNA產(chǎn)前檢測(cè)', title3:'了解詳細(xì)流程', click_url:'http://www.berrygenomics.com/products/nextseq-cn500/cn500test/', url:'static/image/3.jpg', }, { x:0, title1:'現(xiàn)在,在您的實(shí)驗(yàn)室', tilte2:'也可以輕松完成無(wú)創(chuàng)DNA產(chǎn)前檢測(cè)', title3:'了解詳細(xì)流程', click_url:'http://www.berrygenomics.com/products/nextseq-cn500/cn500test/', url:'static/image/4.jpg', }, { x:0, title1:'現(xiàn)在,在您的實(shí)驗(yàn)室', tilte2:'也可以輕松完成無(wú)創(chuàng)DNA產(chǎn)前檢測(cè)', title3:'了解詳細(xì)流程', click_url:'http://www.berrygenomics.com/products/nextseq-cn500/cn500test/', url:'static/image/5.jpg', }, { x:0, title1:'現(xiàn)在,在您的實(shí)驗(yàn)室', tilte2:'也可以輕松完成無(wú)創(chuàng)DNA產(chǎn)前檢測(cè)', title3:'了解詳細(xì)流程', click_url:'http://www.berrygenomics.com/products/nextseq-cn500/cn500test/', url:'static/image/6.jpg', }, { x:0, title1:'現(xiàn)在,在您的實(shí)驗(yàn)室', tilte2:'也可以輕松完成無(wú)創(chuàng)DNA產(chǎn)前檢測(cè)', title3:'了解詳細(xì)流程', click_url:'http://www.berrygenomics.com/products/nextseq-cn500/cn500test/', url:'static/image/7.jpg', }, { x:0, title1:'現(xiàn)在,在您的實(shí)驗(yàn)室', tilte2:'也可以輕松完成無(wú)創(chuàng)DNA產(chǎn)前檢測(cè)', title3:'了解詳細(xì)流程', click_url:'http://www.berrygenomics.com/products/nextseq-cn500/cn500test/', url:'static/image/8.jpg', } ], itemList:[] } }, mounted:function(){ ani=this.$refs.root.querySelector('.sliderPanel') count=this.imgArray.length this.setIndex(selectIndex) //自動(dòng)滾動(dòng)切換圖片 this.slideAuto(second) }, methods:{ clickLeft:function(){ if(!canClick) return false autoDirection=Direction.left this.slideAuto(second) this.moveLeftAni() canClick=false }, clickRight:function(){ if(!canClick) return false autoDirection=Direction.right this.slideAuto(second) this.moveRightAni() canClick=false }, slideRight:function () { selectIndex++ if(selectIndex+1>count){ selectIndex=0 }else if(selectIndex<0){ selectIndex=count-1 } this.setIndex(selectIndex) }, slideLeft:function () { selectIndex-- if(selectIndex+1>count){ selectIndex=0 }else if(selectIndex<0){ selectIndex=count-1 } this.setIndex(selectIndex) }, clickSliderCircle:function (index) { this.slideAuto(second) this.setIndexPre(index) }, setIndexPre:function (index) { if(!canClick) return false canClick=false if(index==selectIndex)return var leftIndex=index var centerIndex=selectIndex var rightIndex=index for(var i=0;i<count;i++){ if(i==selectIndex){ this.imgArray[i].selected=true }else{ this.imgArray[i].selected=false } } left=this.imgArray[leftIndex] center=this.imgArray[centerIndex] right=this.imgArray[rightIndex] left=JSON.parse(JSON.stringify(left)) right=JSON.parse(JSON.stringify(right)) left.x=-SCREEN_WIDTH center.x=0 right.x=SCREEN_WIDTH left.index=leftIndex center.index=centerIndex right.index=rightIndex this.itemList=[left,center,right] if(index>selectIndex){ autoDirection=Direction.right; +function(obj){ obj.anicompted( 'scale('+debugScale+') translateX('+0+'px)', 'scale('+debugScale+') translateX('+-SCREEN_WIDTH+'px)', function(){ obj.setIndex(index) }) }(this) //右移 }else if(index<selectIndex){ //左移 autoDirection=Direction.left; +function(obj){ obj.anicompted( 'scale('+debugScale+') translateX('+0+'px)', 'scale('+debugScale+') translateX('+SCREEN_WIDTH+'px)', function(){ obj.setIndex(index) }) }(this) } }, setIndex:function (index) { var leftIndex=index-1 var centerIndex=index var rightIndex=index+1 if(index<=0){ index=0 leftIndex=count-1 centerIndex=index rightIndex=index+1 }else if(index>=count-1){ index=count-1 leftIndex=index-1 centerIndex=index rightIndex=0 } selectIndex=index for(var i=0;i<count;i++){ if(i==selectIndex){ this.imgArray[i].selected=true }else{ this.imgArray[i].selected=false } } left=this.imgArray[leftIndex] center=this.imgArray[centerIndex] right=this.imgArray[rightIndex] left.x=-SCREEN_WIDTH center.x=0 right.x=SCREEN_WIDTH left.index=leftIndex center.index=centerIndex right.index=rightIndex this.itemList=[left,center,right] }, slideAuto:function () { clearInterval(timer); +function (obj) { timer=setInterval(function () { if(autoDirection==Direction.left){ obj.moveLeftAni() }else{ obj.moveRightAni() } },second*1000) }(this) }, moveLeftAni:function(){ +function(obj){ obj.anicompted( 'scale('+debugScale+') translateX('+0+'px)', 'scale('+debugScale+') translateX('+SCREEN_WIDTH+'px)', function(){ obj.slideLeft() }) }(this) }, moveRightAni:function(){ +function(obj){ obj.anicompted( 'scale('+debugScale+') translateX('+0+'px)', 'scale('+debugScale+') translateX('+-SCREEN_WIDTH+'px)', function(){ obj.slideRight() }) }(this) }, anicompted:function(fromStr,toStr,callBack){ var handler=null,obj=this handler=function(){ ani.removeEventListener('webkitTransitionEnd',handler,false) callBack() obj.ani=false obj.translateX=fromStr canClick=true } ani.removeEventListener('webkitTransitionEnd',handler,false) ani.addEventListener('webkitTransitionEnd',handler,false) this.ani=true this.translateX=toStr } } }) </script> <style scoped> .transitionAni{ transition: all 0.8s cubic-bezier(.23,1,.32,1); /*transition: transform 1s;*/ } .arrowLeft{ transition: all 0.4s ease; width: 60px; height: 60px; position: absolute; left: 15px; top: 50%; margin-top: -30px; background: rgba(0,0,0,0.6); border-radius: 6px; } .arrowLeft:hover{ background: rgba(0,0,0,0.8); transform: scale(1.1); } .arrowRight{ transition: all 0.4s ease; width: 60px; height: 60px; position: absolute; right: 15px; top: 50%; margin-top: -30px; background: rgba(0,0,0,0.6); border-radius: 6px; } .arrowRight:hover{ background: rgba(0,0,0,0.8); transform: scale(1.1); } .sliderBar{ width:100%;height: auto;position: absolute;bottom: 50px; } .circle{ width: 15px; height: 15px; background: rgba(0,0,0,0.7); border-radius: 50%; display: table-cell; margin-right: 3px; transition: all 0.5s ease; } .circle:hover{ background: #C7015C; transform: scale(1.15); } .circleSelected{ background: #C7015C; transform: scale(1.15); } .arrowBottom{ width: 80px; height: 50px; position: absolute; bottom: -15px; left: 50%; margin-left: -40px; background: #C7015C; border-top-left-radius: 10px; border-top-right-radius: 10px; transition: all 0.5s ease-out; } .arrowBottom:hover{ transform: translateY(-10px); background: deeppink; } .picbox{ width: 100%; height: 100%; position: absolute; top: 0; overflow: hidden; /*transform: scale(0.9);*/ /*opacity: 0.2;*/ transition: all 0.45s ease; } /*@keyframes arrowOut-animation {*/ /*from{*/ /*transform: translateY(0px);*/ /*}*/ /*to{*/ /*transform: translateY(15px);*/ /*!*width:200px;*!*/ /*}*/ /*}*/ /*@keyframes arrowIn-animation {*/ /*from{*/ /*transform: translateY(15px);*/ /*}*/ /*to{*/ /*transform: translateY(0px);*/ /*!*height: 200px;*!*/ /*}*/ /*}*/ /*.arrowOut{*/ /*animation: arrowOut-animation;*/ /*animation-duration: 0.5s;*/ /*animation-timing-function: ease-out;*/ /*animation-fill-mode:forwards;*/ /*}*/ /*.arrowIn{*/ /*animation: arrowIn-animation;*/ /*animation-duration: 0.5s;*/ /*animation-timing-function:ease-out;*/ /*animation-fill-mode:forwards;*/ /*}*/ </style>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- vue實(shí)現(xiàn)自動(dòng)滑動(dòng)輪播圖片
- Vue實(shí)現(xiàn)圖片輪播組件思路及實(shí)例解析
- vue不操作dom實(shí)現(xiàn)圖片輪播的示例代碼
- vue自定義js圖片碎片輪播圖切換效果的實(shí)現(xiàn)代碼
- 使用Vue制作圖片輪播組件思路詳解
- Vue封裝Swiper實(shí)現(xiàn)圖片輪播效果
- 利用Vue實(shí)現(xiàn)移動(dòng)端圖片輪播組件的方法實(shí)例
- 利用vueJs實(shí)現(xiàn)圖片輪播實(shí)例代碼
- 基于vue.js實(shí)現(xiàn)圖片輪播效果
- vue實(shí)現(xiàn)輪播圖片
相關(guān)文章
Vue echarts封裝組件需求分析與實(shí)現(xiàn)
在平常的項(xiàng)目中,echarts圖表我們也是使用的非常多的,通常我們從后端拿到數(shù)據(jù),需要在圖表上動(dòng)態(tài)的進(jìn)行呈現(xiàn),接下來(lái)我們就模擬從后端獲取數(shù)據(jù)然后進(jìn)行呈現(xiàn)的方法,這篇文章主要介紹了Vue echarts封裝組件需求分析與實(shí)現(xiàn)2022-10-10vue-cli3使用postcss-plugin-px2rem方式
這篇文章主要介紹了vue-cli3使用postcss-plugin-px2rem方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07vue 設(shè)置 input 為不可以編輯的實(shí)現(xiàn)方法
今天小編就為大家分享一篇vue 設(shè)置 input 為不可以編輯的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09element-vue實(shí)現(xiàn)網(wǎng)頁(yè)鎖屏功能(示例代碼)
這篇文章主要介紹了element-vue實(shí)現(xiàn)網(wǎng)頁(yè)鎖屏功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11關(guān)于Vue?"__ob__:Observer"屬性的解決方案詳析
在操作數(shù)據(jù)的時(shí)候發(fā)現(xiàn),__ob__: Observer這個(gè)屬性出現(xiàn)之后,如果單獨(dú)拿數(shù)據(jù)的值,就會(huì)返回undefined,下面這篇文章主要給大家介紹了關(guān)于Vue?"__ob__:Observer"屬性的解決方案,需要的朋友可以參考下2022-11-11Vue項(xiàng)目代碼之路由拆分、Vuex模塊拆分、element按需加載詳解
這篇文章主要介紹了Vue項(xiàng)目代碼之路由拆分、Vuex模塊拆分、element按需加載,項(xiàng)目較大路由較多時(shí),路由拆分是一個(gè)不錯(cuò)的代碼優(yōu)化方案,按不同業(yè)務(wù)分為多個(gè)模塊,結(jié)構(gòu)清晰便于統(tǒng)一管理,本文通過(guò)示例給大家詳細(xì)講解,需要的朋友可以參考下2022-11-11VUE element-ui 寫個(gè)復(fù)用Table組件的示例代碼
本篇文章主要介紹了VUE element-ui 寫個(gè)復(fù)用Table組件的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11vue使用數(shù)組splice方法失效,且總刪除最后一項(xiàng)的問(wèn)題及解決
這篇文章主要介紹了vue使用數(shù)組splice方法失效,且總刪除最后一項(xiàng)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09