众所周知,能够滑动的 scroll
组件在移动端很是的重要,几乎每一个页面都要用到。html
而小程序的 scroll-view
组件就比较坑了,非得指定一个高度才能正常使用。布局复杂的时候谁还给你算高度啊。。。node
坑归坑,没办法,仍是得用……既然官方要求必须传高度,那就想办法计算吧。小程序
先给个示例图:微信小程序
这是一个稍微复杂点的页面,最上面是两个 tab
标签,每一个标签的页面是一个子组件。第二个子组件布局是上面一个标题,下面是 scroll-view
。api
再画个解剖图吧……数组
页面分三部分,tab,title,scroll-view。不要忘了每一个部分间还有 margin
, 这里设置的是每一个 margin
都是 10px
。bash
因此要计算 scroll-view
的高度能够得出下面 公式:微信
scroll-view 的高度 = 页面可用高度 - tab高度 - title高度 - 10 - 10
复制代码
为何减两个 10
呢?上面说了 10
是 margin
的距离,tab
与 title
有 10px
的margin
,title
与 scroll-view
也有 10px
的 margin
。app
须要注意的是计算用的单位都是 px
,不是小程序的 rpx
。由于下面调用接口获取可用屏幕高度时获得的就是 px
。函数
上面的公式中的变量有:页面可用高度, 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内。(初始时,选择器仅选取页面范围的节点,不会选取任何自定义组件中的节点。)
若是想同时测量多个节点的高度呢?
能计算单个固然也能同时计算多个。以下:
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构造器
计算完成后如何使用呢?
<scroll-view scroll-y style='height: {{scrollHeight + "px"}}'></<scroll-view>
复制代码
经过上面的方法使用。
注意:必定要在变量后面加上单位 px
,不加的话会出错。
以上就是精确计算微信小程序scrollview高度的方法,今后不再担忧 scroll-view
高度错乱了!