Swiper.js 是一個功能齊全的輪播套件,除了輪播外,也可以客製化導航按鈕和頁碼等細項。目前支持 JS、React、Vue。我的 Vue3 專題中也有使用這套套件呈現,但因為 Swiper.js Vue 版是由 Composition API 寫成,但我當時只會 Options API,花了很多時間了解撰寫方式。今天目標就是介紹 Swiper.js 在 Vue3 Options API 的用法和元件化小撇步。
目標功能
- 網頁每次顯示 3 則,768px 以下顯示 1 則
- 輪播時以更新 1 則為單位
- 可自動播放:Autoplay(自動播放)
- 可使用頁碼操作:Pagination(頁碼)
- 可使用導航切換上下頁:Navigation(上下一則導航)
- 輪播至最後一筆,會自動同方向重複播放:Loop(迴圈)
- 輪播元件可以重複使用,並秀出不同類別內容
一、官網資源/安裝
Swiper 11:https://swiperjs.com/demos
Swiper 4-7 中文翻譯(非官方):https://www.swiper.com.cn/api/scrollbar/369.html
1 | npm i swiper@10.3.1 |
是的沒錯~ 雖然現在 Swiper 版本已經是 11 了,但我的使用經驗是不管是否為同一個 swiper 元件,重複在同一個頁面使用沒有問題。但如果在不同頁面中使用,navigation(上/下一張)的導航就會失效,只有降版沒有問題,可能跟 Swiper 後期版本是用 Composition api 來撰寫有關。我個人是習慣各版本文件搭配著看,雖然中文翻譯版已經很舊了,但是初學時的好利器。實作時也推薦大家先從 11 的 Demos 尋找範例開始,比較好入手。
二、建立元件
1. 引入方法
建立元件文件 SwiperComponent.vue。
官網提到:By default Swiper Vue uses core version of Swiper (without any additional modules). If you want to use Navigation, Pagination and other modules, you have to install them first.
所以像是 Autoplay(自動播放)、Pagination(頁碼)、Navigation(上下一則導航)都是要額外引入的。
1 | <script> |
2. 撰寫 HTML
1 | // swiper 輪播主體,設置都要在 Swiper 標籤範圍內才會生效 |
屬性說明:
- slidesPerView:每次輪播更換則數。
- breakpoints:RWD 響應式斷點,但是請注意只有文件中提到的屬性才能用 RWD,其他操作只能用 CSS 或 JS 實現。在這裡的設定是 slidesPerView 在 768px 以上顯示 3 則,以下顯示 1 則。
- spaceBetween:每則輪播間距,如果想做文字跑馬燈,也可以設定成 auto,讓他自動計算。
- pagination:在此設定為可以使用點選操作的,pagination 還有外觀選項。
- navigation:上下一則導航,如果要使用則設為 true,文章後面會再介紹如何客製化樣式。
- loop:播放至最後一筆時,能維持同一方向從第一筆繼續播放。如果不設定,則整個 swiper 會先逆向回到第一筆,才開始輪播。
- autoplay:自動輪播,在此設定 2500 毫秒輪播,滑鼠互動時,輪播不會暫停計秒。
詳細可以參考官方文件,內容有每個屬性的預設值和調整方法。
3. 在父元件使用
1 | <template> |
完成到這裡就可以使用啦!很方便又快速~
三、元件複用
1. 元件複用的好處
減少重複程式碼
調整只需要更動元件,避免修改四散的程式碼,較好維護
2. 實作方法
Vue 元件使用的資料可以由內部生成與外部傳入,我們要同時運用這兩個技巧。
- 先在 SwiperComponent.vue 中建立我們要顯示資料的欄位,以本文目標範例圖來說,首先是每個 swiper 區塊的標題。我們先從父元件輸入外部資料試試看,於元件引用處上建立外部屬性 adCategoryTitle,並寫入要呈現的字串標題。
1 | // 父元件 |
- 回到 swiper 元件,將剛才設定的外部屬性名稱填入,就完成了。
1 | // SwiperComponent.vue |
- 但通常複用元件不僅只有標題變化,輪播內容也要不同,所以我們可以再回頭修改上面的程式碼。
以下 swiper 元件運作邏輯是:
- 將父元件傳入的文字屬性化,從中文標題改成分類。
- swiper 元件建立屬性對應的標題 adTitle,結合上一個步驟,就可以利用傳入資料對應獲取的中文標題了,這可以避免中文字要修改時父子元件都要更動的問題。
- 父元件渲染時,每碰到 swiper 元件都會啟動
mounted
獲取產品資料getProducts()
。 getProducts()
也是根據外部傳入資料,獲取對應要顯示的產品內容。
1 | // 父元件 |
1 | // SwiperComponent.vue |
四、客製化 swiper 樣式
1. 客製化 navigation
swiper 本身動作就綁定在原生 CSS 樣式上,不需要額外寫 id
或 class
使用 DOM
綁定。以下 .swiper-button-next
和 .swiper-button-prev
都是原生設定,藉由這兩項樣式調整 CSS,就可以客製化外觀了。
如果 navigation 要 RWD 響應式顯示,也是藉由 CSS 設定。
1 | // SwiperComponent.vue |
1 | // SwiperComponent.vue |
2. navigation 在 Swiper 元件範圍外顯示的方法
swiper 預設的 navigation 是在 .swiper
範圍內的。如果要讓 navigation(藍框)像下圖超出在 .swiper
(紅框)範圍外,我們要先來釐清它的 CSS。
HTML 中 <Swiper>
生成的範圍就是途中右側使用 .swiper
樣式的區域範圍,它本身有 position-relative
和 overflow-hidden
的設定,所以我們可以發現:
- 查看
.swiper-button-next
或.swiper-button-prev
,發現原生帶有 position-absolute
樣式,所以可以透過top/right...
等方法定位。 - 如果直接移動 navigation 位置,會發現超出
.swiper
的部分會被隱藏,所以我們要針對區域尺寸做更改。
1 | // SwiperComponent.vue |
1 | <style lang="scss" scoped> |
我們可以從下圖理解 padding 和 margin 合作關係。
- 紅框是我們要限縮內容顯示的範圍
- padding 20px,將
.swiper
overflow-hidden
的範圍左右撐開 - margin -20px,讓輪播內容範圍內縮,如果不做這個設定,輪播範圍會跟黃框一樣
1 | <style lang="scss" scoped> |
3. 客製化 pagination
pagination 也可以使用原生的 .swiper-pagination
修改。
例如以下做了只有 768px 以下才顯示、更改 pagination 顏色。
1 | /* swiper 顯示區域尺寸 */ |
五、結尾
當初在 swiper vue 上卡了很久,感謝 Billy 助教提供指點,告訴我要換成 swiper 8 才能避免錯誤。
感謝好同學聿凌提問 Swiper 10 能否運行,經過測試也沒問題!
附上這位超認真同學的專題 Repo、Pages,這是一個南部旅遊方案電商,整個平台和 JSON Server 資料庫都是她獨力開發完成的。從 JS 直播班到 Vue 直播班,看她與專題教練的討論紀錄,很開心她克服重重困難,完成了這份專題。
本文原發表於 Vocus,此篇為個人 blog 備份。