首頁 web前端 js教程 怎樣用Vue+better-scroll實現字母索引導航

怎樣用Vue+better-scroll實現字母索引導航

May 23, 2018 am 11:40 AM
字母 索引

這次帶給大家怎樣用Vue better-scroll實現字母索引導航,用Vue better-scroll實現字母索引導航的注意事項有哪些,下面就是實戰案例,一起來看一下。

Demo:list-view,使用 chrome 手機模式檢視。換成手機模式之後,不能滑動的話,刷新一下就 OK 了。

Github: 行動端字母索引導覽

效果圖

設定環境


因為用到的是vue-cli 和better-scroll,所以首先要安裝vue-cli,然後再npm 安裝better-scroll。

簡單介紹一下 better-scroll:

better-scroll 是一款重點解決行動裝置(已支援 PC)各種捲動場景需求的外掛程式。它的核心是藉鑒的 iscroll 的實現,它的 API 設計基本上兼容 iscroll,在 iscroll 的基礎上又擴展了一些 feature 以及做了一些

性能優化

better-scroll 是基於原生 JS 實作的,不依賴任何框架。它編譯後的程式碼大小是 63kb,壓縮後是 35kb,gzip 後僅有 9kb,是一款非常輕量的 JS lib。 除了這兩,還使用 scss、vue-lazyload。 scss 預處理器,大家都懂,用別的也一樣。 lazyload 實現懶加載,不用也可以,主要是優化一下體驗。

資料直接使用了網易雲的歌手榜單,偷懶就直接放在 data 裡面了。

CSS 樣式我就不貼了,直接看原始碼就可以了。

實作基本樣式

直接使用 v-for 和 雙側嵌套實作歌手清單、以及右側索引列。 HTML 結構:

<ul>
 <li v-for="group in singers" 
 class="list-group" 
 :key="group.id" 
 ref="listGroup">
  <h2 class="list-group-title">{{ group.title }}</h2>
  <ul>
   <li v-for="item in group.items" 
   class="list-group-item" :key="item.id">
    <img v-lazy="item.avatar" class="avatar">
    <span class="name">{{ item.name }}</span>
   </li>
  </ul>
 </li>
</ul>
<p class="list-shortcut">
 <ul>
  <li v-for="(item, index) in shortcutList"
  class="item"
  :data-index="index"
  :key="item.id"
  >
   {{ item }}
  </li>
 </ul>
</p>
登入後複製
shortcutList 是透過計算屬性得到的,取 title 的第一個字元即可。

shortcutList () {
 return this.singers.map((group) => {
  return group.title.substr(0, 1)
 })
}
登入後複製

使用 better-scroll

#使用 better-scroll 實作捲動。對了,使用的時候別忘了用 import 引入。

created () {
 // 初始化 better-scroll 必须要等 dom 加载完毕
 setTimeout(() => {
  this._initSrcoll()
 }, 20)
},
methods: {
 _initSrcoll () {
  console.log('didi')
  this.scroll = new BScroll(this.$refs.listView, {
   // 获取 scroll 事件,用来监听。
   probeType: 3
  })
 }
}
登入後複製
使用 created 方法進行 better-scroll 初始化,使用 setTimeout 是因為需要等到 DOM 載入完畢。不然 better-scroll 取得不到 dom 就會初始化失敗。 這裡把方法寫在兩個 methods 裡面,這樣就不會看起來很亂,直接呼叫就可以了。 初始化的時候傳入兩 probeType: 3,解釋一下:當 probeType 為 3 的時候,不僅在屏幕滑動的過程中,而且在 momentum 滾動動畫運行過程中實時派發 scroll 事件。如果沒有設定該值,其預設值為 0,即不派發 scroll 事件。

為索引新增點擊事件和移動事件實作跳躍

首先需要給索引綁定一個touchstart 事件(當在螢幕上按下手指時觸發),直接使用v-on 就可以了。然後還要為索引加上一個 data-index 這樣就可以取得到索引的值,使用 :data-index="index" 。 ###
<p class="list-shortcut">
 <ul>
  <li v-for="(item, index) in shortcutList"
  class="item"
  :data-index="index"
  :key="item.id"
  @touchstart="onShortcutStart"
  @touchmove.stop.prevent="onShortcutMove"
  >
   {{ item }}
  </li>
 </ul>
