vue之頁面滾動,輪播圖
better-scroll
better-scroll 是一個移動端滾動的解決方案,它是基於 iscroll 的重寫,它和 iscroll 的主要區別在這裏。
better-scroll 也很強大,不只能夠作普通的滾動列表,還能夠作輪播圖、picker 等等。
常見html結構html
<div class="wrapper">
<ul class="content">
<li>...</li>
<li>...</li>
...
</ul>
</div>
能夠參考以下圖vue
綠色部分爲wrapper,也就是父容器,他會有固定的高度。黃色部分爲content,他是父容器的第一個子元素,它的高度會隨着內容的大小而撐高。那麼,當content的高度不超過父容器的高度,是不能滾動的,而它一旦超過了父容器的高度,咱們能夠滾動內容區,這就是better-scroll的滾動原理。git
那麼,如何初始化better-scroll?若是是上述html結構,那麼初始化代碼以下:github
import BScroll from 'better-scroll' let wrapper = document.querySelector('.wrapper') let scroll = new BScroll(wrapper, {})
better-scroll 對外暴露了一個 BScroll 的類,咱們初始化只須要 new 一個類的實例便可。第一個參數就是咱們 wrapper 的 DOM 對象,第二個是一些配置參數,
better-scroll 的初始化時機很重要,由於它在初始化的時候,會計算父元素和子元素的高度和寬度,來決定是否能夠縱向和橫向滾動。所以,咱們在初始化它的時候,必須確保父元素和子元素的內容已經正確渲染了。若是子元素或者父元素 DOM 結構發生改變的時候,必須從新調用 scroll.refresh() 方法從新計算來確保滾動效果的正常。因此同窗們反饋的 better-scroll 不能滾動的緣由多半是初始化 better-scroll 的時機不對,或者是當 DOM 結構發送變化的時候並無從新計算 better-scroll。
在vue中使用方法以下:瀏覽器
<template> <div class="wrapper" ref="wrapper"> <ul class="content"> <li>...</li> <li>...</li> ... </ul> </div> </template> <script> import BScroll from 'better-scroll' export default { mounted() { this.$nextTick(() => { this.scroll = new Bscroll(this.$refs.wrapper, {}) }) } } </script>
Vue.js 提供了咱們一個獲取 DOM 對象的接口—— vm.$refs
。在這裏,咱們經過了 this.$refs.wrapper
訪問到了這個 DOM 對象,而且咱們在 mounted 這個鉤子函數裏,this.$nextTick
的回調函數中初始化 better-scroll 。由於這個時候,wrapper 的 DOM 已經渲染了,咱們能夠正確計算它以及它內層 content 的高度,以確保滾動正常。app
這裏的 this.$nextTick
是一個異步函數,爲了確保 DOM 已經渲染,感興趣的同窗能夠了解一下它的內部實現細節,底層用到了 MutationObserver 或者是 setTimeout(fn, 0)
。其實咱們在這裏把 this.$nextTick
替換成 setTimeout(fn, 20)
也是能夠的(20 ms 是一個經驗值,每個 Tick 約爲 17 ms),對用戶體驗而言都是無感知的。異步
做者:ustbhuangyi
連接:https://www.imooc.com/article/18232
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合做
Vue.js 提供了咱們一個獲取 DOM 對象的接口—— vm.$refs。在這裏,咱們經過了 this.$refs.wrapper 訪問到了這個 DOM 對象,而且咱們在 mounted 這個鉤子函數裏,this.$nextTick 的回調函數中初始化 better-scroll 。由於這個時候,wrapper 的 DOM 已經渲染了,咱們能夠正確計算它以及它內層 content 的高度,以確保滾動正常。
這裏的 this.$nextTick 是一個異步函數,爲了確保 DOM 已經渲染,底層用到了 MutationObserver 或者是 setTimeout(fn, 0)。其實咱們在這裏把 this.$nextTick 替換成 setTimeout(fn, 20) 也是能夠的(20 ms 是一個經驗值,每個 Tick 約爲 17 ms),對用戶體驗而言都是無感知的。函數
用到的屬性:
probeType
類型:Number 默認值:0 可選值:1、2、3 做用:有時候咱們須要知道滾動的位置。
當 probeType 爲 1 的時候,會非實時(屏幕滑動超過必定時間後)派發scroll 事件;
當 probeType 爲 2 的時候,會在屏幕滑動的過程當中實時的派發 scroll 事件;
當 probeType 爲 3 的時候,不只在屏幕滑動的過程當中,並且在 momentum 滾動動畫運行過程當中實時派發 scroll 事件。
click
類型:Boolean 默認值:false 做用:better-scroll 默認會阻止瀏覽器的原生 click 事件。
當設置爲 true,better-scroll 會派發一個 click 事件,
咱們會給派發的 event 參數加一個私有屬性 _constructed,值爲 true。
可是自定義的 click 事件會阻止一些原生組件的行爲,如 checkbox 的選中等,
因此一旦滾動列表中有一些原生表單組件,推薦的作法是監聽 tap 事件,以下。
better-scroll 對外暴露了一個 BScroll 的類,咱們初始化只須要 new 一個類的實例便可。第一個參數就是咱們 wrapper 的 DOM 對象,第二個是一些配置參數,
做者:ustbhuangyi
連接:https://www.imooc.com/動畫
article/18232
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合做this
做者:ustbhuangyi
連接:https://www.imooc.com/article/18232
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合做
做者:ustbhuangyi
連接:https://www.imooc.com/article/18232
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合做
做者:ustbhuangyi
連接:https://www.imooc.com/article/18232
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合做
做者:ustbhuangyi
連接:https://www.imooc.com/article/18232
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合做
做者:ustbhuangyi
連接:https://www.imooc.com/article/18232
來源:慕課網
本文原創發佈於慕課網 ,轉載請註明出處,謝謝合做