激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語言 - JavaScript - Vue + ts實現(xiàn)輪播插件的示例

Vue + ts實現(xiàn)輪播插件的示例

2021-11-12 16:57jiwenjie JavaScript

這篇文章主要介紹了Vue + ts實現(xiàn)輪播插件的示例,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下

背景

最近在學(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…

Vue + ts實現(xiàn)輪播插件的示例

?
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,
  Vue
 } 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(45deg);
}
 
.next-btn-span {
 transform: rotate(-135deg);
}
 
/* 實現(xiàn)動畫的兩組類(淡入淡出) */
.fade-enter-active,
.fade-leave-active {
 transition: opacity .6s;
}
 
.fade-enter,
.fade-leave-to {
 opacity: 0;
}
 
/* (滾動) */
.translate-enter {
 transform: translateX(100%)
}
 
.translate-enter-to {
 transition: all .6s ease;
 transform: translateX(0);
}
 
.translate-leave {
 transform: translateX(0)
}
 
.translate-leave-active {
 transition: all .6s 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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲午夜在线 | 欧美成人精品一区 | 色妹子久久 | 噜噜噜在线| 在线视频欧美一区 | 天天黄色片 | 91久久国产露脸精品免费 | 中文字幕偷拍 | www.国产免费 | 999久久久免费视频 久久精品国产精品亚洲 | av在线大全 | 国产亚洲精品视频中文字幕 | 国产精品午夜未成人免费观看 | 国产精品久久久久久久久久久久午夜 | 国产精品免费久久久 | 精品一区二区久久久久 | 斗破苍穹在线观看免费完整观看 | 亚洲一区二区三区视频免费 | 91av在线免费视频 | 欧美成网站 | 在火车上摸两乳爽的大叫 | 九九热在线视频免费观看 | 狠狠操天天射 | 久草视频福利在线观看 | 亚洲一区二区网址 | av在线免费播放网站 | 色玖玖综合 | 最新av在线免费观看 | 日韩精品中文字幕一区二区 | 欧美极品欧美精品欧美视频 | 亚洲午夜久久久久 | 羞羞视频一区 | 久久久久久91 | 国产69精品久久久久9999不卡免费 | 亚洲性生活视频 | 巨乳毛片 | 亚洲天堂欧美在线 | 久草在线高清 | 九九热在线免费观看视频 | 日韩做爰视频免费 | 久久另类视频 |