Comment obtenir la hauteur de la barre d'adresse en JavaScript dans le navigateur Chrome pour Android (marqué d'un rectangle rouge dans l'image de gauche)? J'ai besoin de savoir que cela disparaît lors du défilement et que je dois réagir à cela car la hauteur de la fenêtre d'affichage est différente.
Une solution que j'ai déjà trouvée:
Obtenir la hauteur de la fenêtre d'affichage à l'état initial: var height = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
Obtenir la hauteur de la fenêtre d'affichage lorsque la barre d'adresse a disparu
Calculer la différence entre les deux valeurs
Le problème est que vous devez être dans le second état pour le savoir.
La meilleure approche pour moi était d’avoir quelque chose comme ça:
$(document).ready(function(){
var viewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
var viewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
var isPortrait = viewportHeight > viewportWidth;
$( window ).resize(onresize);
function onresize() {
var newViewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
var newViewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
var hasOrientationChanged = (newViewportHeight > newViewportWidth) != isPortrait;
var addressbarHeight = 130;
if (!hasOrientationChanged && (newViewportHeight != viewportHeight)) {
addressbarHeight = Math.abs(newViewportHeight - viewportHeight);
if (newViewportHeight < viewportHeight) {
// Android Chrome address bar has appeared
} else {
// Android Chrome address bar has disappeared
}
} else if(hasOrientationChanged) {
// Orientation change
}
viewportHeight = newViewportHeight;
viewportWidth = newViewportWidth;
isPortrait = viewportHeight > viewportWidth;
}
});
La chose que vous recherchez est barre de redimensionnement . Depuis le chrome v56 d'Android, David Bokan recommande d'utiliser vh unit sur un téléphone mobile. Il y a une démo dans cet article, clique sur le lien pour obtenir plus d'informations et comment l'utiliser sur mobile.
Lorsque l'utilisateur fait défiler la page, un événement window.resize est déclenché . Vous pouvez mettre à jour votre page en interceptant cet événement avec un écouteur d'événements.
Plus d'informations: mobile chrome déclenche un événement redimensionné lors du défilement
Si le même problème se posait aujourd’hui, il n’existe pas de moyen facile de déterminer directement la hauteur de la barre d’URL. Autant que je sache, aucune des variables directement accessibles en javascript ne peut vous dire combien la taille de "100vh" est réellement.
Sur les navigateurs mobiles, 100vh peut ou non inclure la hauteur de la barre d’URL, ce qui nous laisse dans une situation délicate si nous voulons dimensionner une div à la hauteur exacte de la zone de contenu visible du navigateur pendant le chargement.
J'ai trouvé une solution de contournement bien que cela ait fonctionné plutôt bien pour moi, voici ce que j'ai fait:
alors vous pouvez obtenir la taille de la barre d'adresse avec le code suivant:
var addressBarSize = parseFloat(getComputedStyle(document.documentElement).perspective) - document.documentElement.clientHeight
J'avais un conteneur avec un contenu dynamique qui devait toujours avoir au moins toute la hauteur de viewport (et pouvoir défiler si le contenu ne tenait pas à l'écran).
Donc, si vous avez besoin d'une hauteur fixe, remplacez simplement "min-height" par "height" dans ma solution.
C'est comme ça que j'ai traité avec ça.
// calculate min-height on init
$(".content-container").css("min-height", `${window.innerHeight}px`);
// recalculate the min-height everytime the bar appears or disappears
$(window).resize(() => {
$(".content-container").css("min-height", `${window.innerHeight}px`);
});
Cela fonctionne pour la barre d'adresse d'Android et aussi pour les barres de safari (dans Safari Mobile, il peut y avoir une barre supérieure et une barre inférieure).
Ensuite, pour rendre la transition lisse, vous pouvez appliquer une règle css:
.content-container{
transition: min-height 500ms ease;
}