better-scroll是一個頁面滾動插件,用它能夠很方便的實現下拉刷新,錨點滾動等功能。javascript
實現原理:父容器固定高度,並設置overflow:hidden,子元素超出父元素高度後將被隱藏,超出部分可滾動且沒有滾動條。vue
<body> <div id="wrapper"> <ul> <li>...</li> <li>...</li> ... </ul> </div> <script type="text/javascript" src="better-scroll.js"></script> <script type="text/javascript"> new BScroll(document.getElementById('wrapper')); </script> </body>
npm install better-scrolljava
import BScroll from 'better-scroll'git
var BScroll = github
npm
<div id="wrapper" ref="wrapper"> <ul class="container"> <li>...</li> <li>...</li> ... </ul> </div>
app
_initScroll() { this.boxScroll= new BScroll(this.$refs.wrapper, { click: true }) },
注意:dom
better-scroll會將點擊事件去掉,若是滾動部分須要有點擊事件,須要在參數里加上click:true。異步
同時,在PC上或某些手機端,因爲未成功將touchend事件move掉,點擊事件會執行兩次。函數
better-scroll派發的event事件和原生js的event有屬性上的區別,其中有一個屬性爲event._constructed。better-scroll派發的事件中event._constructed爲true,原生點擊事件中沒有這個屬性。
selectList(index,event){ if(!event._constructed){//若是不存在這個屬性,則爲原生點擊事件,不執行下面的函數 return } }
因爲vue中數據更新是異步的,在dom解構沒有加載完成,BScroll沒法獲取目標容器的高度,會出現沒法滾動的現象。
vue中有一個方法能夠解決這個問題:$nextTick()
根據官方API的解釋可知,一些須要在頁面數據變化完成後才執行的函數須要寫在$nextTick中 。
this.$nextTick(() => { this._initScroll() })
參考網站:
https://www.npmjs.com/package/better-scroll better-scroll文檔
https://github.com/ustbhuangyi/better-scroll github