Maison interface Web uni-app Comment obtenir la hauteur du dom dans uniapp est inexact

Comment obtenir la hauteur du dom dans uniapp est inexact

Apr 27, 2023 am 09:08 AM

Avant-propos

Dans le processus de développement de petits programmes à l'aide d'uniapp, nous rencontrons souvent des situations où nous devons obtenir la hauteur des éléments du DOM. Cependant, nous constatons parfois que la hauteur obtenue via uni.createSelectorQuery().select().boundingClientRect() n'est pas exacte. Alors comment cette situation est-elle née ? Comment le résoudre ? Cet article vous l’expliquera en détail.

Un problème survient

Tout d’abord, reproduisons le problème. Par exemple, dans le modèle simple ci-dessous, nous devons obtenir la hauteur de l'élément enfant content. content 的高度。

<template>
  <view class="container">
    <view class="content" ref="content">内容区域</view>
  </view>
</template>
Copier après la connexion

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

mounted() {
  uni.createSelectorQuery().in(this).select('.content').boundingClientRect(rect => {
    console.log(rect.height)
  }).exec()
}
Copier après la connexion

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

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

.content {
  margin: 10px; 
  padding: 20px;
}
Copier après la connexion

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

原因分析

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

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

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

由于 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()
}
Copier après la connexion

2.通过给子元素和父元素都加上 box-sizing:border-box 样式来解决问题。

.container,
.content {
  box-sizing: border-box;
  margin: 10px;
  padding: 20px;
}
Copier après la connexion

这里我们需要注意两点:

(1)box-sizingrrreee

Nous pouvons obtenir la hauteur de l'élément content de la manière suivante :

rrreee

Nous pouvons donc voir la hauteur de content dans la console.

Cependant, lorsque nous ajoutons des styles à l'élément content, tels que :

rrreee

Exécutez à nouveau le programme, nous constaterons que la hauteur de la sortie de la console n'est pas cohérente avec la hauteur attendue, légèrement plus petit que ce à quoi nous nous attendions. C'est le problème de « l'acquisition imprécise de la hauteur du DOM » que l'on rencontre souvent. 🎜🎜Analyse des causes🎜🎜Alors, quelle est la cause du problème ? Après avoir examiné les données, nous pouvons découvrir les raisons suivantes : 🎜🎜1. L'utilisation de ce style seul entraînera des erreurs de calcul de hauteur et des bords blancs. 🎜🎜2. En effet, margin et padding occupent des espaces différents pour les éléments margin n'occupent pas d'espace, tandis que paddingcode> prend de la place. 🎜🎜Puisque <code>boundingClientRect est affecté par padding et border, mais margin n'est pas affecté, donc dans boundingClientRect sera inférieure à la hauteur de padding. 🎜🎜Solution🎜🎜Maintenant que nous avons compris la cause du problème, la solution est prête à sortir. Nous pouvons résoudre ce problème grâce aux méthodes suivantes : 🎜🎜1. Obtenez la hauteur de l'élément parent via uni.createSelectorQuery().exec(), puis récupérez l'élément enfant via getComputedStyle. padding et border pour calculer la hauteur réelle de l'élément enfant. 🎜rrreee🎜2. Résolvez le problème en ajoutant le style box-sizing:border-box à la fois à l'élément enfant et à l'élément parent. 🎜rrreee🎜Nous devons prêter attention à deux points ici : 🎜🎜 (1) Le style box-sizing doit être ajouté à deux éléments. 🎜🎜(2) Vous devez faire attention à savoir si l'intervalle entre l'élément enfant et l'élément parent est incorrect. 🎜🎜Conclusion🎜🎜Grâce aux méthodes ci-dessus, nous pouvons résoudre le problème de la grande inexactitude dans l'obtention du DOM par uniapp. Veuillez choisir de l'utiliser en fonction de votre situation spécifique. J'espère que cet article pourra vous être utile. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser des préprocesseurs (Sass, moins) avec Uni-App? Comment utiliser des préprocesseurs (Sass, moins) avec Uni-App? Mar 18, 2025 pm 12:20 PM

L'article discute de l'utilisation de SASS et moins de préprocesseurs dans UNI-APP, de la configuration de détail, des avantages sociaux et de la double utilisation. L'accent principal est sur la configuration et les avantages. [159 caractères]

Comment utiliser l'API d'animation Uni-App? Comment utiliser l'API d'animation Uni-App? Mar 18, 2025 pm 12:21 PM

L'article explique comment utiliser l'API d'animation d'Uni-App, détaillant les étapes pour créer et appliquer des animations, des fonctions clés et des méthodes pour combiner et contrôler la synchronisation de l'animation. Count de chargement: 159

Quels sont les différents types de tests que vous pouvez effectuer dans une application UNIAPP? Quels sont les différents types de tests que vous pouvez effectuer dans une application UNIAPP? Mar 27, 2025 pm 04:59 PM

L'article traite de divers types de tests pour les applications UNIAPP, y compris l'unité, l'intégration, les tests fonctionnels, UI / UX, les performances, la plate-forme multiplateforme et la sécurité. Il couvre également une compatibilité multiplateforme et recommande des outils comme JES

Comment pouvez-vous réduire la taille de votre package d'application UNIAPP? Comment pouvez-vous réduire la taille de votre package d'application UNIAPP? Mar 27, 2025 pm 04:45 PM

L'article traite des stratégies pour réduire la taille du package UNIAPP, en se concentrant sur l'optimisation du code, la gestion des ressources et les techniques comme le fractionnement du code et le chargement paresseux.

Quels outils de débogage sont disponibles pour le développement UNIAPP? Quels outils de débogage sont disponibles pour le développement UNIAPP? Mar 27, 2025 pm 05:05 PM

L'article traite des outils de débogage et des meilleures pratiques pour le développement de l'UNIAPP, en se concentrant sur des outils comme HBuilderx, WeChat Developer Tools et Chrome Devtools.

Comment utiliser l'API Uni-App pour accéder aux fonctionnalités des appareils (appareil photo, géolocalisation, etc.)? Comment utiliser l'API Uni-App pour accéder aux fonctionnalités des appareils (appareil photo, géolocalisation, etc.)? Mar 18, 2025 pm 12:06 PM

L'article discute de l'utilisation des API de l'Uni-App pour accéder aux fonctionnalités des appareils comme la caméra et la géolocalisation, y compris les paramètres d'autorisation et la gestion des erreurs. Compte de chargement: 158

Comment utiliser l'API de stockage Uni-App (Uni.SetStorage, Uni.getStorage)? Comment utiliser l'API de stockage Uni-App (Uni.SetStorage, Uni.getStorage)? Mar 18, 2025 pm 12:22 PM

L'article explique comment utiliser les API de stockage Uni-App (Uni.SetStorage, Uni.getStorage) pour la gestion des données locales, discute des meilleures pratiques, dépannage et met en évidence les limitations et les considérations pour une utilisation efficace.

Comment gérer la navigation entre les pages d'Uni-App? Comment gérer la navigation entre les pages d'Uni-App? Mar 18, 2025 pm 12:07 PM

L'article traite de la gestion de la navigation des pages dans Uni-App à l'aide d'API intégrées, des meilleures pratiques pour une navigation efficace, des animations personnalisées pour les transitions de pages et des méthodes pour passer des données entre les pages.

See all articles