better-scroll 是一款重點解決移動端(已支持 PC)各類滾動場景需求的插件。它的核心是借鑑的 iscroll 的實現,它的 API 設計基本兼容 iscroll,在 iscroll 的基礎上又擴展了一些 feature 以及作了一些性能優化。npm
better-scroll 是基於原生 JS 實現的,不依賴任何框架。它編譯後的代碼大小是 63kb,壓縮後是 35kb,gzip 後僅有 9kb,是一款很是輕量的 JS lib。瀏覽器
先來看一下瀏覽器的滾動原理:瀏覽器的滾動條你們都會遇到,當頁面內容的高度超過視口高度的時候,會出現縱向滾動條;當頁面內容的寬度超過視口寬度的時候,會出現橫向滾動條。也就是當咱們的視口展現不下內容的時候,會經過滾動條的方式讓用戶滾動屏幕看到剩餘的內容。性能優化
better-scroll 也是同樣的原理,以下圖,能夠更直觀的來感覺一下:bash
綠色部分爲 wrapper,也就是父容器,它會有固定的高度。黃色部分爲 content,它是父容器的第一個子元素,它的高度會隨着內容的大小而撐高。那麼,當 content 的高度不超過父容器的高度,是不能滾動的,而它一旦超過了父容器的高度,咱們就能夠滾動內容區了,這就是 better-scroll 的滾動原理。app
注:在使用的時候外部容器的須要設置固定高度,還有一個問題須要設置overflow:hidden
,這是由於爲了隱藏超出部分。
有一點須要特別注意:滾動的元素只能是第一個容器的第一個元素框架
例如:dom
經過npm引入ide
安裝better-scroll函數
npm install better-scroll
oop
引入better-scroll
import BScroll from 'better-scroll'
若是不支持import
,請使用require
來引入
開始使用插件
DOM結構
<div class="wrapper">
<ul class="content">
<li>...</li>
<li>...</li>
...
</ul>
</div>
複製代碼
wrapper裏只能有一層元素,也就是須要滾動的元素,使用了better-scroll以後,會自動在content加上動畫的樣式。
<!-- 這種結構是不能夠滾動的 -->
<div class="wrapper">
<ul class="content">
...
</ul>
<ul class="content">
...
</ul>
</div>
<!-- 若是須要滾動的話加一層div包裹着兩個ul標籤 -->
複製代碼
wrapper必定須要指定高度,否則是沒法滾動的。 須要看系統使用的定位是absolute仍是flex,若是是flex是有默認的高度的,就不須要本身手動設置wrapper的高度。
注:父級bscroll必須有高度,而且overflow爲hidden;
插件使用
mounted(){
this.$nextTick(() => {
let bscrollDom = this.$refs.bscroll;
this.bscroll = new BScroll(bscrollDom,{ Option參數 }) //重點代碼
})
}
複製代碼
注:
1.插件初始化時須要具體元素,因此在DOM
結構中使用ref
標記元素(而後使用上面的代碼$refs
獲取元素),以備插件使用;
2.建議放在nextTick
方法裏面,避免DOM
結構未渲染完成,從而形成子元素bscroll-container
高度計算不許確;
3.建議使用this.bscroll
方式定義,以備在其餘方法中使用;
4.使用時必定要 new,使用時必定要 new,使用時必定要 new
重要的事情說三遍
例如:
let scroll = new BScroll(document.getElementById('wrapper'),{
probeType: 3
})
scroll.on('scroll', (pos) => {
console.log(pos.x + '~' + pos.y)
...
})
複製代碼
Events 列表
滾動到某個位置,x,y 表明座標,time 表示動畫時間,easing 表示緩動函數
例如:
let scroll = new BScroll(document.getElementById('wrapper'))
scroll.scrollTo(0, 500)
...
複製代碼
滾動到某個元素,el(必填)表示 dom 元素,time 表示動畫時間,offsetX 和 offsetY 表示座標偏移量,easing 表示緩動函數
強制 scroll 從新計算,當 better-scroll 中的元素髮生變化的時候調用此方法。
當 snap 爲 true 時,獲取滾動的當前頁,返回的對象結構爲 {x, y, pageX, pageY},其中 x,y 表明滾動橫向和縱向的位置;pageX,pageY 表示橫向和縱向的頁面索引
當 snap 爲 true,滾動到對應的頁面,x 表示橫向頁面索引,y 表示縱向頁面索引, time 表示動畫,easing 表示緩動函數
啓用 better-scroll,默認開啓
禁用 better-scroll
銷燬 better-scroll,解綁事件
當 DOM 結構發生變化的時候務必要調用refresh()確保滾動的效果正常,從新渲染高度
還有就是我上面寫的DOM層級關係,wrapper裏面必定不能存在多個同級的標籤
如下面dom結構爲例:
<div class="classifyTitle" ref="wrapper">
<ul>
<li v-for="(item,index) in classifyData.products">
<router-link :to="{name:'詳情'}">{{item.title}}</router-link>
</li>
</ul>
</div>
複製代碼
審查元素能夠看到:
這樣即添加成功的
只有content的高度大於wrapper高度時候,才能夠滾動。
如何看?
this.$nextTick(() => {
if (!this.scroll) {
this.scroll = new BScroll(this.$refs.wrapper, {})
console.log(this.scroll)
}
})
複製代碼
F12就能夠看到打印結果:
以上就是能夠滾動的狀況,wrapperHeight(616) < scrollHeight(750),hasVerticalScroll爲true;
若是這些數據不對,檢查是否dom沒有更新完就初始化BScroll了,要等dom更新完才能初始化
.wrapper元素上要給定位
position: absolute;
left: 0;
top: 0;
overflow: hidden;
複製代碼