在vue項目中運用better-scroll插件進行上拉加載的功能時,頁面拉不動。
html結構:
<div class="wrapper" ref="wrapper"> <ul class="now-film content"> <li class="now-film-item" v-for="(item, index) in now" @click="handleClick()"> <div class="now-film-item-img"> <img :src="item.poster.origin" alt=""> </div> <div class="now-film-item-tips"> <div class="now-film-item-tips-top"> <span>{{item.name}}</span> <span>{{item.grade}}</span> </div> <p class="now-film-item-tips-center">{{item.intro}}</p> <div class="now-film-item-tips-bottom"> <span>{{item.cinemaCount}}家影院上映</span> <span>{{item.watchCount}}人購票</span> </div> </div> </li> </ul> </div>
html結構沒問題
先看下瀏覽器滾動條生效的原理:
瀏覽器的滾動原理: 瀏覽器的滾動條大家都會遇到,當頁面內容的高度超過視口高度的時候,會出現縱向滾動條;當頁面內容的寬度超過視口寬度的時候,會出現橫向滾動條。也就是當我們的視口展示不下內容的時候,會通過滾動條的方式讓用戶滾動屏幕看到剩余的內容
失效原因:
其實better-scroll文檔已經說得很清楚了:當 content 的高度不超過父容器的高度,是不能滾動的,而它一旦超過了父容器(wrapper)的高度,我們就可以滾動內容區了
當把BScroll打印出來發現hasVerticalScroll屬性為false,則一定是wrapper和content計算高度時出錯了。此時,對比下scrollerHeight和wrapperHeight,多半是前者小於等於后者。然后,手動修改hasVerticalScroll為true,會發現可以拖拽,但不是滾動。這是因為scrollerHeight計算錯誤。
高度計算出錯多半是因為dom沒更新完就初始化BS。(BS必須在dom完成之后被初始化),但我這里的問題出在wrapper的高度等於content的高度,所以就不能滾動了
#app的height為100%
.header-wrapper高度固定
我當時.wrapper的高度也是100%,由於100%是相對於父元素的高度,但此時父元素.movie並沒有設置高度,所以父元素的高度等於子元素撐開的高度,由於.movie-tab也是固定高度,所以.wrapper的高度等於父元素的高度減去.movie-tab的高度,也就等於ul的高度,所以better-scroll不生效。
解決方案:
將.wrapper的父元素.movie的高度也設為100%,此時.movie的高度就等於#app的高度減去.header-wrapper的高度(頁面的剩余高度),那么.wrapper的高度也就等於頁面上可視的wrapper高度,高度就固定了
反思:
1、html和css基礎不夠扎實,百分比理解不夠透徹
2、解決該問題花了很長時間,其實發現還是自己百度或谷歌解決最快
延伸:
1、屏蔽滾動條的方法:出現滾動條是因為內容去大於包裹區,所以給包裹區加個overflow:hidden就行了
2、better-scroll插件的使用
(1)npm install better-scroll --save
(2)import BScroll from 'better-scroll'
(3)
mounted() { //第一個參數是滾動元素的外盒子 第二個參數是配置項 this.scroll = new BScroll(this.$refs.wrapper,{ click:true, pullUpLoad:true }) //當用戶上拉時觸發的事件 this.scroll.on("pullingUp",()=>{ this.handleNow_getNowMovie(++this.pageNum) }) }, updated () { //重新計算高度 this.scroll.refresh(); //當數據加載完畢以后通知better-scroll this.scroll.finishPullUp(); }
(4)
const actions = { handleNow({commit}, params) { if (params < 7) { axios({ method: 'get', url: '/v4/api/film/now-playing?page=' + params + '&count=7', }).then((res) => { commit('handleNow', res.data.data.films); console.log(res); }); } } }
(5)
const mutations = { handleNow(state, params) {
//防止后面的數據覆蓋前面的數據 state.now = [...state.now, ...params]; console.log(state.now); } }