精确计算微信小程序scrollview高度,全机型适配

众所周知,可以滑动的 scroll 组件在移动端非常的重要,几乎每个页面都要用到。

而小程序的 scroll-view 组件就比较坑了,非得指定一个高度才能正常使用。布局复杂的时候谁还给你算高度啊。。。

坑归坑,没办法,还是得用……既然官方要求必须传高度,那就想办法计算吧。

一、布局分析,推导公式

先给个示例图:

这是一个稍微复杂点的页面,最上面是两个 tab 标签,每个标签的页面是一个子组件。第二个子组件布局是上面一个标题,下面是 scroll-view

再画个解剖图吧……

页面分三部分,tab,title,scroll-view。不要忘了每个部分间还有 margin, 这里设置的是每个 margin 都是 10px

所以要计算 scroll-view 的高度可以得出下面 公式

scroll-view 的高度 = 页面可用高度 - tab高度 - title高度 - 10 - 10

为什么减两个 10 呢?上面说了 10margin 的距离,tabtitle10pxmargintitlescroll-view 也有 10pxmargin

需要注意的是计算用的单位都是 px,不是小程序的 rpx。因为下面调用接口获取可用屏幕高度时得到的就是 px

二、计算变量的高度

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构造器

三、在 wxml 使用计算的结果

计算完成后如何使用呢?

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

通过上面的方法使用。
注意:一定要在变量后面加上单位 px,不加的话会出错。

以上就是精确计算微信小程序scrollview高度的方法,从此再也不担心 scroll-view 高度错乱了!


作者正在写一个有趣的开源项目 coderiver,致力于打造全平台型全栈精品开源项目。

coderiver 中文名 河码,是一个为程序员和设计师提供项目协作的平台。无论你是前端、后端、移动端开发人员,或是设计师、产品经理,都可以在平台上发布项目,与志同道合的小伙伴一起协作完成项目。

coderiver 河码 类似程序员客栈,但主要目的是方便各细分领域人才之间技术交流,共同成长,多人协作完成项目。暂不涉及金钱交易。

计划做成包含 pc端(Vue、React)、移动H5(Vue、React)、ReactNative混合开发、Android原生、微信小程序、java后端的全平台型全栈项目,欢迎关注。

项目地址:https://github.com/cachecats/coderiver

您的鼓励是我前行最大的动力,欢迎点赞,欢迎送小星星✨ ~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_x阅读 15,968评论 3 119
  • 当你现在感到消费紧张,处于节制消费温饱的消费观,你就不能与哪些有优质消费和购物癖的人没有距离。你们的生活态度是不同的。
    杰科阅读 76评论 7 0
  • 作者:亚波罗 这事以后,有人告诉约瑟说:“你的父亲病了。”他就带着两个儿子玛拿西和以法莲同去。有人告诉雅各说:“请...
    恩典的泉源阅读 3,110评论 1 0
  • 这一段时间的写作训练,使我深刻的感受到什么叫做江郎才尽……唉!~真心感觉大脑都被掏空了,每天绞尽脑汁,搜肠刮肚,东...
    广电1702陈永凡阅读 474评论 1 0
  • 世态炎凉,无需迎合, 人情冷暖,勿去在意。 身在万物中,心在万物上。 活一回人生: 高又如何,低又如何; 得又如何...
    wxdl殇逝阅读 378评论 0 0