</p>
登入後複製
###綁定一個 onShortcutStart 方法。實現點選索引跳轉的功能。再綁定一個 onShortcutMove 方法,實現滑動跳轉。 ###
created () {
 // 添加一个 touch 用于记录移动的属性
 this.touch = {}
 // 初始化 better-scroll 必须要等 dom 加载完毕
 setTimeout(() => {
  this._initSrcoll()
 }, 20)
},
methods: {
 _initSrcoll () {
  this.scroll = new BScroll(this.$refs.listView, {
   probeType: 3,
   click: true
  })
 },
 onShortcutStart (e) {
  // 获取到绑定的 index
  let index = e.target.getAttribute('data-index')
  // 使用 better-scroll 的 scrollToElement 方法实现跳转
  this.scroll.scrollToElement(this.$refs.listGroup[index])
  // 记录一下点击时候的 Y坐标 和 index
  let firstTouch = e.touches[0].pageY
  this.touch.y1 = firstTouch
  this.touch.anchorIndex = index
 },
 onShortcutMove (e) {
  // 再记录一下移动时候的 Y坐标,然后计算出移动了几个索引
  let touchMove = e.touches[0].pageY
  this.touch.y2 = touchMove
  
  // 这里的 16.7 是索引元素的高度
  let delta = Math.floor((this.touch.y2 - this.touch.y1) / 18)
  // 计算最后的位置
  // * 1 是因为 this.touch.anchorIndex 是字符串,用 * 1 偷懒的转化一下
  let index = this.touch.anchorIndex * 1 + delta
  this.scroll.scrollToElement(this.$refs.listGroup[index])
 }
}
登入後複製
###這樣就可以實現索引的功能了。 ######當然這樣是不會滿足我們的對不對,我們要加入酷炫的特效呀。例如索引高亮什麼的~~############移動內容索引高亮############emmm,這時候就有點複雜啦。但是有耐心就可以看懂滴。 ######我們需要 better-scroll 的 on 方法,傳回內容捲動時候的 Y軸偏移值。所以在初始化 better-scroll 的時候需要加入一下程式碼。對了,別忘了在 data 中加入一個 scrollY,和 ###current###Index (用來記錄高亮索引的位置)因為我們需要監聽,所以在 data 中加入。 ###
_initSrcoll () {
 this.scroll = new BScroll(this.$refs.listView, {
  probeType: 3,
  click: true
 })
 // 监听Y轴偏移的值
 this.scroll.on('scroll', (pos) => {
  this.scrollY = pos.y
 })
}
登入後複製
###然後需要計算內容的高度,增加一個 calculateHeight() 方法,用來計算索引內容的高度。 ###
_calculateHeight () {
 this.listHeight = []
 const list = this.$refs.listGroup
 let height = 0
 this.listHeight.push(height)
 for (let i = 0; i < list.length; i++) {
  let item = list[i]
  height += item.clientHeight
  this.listHeight.push(height)
 }
}
// [0, 760, 1380, 1720, 2340, 2680, 2880, 3220, 3420, 3620, 3960, 4090, 4920, 5190, 5320, 5590, 5790, 5990, 6470, 7090, 7500, 7910, 8110, 8870]
// 得到这样的值
登入後複製

然后在 watch 中监听 scrollY,看代码:

watch: {
 scrollY (newVal) {
  // 向下滑动的时候 newVal 是一个负数,所以当 newVal > 0 时,currentIndex 直接为 0
  if (newVal > 0) {
   this.currentIndex = 0
   return
  }
  // 计算 currentIndex 的值
  for (let i = 0; i < this.listHeight.length - 1; i++) {
   let height1 = this.listHeight[i]
   let height2 = this.listHeight[i + 1]
   if (-newVal >= height1 && -newVal < height2) {
    this.currentIndex = i
    return
   }
  }
  // 当超 -newVal > 最后一个高度的时候
  // 因为 this.listHeight 有头尾,所以需要 - 2
  this.currentIndex = this.listHeight.length - 2
 }
}
登入後複製

