最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue項(xiàng)目中使用better-scroll實(shí)現(xiàn)一個(gè)輪播圖自動(dòng)播放功能

 更新時(shí)間:2018年12月03日 14:51:16   作者:皮蛋和豆樹  
better-scroll是一個(gè)非常非常強(qiáng)大的第三方庫 在移動(dòng)端利用這個(gè)庫 不僅可以實(shí)現(xiàn)一個(gè)非常類似原生ScrollView的效果 也可以實(shí)現(xiàn)一個(gè)輪播圖的效果。這篇文章主要介紹了Vue項(xiàng)目中使用better-scroll實(shí)現(xiàn)一個(gè)輪播圖,需要的朋友可以參考下

前言

better-scroll是一個(gè)非常非常強(qiáng)大的第三方庫 在移動(dòng)端利用這個(gè)庫 不僅可以實(shí)現(xiàn)一個(gè)非常類似原生ScrollView的效果 也可以實(shí)現(xiàn)一個(gè)輪播圖的效果 這里就先記錄一下自己實(shí)現(xiàn)這個(gè)效果的一些過程吧

思路

1.首先要確定自己的HTML結(jié)構(gòu) 基本結(jié)構(gòu)就是一個(gè)wrapper包含一個(gè)content

2.其次需要明白的一個(gè)頁面可以滾動(dòng)的原理在于 當(dāng)內(nèi)容的高度超出了容器的高度才可以實(shí)現(xiàn)滾動(dòng) 如果沒有超出 那么就沒有滾動(dòng)的必要 因此第一點(diǎn)需要實(shí)現(xiàn)的就是 獲取到所有內(nèi)容的高度 由于實(shí)現(xiàn)的是一個(gè)輪播圖 所以其實(shí)整個(gè)頁面應(yīng)該想象成這樣

滾動(dòng)原理

這里可以很清楚的看到 當(dāng)頁面的橫向?qū)挾瘸隽艘暱诘膶挾?因此也就可以實(shí)現(xiàn)滾動(dòng) 綜上所述 可以看出 實(shí)現(xiàn)橫向輪播最重要的一點(diǎn)在于寬度 因此 我們首先要獲得的就是整個(gè)輪播圖的寬度

3.既然是個(gè)輪播圖 那么用戶同時(shí)也需要知道的就是 當(dāng)前播放的是第幾張圖 也就是常見的"小白點(diǎn)" 小白點(diǎn)的個(gè)數(shù)用于告訴用戶總共有幾張圖 而當(dāng)前播放第幾張圖則可以在小白點(diǎn)上加上一些特殊樣式的方法來告知用戶

4.輪播圖也需要一些常見的屬性 例如 頁面渲染以后自動(dòng)播放以及播放間隔 還有一個(gè)就是 是否支持循環(huán)輪播

理清思路以后 就可以開始干活了 1.完善HTML結(jié)構(gòu) 其實(shí)代碼非常簡單 也就是創(chuàng)建兩個(gè)div 并且添加ref引用可以方便的通過ref屬性獲取上下文

<div class="slider"
 ref="slider">
 <div class="slider-content"
  ref="sliderContent">
 <slot></slot>
 </div>
</div>

這里用了vue中非常常見的slot插槽 為的是當(dāng)我們在外部調(diào)用這個(gè)slider組件的時(shí)候 可以方便的在外部傳入一些子組件

2.上文已經(jīng)提到了一些控制slider的屬性 所以需要在組件的props里接受這些屬性 便于我們在外部方便的控制這些屬性

props: {
 // 是否循環(huán)播放
 loop: {
 type: Boolean,
 default: true
 },
 // 是否自動(dòng)播放
 autoPlay: {
 type: Boolean,
 default: true
 },
 // 播放間隔
 interval: {
 type: Number,
 default: 3000
 }
 }

3.一些初始步驟的完成的差不多了以后 我們需要借助到vue的一個(gè)生命周期鉤子 mounted 也就是當(dāng)頁面渲染完畢以后 去獲取輪播圖的寬度以及初始化輪播圖的一些設(shè)置

