0

0

uniapp怎么获取dom高度不准确

PHPz

PHPz

发布时间:2023-04-27 09:08:02

|

3866人浏览过

|

来源于php中文网

原创

前言

在使用 uniapp 开发小程序过程中,我们经常会遇到需要获取 DOM 元素高度的情况。但是,有时候我们会发现通过 uni.createSelectorQuery().select().boundingClientRect() 获取到的高度并不准确。那么这种情况是怎么出现的?又该如何解决呢?本文将为大家详细讲解。

问题出现

首先,我们先来复现一下问题。如下面这个简单的模板,我们需要获取子元素 content 的高度。

我们可以通过以下方式获取 content 元素的高度:

mounted() {
  uni.createSelectorQuery().in(this).select('.content').boundingClientRect(rect => {
    console.log(rect.height)
  }).exec()
}

这样我们就可以在控制台里看到 content 的高度。

但是,当我们给 content 元素加上一些样式,比如:

.content {
  margin: 10px; 
  padding: 20px;
}

再次运行程序,我们会发现控制台输出的高度与我们预期的高度不一致,略小于我们期望的高度。这就是我们经常遇到的“获取 DOM 高度不准确”的问题。

原因分析

那么,问题出现的原因是什么呢?在经过查阅资料后,我们可以得知以下原因:

1.单独使用这个样式会导致高度计算错误,产生白边。

2.这是因为 marginpadding 对于元素占据的空间是不一样的,margin 是不占据空间的,而 padding 是占据空间的。

千问APP
千问APP

阿里最强大模型官方AI助手

下载

由于 boundingClientRect 受到了 paddingborder 的影响,而 margin 不受影响,所以在 boundingClientRect 获取的高度时会少去 padding 的高度。

解决方案

既然掌握了问题出现的原因,解决方案也就呼之欲出了。我们可以通过以下方法来解决这个问题:

1.通过 uni.createSelectorQuery().exec() 获取父元素的高度,再通过 getComputedStyle 获取子元素的 paddingborder,从而计算出子元素的实际高度。

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.通过给子元素和父元素都加上 box-sizing:border-box 样式来解决问题。

.container,
.content {
  box-sizing: border-box;
  margin: 10px;
  padding: 20px;
}

这里我们需要注意两点:

(1)box-sizing 样式需要加在两个元素身上。

(2)需要注意子元素和父元素之间的间隔是否有误。

结语

通过以上方法,我们可以解决 uniapp 获取 DOM 高度不准确的问题。请大家根据具体情况选择使用,希望本文能够对大家有所帮助。

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

3061

2024.08.14

margin在css中是啥意思
margin在css中是啥意思

在CSS中,margin是一个用于设置元素外边距的属性。想了解更多margin的相关内容,可以阅读本专题下面的文章。

431

2023.12.18

css中的padding属性作用
css中的padding属性作用

在CSS中,padding属性用于设置元素的内边距。想了解更多padding的相关内容,可以阅读本专题下面的文章。

133

2023.12.07

html边框设置教程
html边框设置教程

本教程将带你全面掌握HTML/CSS边框设置,从基础的border属性讲起,涵盖所有边框样式、圆角设置及高级技巧,帮助你快速上手实现各种边框效果。

32

2025.09.02

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

3

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

41

2026.01.18

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

101

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

148

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

57

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号