基于Vue2x實(shí)現(xiàn)響應(yīng)式自適應(yīng)輪播組件插件VueSliderShow功能
VueSliderShow故名思意,vue的輪播圖組件插件,該插件:
1、支持瀏覽器任意放縮,兼容移動端,
2、支持自動切換,鼠標(biāo)經(jīng)過停止切換,分頁/任意頁點(diǎn)擊切換,左右切換,
3、支持文字介紹(超過一行自動省略)
本文講述的是從開發(fā)一款基于Vue2x的響應(yīng)式自適應(yīng)輪播組件插件的一個(gè)全過程,包含發(fā)布到npm,構(gòu)建自己的npm包,供下載安裝使用的技巧,閱讀本文需要些Vue的語法糖(自定義標(biāo)簽、計(jì)算屬性、父子組件通信等),以及ES6、npm等基礎(chǔ)知識。先來看下Demo
Install
npm i vueslideshow
使用示例
in vue2.x:
<template>
//輪播組件的位置
<div>
<slider-show :slides="slides" :inv="invTime"></slider-show>
</div>
</template>
<script>
import sliderShow from 'vueslidershow'
export default {
components: {
sliderShow
},
data () {
return {
invTime: 2000,
slides: [
{
src: require('../assets/1.jpg'),
title: '測試測試測試1',
href: 'detail/analysis'
}
]
}
}
}
參數(shù)說明:
1.invTime:控制輪播速度
2.slides:具體的輪播數(shù)據(jù)數(shù)組形式,包含圖片,文字,鏈接三個(gè)參數(shù)
3.注意:由于是響應(yīng)式自適應(yīng)所以推的圖片必須高度一致
分割線,下面開始上路,步入主題!!
寫在前面:vue官網(wǎng)提供了開發(fā)插件的介紹,感興趣的老鐵可以先移步官網(wǎng)開發(fā)插件,
創(chuàng)建項(xiàng)目
0、想必各位老鐵都是有vue和前端經(jīng)驗(yàn)的了,這些基礎(chǔ)項(xiàng)目環(huán)境和搭建項(xiàng)目,改造初始化的vue項(xiàng)目都是睜眼閉眼的事情了,所以這里都一筆帶過:
1、vue環(huán)境配備,(node、vue-cli)
2、初始化項(xiàng)目,Vue init webpack vueslideshow。安裝依賴npm install(安裝的時(shí)候把vue-router默認(rèn)一起安裝上去)
改造初始化項(xiàng)目:
(0)改造前分析一下我們的需求:一個(gè)響應(yīng)式自適應(yīng)輪播組件,之所以是組件,是我們希望可以公用的代碼段,支持可動態(tài)配置,輪播組件無非就說圖片文字,自動切換,可選擇切換。
(1)app.vue里清空到如下就好
<template>
<div id="app">
<router-view/>
</div>
</template>
<script>
export default {
name: 'App'
}
</script>
(2)在components文件夾里,創(chuàng)建index.vue,sliderShow.vue(因?yàn)槭鞘纠?xiàng)目,規(guī)范上欠佳)讓router文件夾里的index.js啟動頁指向index.vue
import Vue from 'vue'
import Router from 'vue-router'
import Index from '@/components/index'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
component: Index
}
]
})
開發(fā)項(xiàng)目:
(1)index.vue作為父組件,通過es6的方式引用輪播組件,聲明使用輪播sliderShow組件,然后給sliderShow組件傳遞兩個(gè) invTime、slides屬性參數(shù),分別是輪播切換時(shí)間和數(shù)據(jù)傳遞,我們這里slides數(shù)組,用的是靜態(tài)模擬數(shù)據(jù),正式環(huán)境是通過請求接口請求的數(shù)據(jù)。
<template>
<div>
<slider-show :slides="slides" :inv="invTime"></slider-show>
</div>
</template>
<script>
import sliderShow from './sliderShow'
export default {
components: {
sliderShow
},
data () {
return {
invTime: 2000,
slides: [
{
src: require('../assets/1.jpg'),
title: '測試測試測試1',
href: 'detail/analysis'
},
{
src: require('../assets/2.jpg'),
title: '測試測試測試2',
href: 'detail/count'
}
]
}
}
}
(2)sliderShow.vue
模板段代碼讀解(布局這里就略講了),最外層分別有兩個(gè)鼠標(biāo)經(jīng)過clearInv事件,主要是希望在鼠標(biāo)經(jīng)過焦點(diǎn)圖的時(shí)候不進(jìn)行切換方便點(diǎn)圖片跳轉(zhuǎn),鼠標(biāo)移出執(zhí)行runInv事件繼續(xù)自動切換,transition分別去控制兩張圖的出現(xiàn)和消失,左右切換,和點(diǎn)擊具體的分頁切換這里用通用的一個(gè)goto()方法轉(zhuǎn)遞不同值,去判斷具體要展示的數(shù)據(jù)頁,這個(gè)值的計(jì)算可以通過vue里的計(jì)算屬性。
<template>
<div class="slide-show" @mouseover="clearInv" @mouseout="runInv">
<div class="slide-img">
<a :href="slides[nowIndex].href" rel="external nofollow" >
<transition name="slide-fade">
<img v-if="isShow" :src="slides[nowIndex].src">
</transition>
<transition name="slide-fade-old">
<img v-if="isShows" :src="slides[nowIndex].src">
</transition>
</a>
</div>
<div class="slide-title"><a>{{ slides[nowIndex].title }}</a></div>
<ul class="slide-pages">
<li v-for="(item, index) in slides"
@click="goto(index)"
>
<a :class="{on: index === nowIndex}"></a>
</li>
</ul>
<a @click="goto(prevIndex)" class="callbacks-nav"><</a>
<a @click="goto(nextIndex)" class="callbacks-nav next">></a>
</div>
</template>
<script>
export default {
props: {
slides: {
type: Array,
default: []
},
inv: {
type: Number,
default: 1000
}
},
data () {
return {
nowIndex: 0,
isShow: true,
isShows:false
}
},
computed: {
prevIndex () {
if (this.nowIndex === 0) {
return this.slides.length - 1
}
else {
return this.nowIndex - 1
}
},
nextIndex () {
if (this.nowIndex === this.slides.length - 1) {
return 0
}
else {
return this.nowIndex + 1
}
}
},
methods: {
goto (index) {
this.isShow = false
setTimeout(() => {
this.nowIndex = index
this.isShows = true
}, 10)
},
runInv () {
this.invId = setInterval(() => {
this.goto(this.nextIndex)
}, this.inv)
},
clearInv () {
clearInterval(this.invId)
}
},
mounted () {
this.runInv();
}
}
</script>
ES6邏輯段代碼解讀,sliderShow.vue通過props方式接受父組件里傳遞過來的數(shù)據(jù)
props: {
slides: {
type: Array,
default: []
},
inv: {
type: Number,
default: 1000
}
},
計(jì)算屬性,前一頁,這里就控制nowIndex,在當(dāng)前數(shù)據(jù)索引里減一,當(dāng)是第一條數(shù)據(jù)的時(shí)候,我們要跳到最后一條,所以當(dāng)?shù)谝粭l數(shù)據(jù)的時(shí)候我們這里判斷它并讓他賦值最后一條數(shù)據(jù),后一頁和前一頁相似,判斷最后一頁數(shù)據(jù),跳到第一頁。
computed: {
prevIndex () {
if (this.nowIndex === 0) {
return this.slides.length - 1
}
else {
return this.nowIndex - 1
}
},
nextIndex () {
if (this.nowIndex === this.slides.length - 1) {
return 0
}
else {
return this.nowIndex + 1
}
}
},
通過Index值,從而改變具體數(shù)據(jù)
goto (index) {
this.isShow = false
setTimeout(() => {
this.nowIndex = index
this.isShows = true
}, 10)
},
當(dāng)頁面加載完后直接執(zhí)行runInv()方法,然后自動切換,setInterval()/ clearInterval()是js內(nèi)置的定時(shí)器,setInterval()里按照父組件里傳的時(shí)間來調(diào)用函數(shù)的方法,clearInterval()是結(jié)束定時(shí)器的循環(huán)調(diào)用函數(shù)
runInv () {
this.invId = setInterval(() => {
this.goto(this.nextIndex)
}, this.inv)
},
clearInv () {
clearInterval(this.invId)
}
},
mounted () {
this.runInv();
}
輪播組件插件就基本上ok了,下面講解一下把這個(gè)輪播組件插件放到npm里,構(gòu)建自己的npm包。
分割線 npm?。。。?!
構(gòu)建npm包:
0、在https://www.npmjs.com創(chuàng)建自己的賬號
1、新建一個(gè)項(xiàng)目文件夾VueSliderShow,把上面的sliderShow.vue文件復(fù)制文件。打開cmd進(jìn)入到VueSliderShow目錄,然后命令行執(zhí)行:npm init(按流程填寫相關(guān)信息,都可以按照自己的實(shí)際情況寫),然后會生成一個(gè)package.json,例如下面是我這個(gè)組件的基本信息
{
"name": "vueslideshow",
"version": "1.0.2",
"description": "a slider implement by vuejs",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://github.com/HongqingCao/My-Code/tree/master/VueSliderShow"
},
"author": "HongqingCao",
"license": "ISC"
}
2、創(chuàng)建一個(gè)index.js
var sliderShow = require('./sliderShow')
module.exports = sliderShow
3、創(chuàng)建一個(gè)README.md,描述一下這個(gè)組件,可以參考一下我寫的
# vueslidershow
> a slider implement by vuejs
>一個(gè)vue的響應(yīng)式自適應(yīng)輪播圖組件
[Demo](https://github.com/HongqingCao/My-Code/tree/master/VueSliderShow)
###### 
## Install
``` bash
npm i vueslideshow
```
## 應(yīng)用案例
#### in vue2.x:
```html
<template>
<div>
<slider-show :slides="slides" :inv="invTime"></slider-show>
</div>
</template>
<script>
import sliderShow from './sliderShow'
export default {
components: {
sliderShow
},
data () {
return {
invTime: 2000,
slides: [
{
src: require('../assets/1.jpg'),
title: '測試測試測試1',
href: 'detail/analysis'
}
]
}
}
}
```
<br>
### 參數(shù)說明:
1.invTime,控制輪播速度
2.slides,具體的輪播數(shù)據(jù)數(shù)組形式,包含圖片,文字,鏈接三個(gè)參數(shù)
3.由于是響應(yīng)式自適應(yīng)所以推的圖片必須高度一致,更友好
## License
[MIT](LICENSE)
4、命令行npm login,登錄自己的賬號和密碼
5、發(fā)布到npm執(zhí)行命令行: npm publish,成功后你會發(fā)現(xiàn)你的npm里已經(jīng)有一個(gè)包了
你可以點(diǎn)擊進(jìn)入詳情看看
6、嘗試下載安裝在自己項(xiàng)目里:npm i vueslideshow,安裝完后在node_modules就可以看到自己的插件啦
7、應(yīng)用就如一開始的插件介紹一樣,可以往上看
最后總結(jié)
從開發(fā)到發(fā)布一款基于Vue2x的響應(yīng)式自適應(yīng)輪播組件插件VueSliderShow,到這里就已經(jīng)開發(fā)完畢,當(dāng)然里面肯定也有一定的bug在里面,我用了transition去包裹兩個(gè)img其實(shí)目前是沒用到這個(gè)過渡屬性,后期可以各位老鐵自己補(bǔ)一些絢麗的切換動畫,最后再次附上github示例源碼
以上所述是小編給大家介紹的基于Vue2x實(shí)現(xiàn)響應(yīng)式自適應(yīng)輪播組件插件VueSliderShow功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- 解決vue使用vant輪播組件swipe + flex時(shí)文字抖動問題
- Vue實(shí)現(xiàn)圖片輪播組件思路及實(shí)例解析
- vue輪播組件實(shí)現(xiàn)$children和$parent 附帶好用的gif錄制工具
- vue移動端輕量級的輪播組件實(shí)現(xiàn)代碼
- 使用Vue制作圖片輪播組件思路詳解
- 利用Vue實(shí)現(xiàn)移動端圖片輪播組件的方法實(shí)例
- 基于vue實(shí)現(xiàn)swipe輪播組件實(shí)例代碼
- 基于vue.js輪播組件vue-awesome-swiper實(shí)現(xiàn)輪播圖
- Vue實(shí)現(xiàn)可復(fù)用輪播組件的方法
相關(guān)文章
vue項(xiàng)目中引入noVNC遠(yuǎn)程桌面的方法
下面小編就為大家分享一篇vue項(xiàng)目中引入noVNC遠(yuǎn)程桌面的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
Vue的route-view子頁面調(diào)用父頁面的函數(shù)詳解
這篇文章主要介紹了Vue的route-view子頁面調(diào)用父頁面的函數(shù)詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
項(xiàng)目中一鍵添加husky實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了項(xiàng)目中一鍵添加husky實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Element Plus實(shí)現(xiàn)Affix 固釘
本文主要介紹了Element Plus實(shí)現(xiàn)Affix 固釘,Affix組件用于將頁面元素固定在特定可視區(qū)域,文中通過示例代碼介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下2021-07-07

