背景
最近在學(xué)習(xí) ts,打算用 ts 寫一個練手項目,參照的網(wǎng)站內(nèi)容是 wanandroid,這個接觸過android開發(fā)的同學(xué)可能更i了解一些,其實一開始是打算后臺全部都自己寫的,不過奈何一個懶字,所以現(xiàn)在的打算就是自己實現(xiàn)登錄注冊簡單的邏輯。這些都不重要,一開始實現(xiàn)輪播是打算在 vue 中引入輪播圖 swiper.js,后來想想還是自己寫算了。也當(dāng)作熟悉 ts。先上效果圖(這里沒有動態(tài)圖片,各位同學(xué)可以自己實現(xiàn))
代碼已經(jīng)上傳 git,進度比較慢,如果可以各位大佬點個 star。 github.com/jiwenjie/vu…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
<!-- vue 實現(xiàn)輪播圖 --> <template> <div id= "swiperDIV" :style= "{height: height + 'px'}" @mouseover= "suspend" @mouseout= "autoPlay" @blur= "suspend" @focus= "autoPlay" > <!-- 淡入淡出效果 --> <transition-group tag= "ul" class= "img-list" :name= "animation" > <li v- for = "(item, index) in bannerList" :key= "item.id" v-show= "curIndex === index" > <img :src= "item[nameField]" > </li> </transition-group> <!-- 操作按鈕部分(底部導(dǎo)航器) --> <ul class= "option-list" v- if = "showPagination" > <li class= "option-list-item" :class= "curIndex === index ? 'cur-option-style':''" v- for = "(item, index) in bannerList" :key= "item.id" @click= "jump(item, index)" ></li> </ul> <!-- 左側(cè)右側(cè)切換按鈕 --> <template v- if = "showBtn" > <div class= "common-btn-space pre-btn-space" > <span class= "common-btn-span pre-btn-span" ></span> </div> <div class= "common-btn-space next-btn-space" > <span class= "common-btn-span next-btn-span" ></span> </div> </template> </div> </template> <!-- ts 文件拆分 --> <script lang= "ts" > // 兩種動畫背景 import { Component, Prop, } from 'vue-property-decorator' import swiper from './ts/swiper' @Component({ name: 'Swiper' , mixins: [swiper], }) export default class extends Vue {} </script> <!-- 樣式文件拆分 --> <style lang= "scss" scoped> @import url( "./css/swiper.scss" ); </style> |
ts文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
import { Component, Prop, Vue } from 'vue-property-decorator' import { Banner } from '@/beans/index' // 首頁banner圖 @Component({ name: 'Swiper' , components: {}, }) export default class IndexPage extends Vue { @Prop({ default : 6000 }) private timeout: number; // 默認(rèn)的切換banner圖的時長 @Prop({ default : 400 }) private height: number | string; // banner區(qū)域高度 @Prop({ default : () => [] }) private bannerList: Banner[]; // 傳入的圖片數(shù)組 @Prop({ default : 'imagePath' }) private nameField: string; // 圖片地址對應(yīng)的字段名 @Prop({ default : true }) private showPagination: boolean; // 是否顯示底部原點分頁器 @Prop({ default : false }) private showBtn: boolean; // 是否顯示左右的切換按鈕 @Prop({ default : 'fade' , validator: function (value) { let arr = [ 'fade' , 'translate' ] return arr.includes(value); } }) private animation: string; // 是否顯示左右的切換按鈕 private timer: any; private curIndex: number = 0; created(): void { this .autoPlay() } // lifecycle hook mounted(): void { } // method private handleSelect() { } // 自動播放圖片 private autoPlay() { clearInterval( this .timer) //還是一樣,開啟定時器之前需要先清除一下,防止bug this .timer = setInterval( this .nextClick, this .timeout as number) } // 切換下一個 banner 圖片 private nextClick() { this .curIndex++; if ( this .curIndex >= this .bannerList.length) { this .curIndex = 0; } } // 切換上一個圖片 private preClick() { this .curIndex++; if ( this .curIndex >= this .bannerList.length) { this .curIndex = 0; } } // 暫停的方法 private suspend() { clearInterval( this .timer) } // 點擊底部原點按鈕調(diào)整方法 private jump(bannerItem: Banner, index: number) { this .curIndex = index; } // private animationMethodValidator(): string { // } } |
css文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
#swiperDIV { position : relative ; display : block ; width : 100% ; } .img-list { width : 100% ; height : 100% ; position : relative ; margin : 0 ; padding : 0 ; z-index : 9 ; } .img-list li { position : absolute ; left : 0 ; width : 100% ; height : 100% ; } .img-list img { width : 100% ; height : 100% ; } .option-list { position : absolute ; left : 0 ; right : 0 ; bottom : 10px ; height : 30px ; line-height : 30px ; z-index : 99 ; text-align : center ; } .option- list-item { display : inline- block ; background-color : rgba( 255 , 255 , 255 , . 4 ); width : 10px ; height : 10px ; border-radius: 50% ; margin : 0 3px ; cursor : pointer ; } .cur-option-style { background-color : #fff ; } .common-btn-space { position : absolute ; top : 0 ; bottom : 0 ; z-index : 99 ; width : 22px ; } .pre-btn-space { left : 20px ; } .next-btn-space { right : 20px ; } .common-btn-span { display : inline- block ; width : 22px ; height : 22px ; background-color : transparent ; cursor : pointer ; position : absolute ; top : 0 ; bottom : 0 ; margin : auto ; border-top : 2px solid transparent ; border-right : 2px solid transparent ; border-bottom : 2px solid red ; border-left : 2px solid red ; } .pre-btn-span { transform: rotate( 45 deg); } .next-btn-span { transform: rotate( -135 deg); } /* 實現(xiàn)動畫的兩組類(淡入淡出) */ .fade-enter-active, .fade-leave-active { transition: opacity . 6 s; } .fade-enter, .fade-leave-to { opacity: 0 ; } /* (滾動) */ .translate-enter { transform: translateX( 100% ) } .translate-enter-to { transition: all . 6 s ease; transform: translateX( 0 ); } .translate-leave { transform: translateX( 0 ) } .translate-leave-active { transition: all . 6 s ease; transform: translateX( -100% ) } |
很多地方做了配置,包括底部的分頁器,左右兩側(cè)的按鈕。動畫目前只實現(xiàn)了兩種,一種是淡入淡出,一種是平滑滾動。
這里我把整個 vue 文件做了拆分。有多種原因,一個是我司做項目時整體就是這種拆分,不過我司用的就是正常的 vue 和 js。主要原因就是考慮到頁面復(fù)雜和邏輯交互很多的時候,一個 vue 文件可能超過萬行,所以做了拆分,這里我也延續(xù)了這種寫法,基本思想其實就是使用 mixins 引入 ts。還有一個原因是 ts 在 vue 文件中會有很多莫名其妙的報錯,明明代碼沒問題,但就是有錯誤警告。如果提到 ts 文件中就正常,這也是我拆分的一個原因。
其他的功能可以自己在加,如果有問題可以留言,有錯誤希望各位大佬指正。
以上就是Vue + ts實現(xiàn)輪播插件的示例的詳細(xì)內(nèi)容,更多關(guān)于Vue + ts 輪播插件的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!
原文鏈接:https://juejin.im/post/6893063930810204173?utm_source=tuicool&utm_medium=referral