最近在寫的一個網頁由於是響應式,想弄一下上啦加載,下拉刷新這些,但是傳統網頁布局在手機上滑動時候有些卡,所以就使用betterScroll,這個betterScroll之前再寫一個網頁的時候也有用過,當時純粹是PC端網頁,然后也覺得配置項有些難弄,很難適配PC端的滾動事件,因為用鼠標滑動時,原生瀏覽器的滾動條並不會觸發,要觸發的話,可能得實時refresh一下,感覺很麻煩,認為移動端的這玩意弄到PC端就有點不兼容,所以就放棄了,最近在做畢業設計,沒辦法,想寫一個響應式的,在PC與手機上都需要滾動,所以用了這個玩意。
首先原理圖:

無非就是要在最外面弄一個div,設置一下具體高度,然后這個高度就是滾動的區域,往里面塞東西時,一旦子元素超出父元素定義好的具體高度時,就可以滾動了,原理很簡單,懂的都懂。
正文:
一、由編寫首頁時遇到的問題引發的思考:
因為我寫的是響應式的,所以要實時給wrapper設置一個具體的值,而且這個具體的值必須是依據瀏覽器一直在改變的,首先我想到是使用style,動態綁定元素,實時根據不同設備高度給它一個值,然而一開始語法寫錯了,害我另辟蹊徑,但是這個最開始的想法是對的:
下面這個例子就是讓這個窗口的可視區域為滾動區域,innerHeight就是除了瀏覽器高度以外的高度,
<div class="myRapper1" :style="{ height : deviceHeight + 'px' }" ref="myRapper">
<div class="content">
<slot name="myContent"></slot>
</div>
</div>
data() {
return {
scroll: null,
deviceHeight: 0
}
在mouted時:
this.$refs.myRapper.height = innerHeight ;
這樣在滾到底部時就沒問題了:

下面是仿真器下效果:

如果直接給外面wrapper具體高度,而不響應改變,下面就是這個效果:

好家伙一片空白,但是至少還可以看見全部內容,換個設備試一試:

還有一部分直接拉不出來。
下面是我想到的第二種,寫媒體查詢,根據不同設備,寫不同wrapper高度:
幾乎把主流的通信設備尺寸都寫下來了,但是根據不同設備,不同瀏覽器問題,還要自己減去瀏覽器的高度,而且不同瀏覽器的菜單高度又不一樣,這個配置還沒寫一半,腦袋就受不了了
/* @media screen and (min-device-height:320px) { .myRapper { height: 320px; } } @media screen and (min-device-height:533px) { .myRapper { height: 533px; } } @media screen and (min-device-height:568px){ .myRapper{ height:568px ; } } @media screen and (min-device-height:640px) { .myRapper { height: 640px; } } @media screen and (min-device-height:667px) { .myRapper { height: 667px; } } @media screen and (min-device-height:732px) { .myRapper { height: 732px; } } @media screen and (min-device-height:736px) { .myRapper { height: 736px; } } @media screen and (min-device-height:800px) { .myRapper { height: 800px; } } @media screen and (min-device-height:812px) { .myRapper { height: 812px; } } @media screen and (device-width:375px) { .myRapper { height: 812px; } } @media screen and (min-device-height:823px){ .myRapper{ height:823px ; } } @media screen and (min-device-height:854px) { .myRapper { height: 854px; } } @media screen and (min-device-height:900px) { .myRapper { height: 900px; } } @media screen and (min-device-height:950px) { .myRapper { height: 950px; } } @media screen and (min-device-height:960px) { .myRapper { height: 960px; } } @media screen and (min-device-height:1024px) { .myRapper { height: 1024px; } } @media screen and (min-device-height:1280px) { .myRapper { height: 1280px; } } @media screen and (min-device-height:1366px) { .myRapper { height: 625px; } } @media screen and (min-device-height:1366px)and(device-width:1024px) { .myRapper { height: 1366px; } } @media screen and (height:657px) { .myRapper { height: 657px; } } */
------------------------------------上面為第一次更,下次補上響應式百分比形式控制wrapper高度,因為首頁的我只是想讓它全部滾動,直接賦給wrapper可視區域高度了,突然想到,其實不用補上百分比形式了,直接innerHeight拿到可視區域高度后乘以一個小數,再綁定到wrapper的高度值上就好了。
最后附上betterScroll官網的地址,可以方便各位查詢:https://better-scroll.github.io/docs/zh-CN/,這個是中文文檔地址,但是你如果直接瀏覽器訪問會出現以下情況:

也不知道為什么……
但是你可以登錄碼雲搜索betterScroll,而不是GitHub,因為GitHub在中國網速訪問很慢:

然后點擊上面的第二個,下滑找到:


點擊這兩個都可以,版本1.x的api比較多,2.x是往1上面添加或者修改的對東西,具體怎么使用點擊進去就好了:
1.X官網

2.X官網

附上封裝的betterScroll:
<template>
<div class="myRapper1" :style="{ height : deviceHeight + 'px' }" ref="myRapper">
<div class="content">
<slot name="myContent"></slot>
</div>
</div>
</template>
<script>
import BScroll from 'better-scroll'
export default {
name: 'myScroll',
//滾動區域暫據可視窗口高度的倍數
props: {
Multiples:{
type: Number,
default: 1
},
//滾動是否開啟監聽,0表示不監聽,1間歇性監聽,2表示按下拇指時實時監聽,3,不管任何時刻都監聽,監聽開啟后,可以發出scroll事件,實時監控scroll實例對象的滾動狀態
probeType: {
type: Number,
default: 1
},
// 上啦加載是否開啟
pullUpLoad: {
type: Boolean,
default: false
},
//下拉刷新
pullDownRefresh: {
type: Boolean,
default: false
}
},
data() {
return {
scroll: null,
deviceHeight: 0
}
},
mounted() {
console.log("設備高"+this.deviceHeight)
this.deviceHeight = innerHeight*this.Multiples;//賦給滾動區域的wrapper高度值,由渲染時傳入,以便於檢測不同設備不同高度
// 創建scroll實例
this.scroll = new BScroll(this.$refs.myRapper, {
// 運用正則表達式阻止betterScroll會一些的一些元素標簽,具體使用看官網
preventDefaultException: {
tagName: /^(INPUT|TEXTAREA|BUTTON|SELECT|AUDIO)$/,
className: /(^|\S)(swiper-container|swiper-container1)(\S|$)/
},
scrollbar: { //開啟滾動條
fade: true,
interactive: false // 1.8.0 新增
},
//配置鼠標滾動,頁面控制
mouseWheel: {
speed: 20,
invert: false,
easeTime: 300
},
disableMouse: false, //啟用鼠標拖動
disableTouch: false, //啟用手指觸摸
//設置html傳統樣式可點擊
click: true,
//根據傳值絕對是否監聽滾動位置,0表示不監聽,1表示間斷性監聽,2表示拇指按下時時刻監聽(除慣性滾動),3表示每時每刻都監聽
probeType: this.probeType,
//根據傳值絕對是否上拉加載更多
pullUpLoad: this.pullUpLoad,
pullDownRefresh: this.pullDownRefresh
})
if (this.probeType === 2 || this.probeType === 3) {
// this.scroll.on是better內部的方法用來監聽內部鈎子(函數),
//此處監聽的是scroll,scroll函數滾動時觸發,根據probeType類型不同,有不同觸發效果
this.scroll.on('scroll', (position) => {
this.$emit('scroll', position)
})
};
//刷新上拉加載更多的高度
// this.scroll.refresh();
//監聽上拉加載更多,pullingUp屬性
//this.scroll.on是用來監聽better scroll里面的鈎子函數的執行的,如果監聽內部函數執行,則執行回調函數
// 如果有下拉加載,則提交pullingUp
if (this.pullUpLoad) {
this.scroll.on('pullingUp', () => {
// console.log('監聽滾到底部!');
// 通過this.$emit()提交到外面
this.$emit('pullingUp');
})
}
// 如果有下拉加載,則提交pullingUp
if (this.pullDownRefresh) {
this.scroll.on('pullingDown', () => {
// console.log('監聽滾到底部!');
// 通過this.$emit()提交到外面
// this.scroll.refresh();
this.$emit('pullingDown');
})
}
},
methods: {
scrollTo(x, y, time = 500) {
this.scroll.scrollTo(x, y, time)
},
// 滾動到底部時上啦時,父組件調用此函數通知子組件完成上啦操作,才能繼續使用pullingUp監聽滾到頂部
finishPullUp() {
this.scroll.finishPullUp()
},
// 滾動到頂部下拉時,父組件調用此函數通知子組件已經完成下拉操作,才能繼續使用pullingDown監聽滾到底部
finishPullDown() {
this.scroll.finishPullDown()
},
refresh() {
this.scroll.refresh();
// console.log('您調用了better-scroll的refresh')
}
},
}
</script>
<style>
.myRapper1{
}
</style>
父組件使用子組件封裝好的betterScroll:
//pullUpLoad等於true,就是開啟監聽上啦加載事件,其他的以此類推,看不懂的可以看官網屬性值配置項那些
<Scroll ref="brief_scroll" @scroll="listen_briefScroll" :probeType="2" :pullUpLoad="true" :pullDownRefresh="true" :Multiples="1" @pullingUp="loadMore_down" @pullingDown="fresh_up"> <div slot="myContent"> 插入子元素,比父元素高時,就可以滾動 </div> </Scroll>