mounted: function () {
 setTimeout(() => {
 this.setSliderWidth()
 this.initSlider()
 }, 20)

這里有一個(gè)小小的tips 就是 通常情況下 瀏覽器渲染dom的時(shí)間為17ms 所以這里使用了一個(gè)延遲函數(shù) 在20ms以后去調(diào)用這些方法 也就是確保瀏覽器的dom被正確渲染 防止出現(xiàn)一些問題

4.上面只是調(diào)用了這個(gè)方法 還沒有實(shí)現(xiàn)這些方法 首先在設(shè)置寬度的方法里 我們需要通過$refs.sliderContent拿到上下文 并且通過一個(gè)$refs.slider.clientWidth方法拿到當(dāng)前屏幕寬度 然后遍歷這個(gè)容器 取得容器里的所有內(nèi)容 同時(shí)把獲取的內(nèi)容寬度設(shè)置為這個(gè)屏幕的寬度 最后所有的內(nèi)容的寬度相加 就可以得到整個(gè)slider的寬度 說了這么多 感覺很繞口 所以還是看下代碼吧

// 設(shè)置slider的寬度
 setSliderWidth: function (isResize) {
 // 獲取slider里的所有的子元素
 this.children = this.$refs.sliderContent.children
 // console.log(this.children)
 // 計(jì)算寬度 = 圖片個(gè)數(shù)+每張圖片的寬度
 let width = 0
 // 獲取手機(jī)屏幕的寬度
 let sliderWidth = this.$refs.slider.clientWidth
 
 for (let i = 0; i < this.children.length; i++) {
 // 獲取children里的每一項(xiàng)內(nèi)容 
 let child = this.children[i]
 
 child.style.width = sliderWidth + 'px'
 width += sliderWidth
 }
 if (this.loop) {
 width += 2 * sliderWidth
 }
 this.$refs.sliderContent.style.width = width + 'px'
 }

這樣我們就獲取了整個(gè)slider的寬度 還有一個(gè)細(xì)節(jié)在于 當(dāng)如果是loop的時(shí)候 better-scroll會在頭尾克隆兩份 所以寬度會需要*2 接下去就是實(shí)現(xiàn)一些初始化better-scroll的一些配置了 具體的參數(shù)內(nèi)容可以從better-scorll官網(wǎng)上查詢到 這里就不多做贅述了

 // 設(shè)置寬度以后初始化slider
 initSlider: function () {
 this.slider = new BScroll(this.$refs.slider, {
 scrollX: true,
 scrollY: false,
 momentum: false,
 snap: {
  loop: this.loop,
  threshold: 0.3,
  speed: 400
 },
 click: true
 })
 }

5.實(shí)現(xiàn)上述兩個(gè)方法以后 其實(shí)輪播圖基本已經(jīng)可以在頁面上看到了 大概就是長成這樣 不過這樣寫完以后 會發(fā)現(xiàn)輪播圖是沒有辦法自動(dòng)輪播的以及當(dāng)前顯示的是幾張圖的樣式并沒有正確顯示 所以接下去就是實(shí)現(xiàn)這兩個(gè)方法 ps:這里的圖片數(shù)據(jù)來源什么 是請求了QQ音樂banner的接口文件

輪播圖的效果

6.實(shí)現(xiàn)dots樣式的正確加載 這里用到了vue中樣式的綁定

<div class="dots">
 <span class="dot"
  v-for="(item, index) of dots"
  :class="{active:currentPageIndex === index}"
  :key="index">
 </span>
 </div>

也就是說 我們通過下標(biāo)來綁定樣式 同時(shí)監(jiān)聽一個(gè)better-scroll的'scrollEnd'事件 當(dāng)滾動(dòng)結(jié)束的時(shí)候調(diào)用getCurrentPage()這個(gè)方法 這個(gè)方法會有一個(gè)返回值pageX 也就是橫向滾動(dòng)到第幾頁 把這個(gè)返回值賦值給currentPageIndex 從而達(dá)到正確顯示樣式的目的

this.slider.on('scrollEnd', () => {
 let page = this.slider.getCurrentPage().pageX
 this.currentPageIndex = page
 // 當(dāng)滾動(dòng)結(jié)束以后 如果是自動(dòng)播放的話 那么首先要清除定時(shí)器(防止手動(dòng)拖動(dòng)輪播圖以后圖片無法正確顯示)然后再次執(zhí)行方法 才能實(shí)現(xiàn)輪播
 if (this.autoPlay) {
  clearTimeout(this.timer)
  this.play()
 }
 })

7.實(shí)現(xiàn)自動(dòng)播放功能 better-scroll也提供了一個(gè)接口goToPage(x, y, time, easing) 顧名思義也就是轉(zhuǎn)到對應(yīng)頁面 其中幾個(gè)參數(shù)分別代表 x表示橫向頁面 y表示縱向頁面 time表示動(dòng)畫執(zhí)行時(shí)間 easing一般不建議修改 有了這個(gè)接口 其實(shí)就非常輕松了 我們只需要在methods里再寫一個(gè)Play方法 具體的思路就是 通過currentPageIndex+=1得到下一張要播放的圖片的索引 同時(shí)當(dāng)索引值達(dá)到圖片數(shù)組的長度的時(shí)候?qū)⒁饕匦沦x值為0就好了 并在頁面渲染了以后調(diào)用就可以了

play: function () {
 let playPage = this.currentPageIndex + 1
 if (playPage === this.children.length - 2) {
 playPage = 0
 }
 setTimeout(() => {
 this.slider.goToPage(playPage, 0, 400)
 }, this.interval)
 }