得到 currentIndex 的之后,在 html 中使用。

给索引绑定 class -->  :class="{'current': currentIndex === index}"

最后再处理一下滑动索引的时候改变 currentIndex。

因为代码可以重复利用,且需要处理边界情况,所以就把

this.scroll.scrollToElement(this.$refs.listGroup[index])

重新写了个函数,来减少代码量。

// 在 scrollToElement 的时候,改变 scrollY,因为有 watch 所以就会计算出 currentIndex
scrollToElement (index) {
 // 处理边界情况
 // 因为 index 通过滑动距离计算出来的
 // 所以向上滑超过索引框框的时候就会 < 0,向上就会超过最大值
 if (index < 0) {
  return
 } else if (index > this.listHeight.length - 2) {
  index = this.listHeight.length - 2
 }
 // listHeight 是正的, 所以加个 -
 this.scrollY = -this.listHeight[index]
 this.scroll.scrollToElement(this.$refs.listGroup[index])
}
登入後複製

lazyload

lazyload 插件也顺便说一下哈,增加一下用户体验。

使用方法

先 npm 安装

在 main.js 中 import,然后 Vue.use

import VueLazyload from 'vue-lazyload'
Vue.use(VueLazyload, {
 loading: require('./common/image/default.jpg')
})
登入後複製

添加一张 loading 图片,使用 webpack 的 require 获取图片。

然后在需要使用的时候,把 :src="" 换成 v-lazy="" 就实现了图片懒加载的功能。

总结

移动端字母索引导航就这么实现啦,感觉还是很有难度的哈(对我来说)。

主要就是使用了 better-scroll 的 on 获取移动偏移值(实现高亮)、scrollToElement 跳转到相应的位置(实现跳转)。以及使用 touch 事件监听触摸,来获取开始的位置,以及滑动距离(计算最后的位置)。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

vue2.0实现输入框实时检索更新步骤详解

mpvue小程序markdown适配怎样实现

以上是怎樣用Vue+better-scroll實現字母索引導航的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1272
29
C# 教程
1252
24
如何在 Windows 11 上修復 100% 的磁碟使用率 如何在 Windows 11 上修復 100% 的磁碟使用率 Apr 20, 2023 pm 12:58 PM

如何在Window11上修復100%的磁碟使用率查找導致100%磁碟使用的有問題的應用程式或服務的直接方法是使用任務管理器。若要開啟任務管理器,請右鍵點選開始功能表並選擇任務管理器。按一下磁碟列標題,查看佔用最多資源的內容。從那裡開始,您將很好地了解從哪裡開始。但是,問題可能比僅僅關閉應用程式或停用服務更嚴重。繼續閱讀以查找問題的更多潛在原因以及如何解決這些問題。停用SuperfetchSuperfetch功能(在Windows11中也稱為SysMain)有助於透過存取預取檔案來減少啟動時

以下是6種修復Windows 11搜尋欄不可用的方法。 以下是6種修復Windows 11搜尋欄不可用的方法。 May 08, 2023 pm 10:25 PM

如果您的搜尋欄在Windows11中不起作用,有幾種快速方法可以立即啟動並運行!任何微軟作業系統有時都可能遇到故障,最新的作業系統不能免除該規則。此外,正如Reddit上的使用者u/zebra_head1所指出的那樣,同樣的錯誤出現在Windows11的22H2Build22621.1413上。用戶抱怨切換工作列搜尋框的選項隨機消失。因此,您必須為任何情況做好準備。為什麼我無法在電腦上的搜尋欄中鍵入內容?無法在計算機上鍵入可歸因於不同的因素和過程。以下是您應該注意的一些事項:Ctfmon.

Stremio字幕不工作;載入字幕時出錯 Stremio字幕不工作;載入字幕時出錯 Feb 24, 2024 am 09:50 AM

