精確計算微信小程序scrollview高度,全機型適配

衆所周知,能夠滑動的 scroll 組件在移動端很是的重要,幾乎每一個頁面都要用到。html

而小程序的 scroll-view 組件就比較坑了,非得指定一個高度才能正常使用。佈局複雜的時候誰還給你算高度啊。。。node

坑歸坑,沒辦法,仍是得用……既然官方要求必須傳高度,那就想辦法計算吧。小程序

1、佈局分析,推導公式

先給個示例圖:微信小程序

這是一個稍微複雜點的頁面,最上面是兩個 tab 標籤,每一個標籤的頁面是一個子組件。第二個子組件佈局是上面一個標題,下面是 scroll-viewapi

再畫個解剖圖吧……數組

頁面分三部分,tab,title,scroll-view。不要忘了每一個部分間還有 margin, 這裏設置的是每一個 margin 都是 10pxbash

因此要計算 scroll-view 的高度能夠得出下面 公式微信

scroll-view 的高度 = 頁面可用高度 - tab高度 - title高度 - 10 - 10
複製代碼

爲何減兩個 10 呢?上面說了 10margin 的距離,tabtitle10pxmargintitlescroll-view 也有 10pxmarginapp

須要注意的是計算用的單位都是 px,不是小程序的 rpx。由於下面調用接口獲取可用屏幕高度時獲得的就是 px函數

2、計算變量的高度

2.1 計算單個節點高度

上面的公式中的變量有:頁面可用高度, title 的高度,tab 的高度。

這裏須要計算的就是 頁面可用高度 和 title 的高度,由於爲了簡單 tab 的高度是寫死的 50px, 固然不寫死也不要緊,在父組件中計算 tab 的高度傳給子組件就好。

下面正式開始計算

//計算 scroll-view 的高度
computeScrollViewHeight() {
  let that = this
  let query = wx.createSelectorQuery().in(this)
  query.select('.title').boundingClientRect(function(res) {
    //獲得標題的高度
    let titleHeight = res.height
    //scroll-view的高度 = 屏幕高度- tab高(50) - 10 - 10 - titleHeight
    //獲取屏幕可用高度
    let screenHeight = wx.getSystemInfoSync().windowHeight
    //計算 scroll-view 的高度
    let scrollHeight = screenHeight - titleHeight - 70
    that.setData({
      scrollHeight: scrollHeight
    })
  }).exec()
},
複製代碼

這裏主要是經過小程序封裝的 API 來計算的。

wx.getSystemInfoSync() 能夠獲得設備的各類信息,關於高度的參數有兩個,一個是屏幕高度 screenHeight,一個是可以使用窗口高度 windowHeight。注意計算的時候要用 windowHeight,這樣算出來的高度纔是對的。screenHeight是手機的屏幕高度,包含了手機的狀態欄和小程序標題欄。

有了可用屏幕高度,還須要元素的高度。計算元素高度小程序也提供了 API,參見 WXML節點信息API

具體用法看文檔就行了,精簡的使用步驟就是:

let query = wx.createSelectorQuery().in(this)
query.select('.title').boundingClientRect(function(res) {
    //在這裏作計算,res裏有須要的數據
}).exec()
複製代碼

注意在組件 component 裏使用的話,要用 wx.createSelectorQuery().in(this) ,將選擇器的選取範圍更改成自定義組件component內。(初始時,選擇器僅選取頁面範圍的節點,不會選取任何自定義組件中的節點。)

若是想同時測量多個節點的高度呢?

2.2 計算多個節點高度

能計算單個固然也能同時計算多個。以下:

computeScrollViewHeight() {
  let that = this
  let query = wx.createSelectorQuery().in(this)
  query.select('.search').boundingClientRect()
  query.select('.title-wrapper').boundingClientRect()
  query.exec(res => {
    let searchHeight = res[0].height
    let titleHeight = res[1].height
    let windowHeight = wx.getSystemInfoSync().windowHeight
    let scrollHeight = windowHeight - searchHeight - titleHeight - 30 - 5 - 50 
    this.setData({ scrollHeight: scrollHeight})
  })
},
複製代碼

有幾個節點就寫幾個 query.select('.search').boundingClientRect(), 而後調用 query.exec() 執行操做獲取節點信息的數組。

注意: 調用封裝好的 computeScrollViewHeight() 的時機是在生命週期函數的 ready() 中,不能在 created(),不然取不到數據。

參見 Component構造器

3、在 wxml 使用計算的結果

計算完成後如何使用呢?

<scroll-view scroll-y style='height: {{scrollHeight + "px"}}'></<scroll-view>
複製代碼

經過上面的方法使用。
注意:必定要在變量後面加上單位 px,不加的話會出錯。

以上就是精確計算微信小程序scrollview高度的方法,今後不再擔憂 scroll-view 高度錯亂了!

相關文章
相關標籤/搜索