精確計(jì)算微信小程序scrollview高度,全機(jī)型適配

眾所周知僧叉,可以滑動(dòng)的 scroll 組件在移動(dòng)端非常的重要奕枝,幾乎每個(gè)頁面都要用到。

而小程序的 scroll-view 組件就比較坑了瓶堕,非得指定一個(gè)高度才能正常使用倍权。布局復(fù)雜的時(shí)候誰還給你算高度啊。。薄声。

坑歸坑,沒辦法题画,還是得用……既然官方要求必須傳高度默辨,那就想辦法計(jì)算吧。

一苍息、布局分析缩幸,推導(dǎo)公式

先給個(gè)示例圖:

這是一個(gè)稍微復(fù)雜點(diǎn)的頁面,最上面是兩個(gè) tab 標(biāo)簽竞思,每個(gè)標(biāo)簽的頁面是一個(gè)子組件表谊。第二個(gè)子組件布局是上面一個(gè)標(biāo)題,下面是 scroll-view 盖喷。

再畫個(gè)解剖圖吧……

頁面分三部分爆办,tab,title课梳,scroll-view距辆。不要忘了每個(gè)部分間還有 margin, 這里設(shè)置的是每個(gè) margin 都是 10px

所以要計(jì)算 scroll-view 的高度可以得出下面 公式

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

為什么減兩個(gè) 10 呢暮刃?上面說了 10margin 的距離跨算,tabtitle10pxmargintitlescroll-view 也有 10pxmargin椭懊。

需要注意的是計(jì)算用的單位都是 px诸蚕,不是小程序的 rpx。因?yàn)橄旅嬲{(diào)用接口獲取可用屏幕高度時(shí)得到的就是 px 氧猬。

二背犯、計(jì)算變量的高度

2.1 計(jì)算單個(gè)節(jié)點(diǎn)高度

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

這里需要計(jì)算的就是 頁面可用高度 和 title 的高度媳板,因?yàn)闉榱撕唵?tab 的高度是寫死的 50px, 當(dāng)然不寫死也沒關(guān)系,在父組件中計(jì)算 tab 的高度傳給子組件就好泉哈。

下面正式開始計(jì)算

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

這里主要是通過小程序封裝的 API 來計(jì)算的蛉幸。

wx.getSystemInfoSync() 可以得到設(shè)備的各種信息,關(guān)于高度的參數(shù)有兩個(gè)丛晦,一個(gè)是屏幕高度 screenHeight奕纫,一個(gè)是可使用窗口高度 windowHeight。注意計(jì)算的時(shí)候要用 windowHeight烫沙,這樣算出來的高度才是對(duì)的匹层。screenHeight是手機(jī)的屏幕高度,包含了手機(jī)的狀態(tài)欄和小程序標(biāo)題欄。

有了可用屏幕高度升筏,還需要元素的高度撑柔。計(jì)算元素高度小程序也提供了 API,參見 WXML節(jié)點(diǎn)信息API您访。

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

let query = wx.createSelectorQuery().in(this)
query.select('.title').boundingClientRect(function(res) {
    //在這里做計(jì)算,res里有需要的數(shù)據(jù)
}).exec()

注意在組件 component 里使用的話灵汪,要用 wx.createSelectorQuery().in(this) 檀训,將選擇器的選取范圍更改為自定義組件component內(nèi)。(初始時(shí)享言,選擇器僅選取頁面范圍的節(jié)點(diǎn)峻凫,不會(huì)選取任何自定義組件中的節(jié)點(diǎn)。)

如果想同時(shí)測量多個(gè)節(jié)點(diǎn)的高度呢览露?

2.2 計(jì)算多個(gè)節(jié)點(diǎn)高度

能計(jì)算單個(gè)當(dāng)然也能同時(shí)計(jì)算多個(gè)荧琼。如下:

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})
  })
},

有幾個(gè)節(jié)點(diǎn)就寫幾個(gè) query.select('.search').boundingClientRect(), 然后調(diào)用 query.exec() 執(zhí)行操作獲取節(jié)點(diǎn)信息的數(shù)組肛循。

注意: 調(diào)用封裝好的 computeScrollViewHeight() 的時(shí)機(jī)是在生命周期函數(shù)的 ready() 中铭腕,不能在 created(),否則取不到數(shù)據(jù)多糠。

參見 Component構(gòu)造器

三累舷、在 wxml 使用計(jì)算的結(jié)果

計(jì)算完成后如何使用呢?

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

通過上面的方法使用。
注意:一定要在變量后面加上單位 px,不加的話會(huì)出錯(cuò)炸枣。