字幕在你的WindowsPC上不能在Stremio上運行嗎?一些Stremio用戶報告說,影片中沒有顯示字幕。許多用戶報告說他們遇到了一條錯誤訊息,上面寫著「載入字幕時出錯」。以下是與此錯誤一起顯示的完整錯誤訊息:載入字幕時出錯載入字幕失敗:這可能是您正在使用的插件或您的網路有問題。正如錯誤訊息所說,可能是您的網路連線導致了錯誤。因此,請檢查您的網路連接,並確保您的網路運作正常。除此之外,這個錯誤的背後可能還有其他原因,包括字幕加載項衝突、特定影片內容不支援字幕以及Stremio應用程式過時。如

如何在 Windows 11 中隱藏檔案和資料夾並從搜尋中移除? 如何在 Windows 11 中隱藏檔案和資料夾並從搜尋中移除? Apr 26, 2023 pm 11:07 PM

&lt;h2&gt;如何在Windows11上從搜尋中隱藏檔案和資料夾&lt;/h2&gt;&lt;p&gt;我們首先要看的是自訂Windows搜尋檔案的位置。透過跳過這些特定位置,您應該可以更快地看到結果,同時還可以隱藏您想要保護的任何檔案。 &lt;/p&gt;&lt;p&gt;如果要從Windows11上的搜尋排除檔案和資料夾,請使用下列步驟:&lt;/p&gt;&lt;ol&

C++程式:按字母順序重新排列單字的位置 C++程式:按字母順序重新排列單字的位置 Sep 01, 2023 pm 11:37 PM

在這個問題中,一個字串被當作輸入,我們必須按字典順序對字串中出現的單字進行排序。為此,我們為字串中的每個單字(之間用空格區分)分配一個從1開始的索引,並以排序索引的形式獲得輸出。 String={“Hello”,“World”}“Hello”=1“World”=2由於輸入字串中的單字已按字典順序排列,因此輸出將列印為“12”。讓我們看看一些輸入/結果場景-假設輸入字串中的所有單字都相同,讓我們看看結果-Input:{“hello”,“hello”,“hello”}Result:3獲得的結

oracle索引類型有哪些 oracle索引類型有哪些 Nov 16, 2023 am 09:59 AM

oracle索引類型有:1、B-Tree索引;2、位圖索引;3、函數索引;4、雜湊索引;5、反向鍵索引;6、局部索引;7、全域索引;8、網域索引;9、位圖連接索引;10、複合索引。詳細介紹:1、B-Tree索引,是一種自平衡的、可以有效率地支援並發操作的樹狀資料結構,在Oracle資料庫中,B-Tree索引是最常用的一種索引類型;2、位圖索引,是一種基於點陣圖演算法的索引類型等等。

Windows 11 Outlook 搜尋不工作:6 個修復方法 Windows 11 Outlook 搜尋不工作:6 個修復方法 Apr 22, 2023 pm 09:46 PM

在Outlook中執行搜尋和索引疑難排解您可以開始的更直接的修復之一是執行搜尋和索引疑難排解。若要在Windows11上執行疑難排解,請執行下列操作:按一下開始按鈕或按Windows鍵並從功能表中選擇設定。當設定開啟時,選擇系統>疑難排解>其他疑難排解。在右側向下捲動,找到SearchandIndexing,然後按一下Run按鈕。選擇Outlook搜尋不傳回結果並繼續畫面上的說明。當您運行它時,疑難排解程式將自動識別並修復問題。執行疑難排解後,開啟Outlook並查看搜尋是否正常。如

使用Golang判斷一個字元是否為字母的方法 使用Golang判斷一個字元是否為字母的方法 Dec 23, 2023 pm 04:09 PM

Golang實作:判斷字元是否為字母的方法在Golang中,有多種方法可以判斷一個字元是否為字母。本文將介紹其中幾種常用的方法,並為每種方法提供特定的程式碼範例。方法一:使用Unicode套件的IsLetter函數Golang中的Unicode套件提供了一個名為IsLetter的函數,可以判斷一個字元是否為字母。此函數的使用方法如下:packagemaini

See all articles