這里也有個(gè)細(xì)節(jié)就是 當(dāng)設(shè)置這個(gè)輪播圖為循環(huán)滾動(dòng)的時(shí)候 better-scroll會自動(dòng)在頭尾各克隆一份圖片 所以長度需要減去2 這樣就可以實(shí)現(xiàn)輪播圖的自動(dòng)播放了

總結(jié)

以上所述是小編給大家介紹的Vue項(xiàng)目中使用better-scroll實(shí)現(xiàn)一個(gè)輪播圖自動(dòng)播放功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 基于vue-cli3多頁面開發(fā)apicloud應(yīng)用的教程詳解

    基于vue-cli3多頁面開發(fā)apicloud應(yīng)用的教程詳解

    這篇文章主要介紹了基于vue-cli3多頁面開發(fā)apicloud應(yīng)用,本文采用vue-cli+APIcloud的方式寫解決以上痛點(diǎn),開發(fā)靈活,并且打包之后體積更小速度更快,需要的朋友可以參考下
    2019-06-06
  • vue3 表單搜索內(nèi)容回顯到地址欄的實(shí)例代碼

    vue3 表單搜索內(nèi)容回顯到地址欄的實(shí)例代碼

    這篇文章主要介紹了vue3 表單搜索內(nèi)容回顯到地址欄的實(shí)例代碼,地址欄輸入內(nèi)容回顯到form表單,同理表單輸入內(nèi)容也要回顯到地址欄中,本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • 一文詳解Vue Router的使用和路由守衛(wèi)

    一文詳解Vue Router的使用和路由守衛(wèi)

    Vue Router 是 Vue.js 的官方路由庫,用于在 Vue 應(yīng)用中實(shí)現(xiàn)單頁面應(yīng)用(SPA)的客戶端路由,以下是 Vue Router 的詳細(xì)介紹,包括基本概念、配置、路由導(dǎo)航以及高級用法,感興趣的小伙伴跟著小編一起來看看吧
    2024-08-08
  • vue.js層疊輪播效果的實(shí)例代碼

    vue.js層疊輪播效果的實(shí)例代碼

    這篇文章主要介紹了vue.js層疊輪播效果,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2018-11-11
  • Vue transition過渡組件詳解

    Vue transition過渡組件詳解

    我們現(xiàn)在可以了解一下vue的過渡,vue在插入、更新以及移除DOM元素的時(shí)候,提供了很多不同方式過渡的效果,如果在css過渡自動(dòng)應(yīng)用class,在過渡鉤子函數(shù)中使用JavaScript直接操作DOM就可以了
    2022-08-08
  • Vue3配置代理后頁面500/404問題

    Vue3配置代理后頁面500/404問題

    這篇文章主要介紹了Vue3配置代理后頁面500/404問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Vue3開發(fā)必備的六個(gè)VSCode插件推薦

    Vue3開發(fā)必備的六個(gè)VSCode插件推薦

    在VSCode中添加好用的插件可以提高我們的開發(fā)效率,這些可以幫助我們格式化,擴(kuò)充性,執(zhí)行最佳實(shí)踐的代碼方式,自動(dòng)完成一些瑣碎的事情,下面這篇文章主要給大家推薦介紹了關(guān)于Vue3開發(fā)必備的六個(gè)VSCode插件,需要的朋友可以參考下
    2022-12-12
  • Vue實(shí)現(xiàn)動(dòng)態(tài)響應(yīng)數(shù)據(jù)變化

    Vue實(shí)現(xiàn)動(dòng)態(tài)響應(yīng)數(shù)據(jù)變化

    本篇文章主要介紹了Vue 動(dòng)態(tài)響應(yīng)數(shù)據(jù)變化,通過綁定數(shù)據(jù)即可以實(shí)時(shí)改變視圖顯示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • 詳解Vuejs2.0之異步跨域請求

    詳解Vuejs2.0之異步跨域請求

    這篇文章主要介紹了詳解Vuejs2.0之異步跨域請求,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • Vue中v-bind原理深入探究

    Vue中v-bind原理深入探究

    這篇文章主要給大家分享了 v-bind的使用和注意需要注意的點(diǎn),下面文章圍繞 v-bind指令的相關(guān)資料展開內(nèi)容且附上詳細(xì)代碼 需要的小伙伴可以參考一下,希望對大家有所幫助
    2022-10-10

最新評論

永平县| 大兴区| 岫岩| 黄梅县| 孝感市| 穆棱市| 临沧市| 忻州市| 青冈县| 巴塘县| 隆昌县| 营山县| 丰原市| 麦盖提县| 鹤峰县| 施秉县| 攀枝花市| 韶山市| 如皋市| 巩留县| 清徐县| 哈巴河县| 龙门县| 江阴市| 盐源县| 内黄县| 安仁县| 石景山区| 平罗县| 永定县| 尼玛县| 射阳县| 新巴尔虎左旗| 陆川县| 横峰县| 崇州市| 沧州市| 于都县| 梁河县| 体育| 阿巴嘎旗|