以上就是精確計(jì)算微信小程序scrollview高度的方法,從此再也不擔(dān)心 scroll-view 高度錯(cuò)亂了只怎!


作者正在寫一個(gè)有趣的開源項(xiàng)目 coderiver,致力于打造全平臺(tái)型全棧精品開源項(xiàng)目怜俐。

coderiver 中文名 河碼身堡,是一個(gè)為程序員和設(shè)計(jì)師提供項(xiàng)目協(xié)作的平臺(tái)。無論你是前端拍鲤、后端贴谎、移動(dòng)端開發(fā)人員,或是設(shè)計(jì)師季稳、產(chǎn)品經(jīng)理擅这,都可以在平臺(tái)上發(fā)布項(xiàng)目,與志同道合的小伙伴一起協(xié)作完成項(xiàng)目景鼠。

coderiver 河碼 類似程序員客棧仲翎,但主要目的是方便各細(xì)分領(lǐng)域人才之間技術(shù)交流,共同成長,多人協(xié)作完成項(xiàng)目溯香。暫不涉及金錢交易鲫构。

計(jì)劃做成包含 pc端(Vue、React)玫坛、移動(dòng)H5(Vue芬迄、React)、ReactNative混合開發(fā)昂秃、Android原生、微信小程序杜窄、java后端的全平臺(tái)型全棧項(xiàng)目肠骆,歡迎關(guān)注。

項(xiàng)目地址:https://github.com/cachecats/coderiver

您的鼓勵(lì)是我前行最大的動(dòng)力塞耕,歡迎點(diǎn)贊蚀腿,歡迎送小星星? ~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市扫外,隨后出現(xiàn)的幾起案子莉钙,更是在濱河造成了極大的恐慌,老刑警劉巖筛谚,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磁玉,死亡現(xiàn)場離奇詭異,居然都是意外死亡驾讲,警方通過查閱死者的電腦和手機(jī)蚊伞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吮铭,“玉大人时迫,你說我怎么就攤上這事∥缴危” “怎么了掠拳?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纸肉。 經(jīng)常有香客問我溺欧,道長,這世上最難降的妖魔是什么毁靶? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任胧奔,我火速辦了婚禮,結(jié)果婚禮上预吆,老公的妹妹穿的比我還像新娘龙填。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布岩遗。 她就那樣靜靜地躺著扇商,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宿礁。 梳的紋絲不亂的頭發(fā)上案铺,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音梆靖,去河邊找鬼控汉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛返吻,可吹牛的內(nèi)容都是我干的姑子。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼测僵,長吁一口氣:“原來是場噩夢啊……” “哼街佑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捍靠,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤沐旨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后榨婆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磁携,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年纲辽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颜武。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拖吼,死狀恐怖鳞上,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吊档,我是刑警寧澤篙议,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站怠硼,受9級(jí)特大地震影響鬼贱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜香璃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一这难、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葡秒,春花似錦姻乓、人聲如沸嵌溢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赖草。三九已至,卻和暖如春剪个,著一層夾襖步出監(jiān)牢的瞬間秧骑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工扣囊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乎折,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓侵歇,卻偏偏與公主長得像笆檀,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盒至,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,982評(píng)論 3 119
  • 當(dāng)你現(xiàn)在感到消費(fèi)緊張士修,處于節(jié)制消費(fèi)溫飽的消費(fèi)觀枷遂,你就不能與哪些有優(yōu)質(zhì)消費(fèi)和購物癖的人沒有距離。你們的生活態(tài)度是不同的棋嘲。
    杰科閱讀 80評(píng)論 7 0
  • 作者:亞波羅 這事以后酒唉,有人告訴約瑟說:“你的父親病了》幸疲”他就帶著兩個(gè)兒子瑪拿西和以法蓮?fù)セ韭住S腥烁嬖V雅各說:“請(qǐng)...
    恩典的泉源閱讀 3,280評(píng)論 1 0
  • 這一段時(shí)間的寫作訓(xùn)練,使我深刻的感受到什么叫做江郎才盡……唉雹锣!~真心感覺大腦都被掏空了网沾,每天絞盡腦汁,搜腸刮肚蕊爵,東...
    廣電1702陳永凡閱讀 478評(píng)論 1 0
  • 世態(tài)炎涼攒射,無需迎合醋旦, 人情冷暖,勿去在意会放。 身在萬物中饲齐,心在萬物上。 活一回人生: 高又如何咧最,低又如何; 得又如何...
    wxdl殤逝閱讀 383評(píng)論 0 0