Preface
In the process of developing small programs using uniapp, we often encounter situations where we need to obtain the height of DOM elements. However, sometimes we find that the height obtained through uni.createSelectorQuery().select().boundingClientRect() is not accurate. So how did this situation arise? How to solve it? This article will explain it to you in detail.
The problem occurs
First, let’s reproduce the problem. For example, in the simple template below, we need to get the height of the child element content
.
<template> <view class="container"> <view class="content" ref="content">内容区域</view> </view> </template>
We can get the height of the content
element in the following way:
mounted() { uni.createSelectorQuery().in(this).select('.content').boundingClientRect(rect => { console.log(rect.height) }).exec() }
So we can see the height of content
in the console .
However, when we add some styles to the content
element, such as:
.content { margin: 10px; padding: 20px; }
Run the program again, we will find that the height of the console output is the height we expected. Inconsistent and slightly less than we expected. This is the problem of "inaccurate acquisition of DOM height" that we often encounter.
Cause Analysis
So, what is the cause of the problem? After reviewing the information, we can learn the following reasons:
1. Using this style alone will cause height calculation errors and produce white edges.
2. This is because margin
and padding
occupy different spaces for elements. margin
does not occupy space, but padding
takes up space.
Since boundingClientRect
is affected by padding
and border
, but margin
is not affected, so in boundingClientRect
will reduce the height of padding
when obtaining the height.
Solution
Now that we have grasped the cause of the problem, the solution is ready to come out. We can solve this problem through the following methods:
1. Get the height of the parent element through uni.createSelectorQuery().exec()
, and then get it through getComputedStyle
The padding
and border
of the child element are used to calculate the actual height of the child element.
mounted() { uni.createSelectorQuery().in(this).select('.container').boundingClientRect(rect => { const styles = getComputedStyle(this.$refs.content.$el) const paddingTop = parseInt(styles.paddingTop) const paddingBottom = parseInt(styles.paddingBottom) const borderTop = parseInt(styles.borderTopWidth) const borderBottom = parseInt(styles.borderBottomWidth) console.log(rect.height - paddingTop - paddingBottom - borderTop - borderBottom) }).exec() }
2. Solve the problem by adding the box-sizing:border-box
style to both the child element and the parent element.
.container, .content { box-sizing: border-box; margin: 10px; padding: 20px; }
We need to pay attention to two points here:
(1) box-sizing
The style needs to be added to two elements.
(2) It is necessary to pay attention to whether the interval between the child element and the parent element is incorrect.
Conclusion
Through the above methods, we can solve the problem of high inaccuracy in obtaining DOM by uniapp. Please choose to use it according to your specific situation. I hope this article can be helpful to you.
The above is the detailed content of How to get the dom height in uniapp is inaccurate. For more information, please follow other related articles on the PHP Chinese website!