Obtenez les dimensions de fenêtre de navigateur avec JavaScript
-
12-09-2019 - |
La solution
Cross-navigateur @media (width)
et @media (height)
valeurs
var w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
var h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
window.innerWidth
et .innerHeight
- CSS viewport
@media (width)
et@media (height)
qui comprennent les barres de défilement - initial-scale et zoom href="https://github.com/ryanve/verge/issues/13" variations rel="noreferrer"> peuvent entraîner des valeurs mobiles à à tort réduire à ce que PPK appelle la fenêtre visuelle et plus petites que les valeurs
@media
- zoom peut provoquer des valeurs à 1px hors raison de l'arrondissement natif
-
undefined
dans IE8 -
document.documentElement.clientWidth
et .clientHeight
- est égale à la largeur de la fenêtre CSS moins Largeur scrollbar
- correspond
@media (width)
et@media (height)
quand il est pas scrollbar - même que
jQuery(window).width()
qui jQuery appelle la fenêtre du navigateur - cross-browser disponible
- inexactes si doctype manque
Ressources
- sorties en direct pour diverses dimensions
- point utilise des techniques de viewport cross-browser
- réelle utilise
matchMedia
pour obtenir des dimensions précises dans une unité
Autres conseils
$(window).width()
et $(window).height()
Vous pouvez utiliser le window.innerWidth et window.innerHeight propriétés
Si vous ne l'utilisez jQuery, il devient laid. Voici un extrait qui devrait fonctionner sur tous les nouveaux navigateurs. Le comportement est différent en mode Quirks et mode standard dans IE. Cela prend soin.
var elem = (document.compatMode === "CSS1Compat") ?
document.documentElement :
document.body;
var height = elem.clientHeight;
var width = elem.clientWidth;
Je suis en mesure de trouver une réponse définitive en JavaScript: The Definitive Guide, 6e édition par O'Reilly, p. 391:
Cette solution fonctionne même en mode Quirks, alors que ryanve et la solution actuelle de ScottEvernden ne le font pas.
function getViewportSize(w) {
// Use the specified window or the current window if no argument
w = w || window;
// This works for all browsers except IE8 and before
if (w.innerWidth != null) return { w: w.innerWidth, h: w.innerHeight };
// For IE (or any browser) in Standards mode
var d = w.document;
if (document.compatMode == "CSS1Compat")
return { w: d.documentElement.clientWidth,
h: d.documentElement.clientHeight };
// For browsers in Quirks mode
return { w: d.body.clientWidth, h: d.body.clientHeight };
}
à l'exception du fait que je me demande pourquoi la if (document.compatMode == "CSS1Compat")
ligne n'est pas if (d.compatMode == "CSS1Compat")
, tout semble bon.
Je sais que cela a une réponse acceptable, mais je suis tombé sur une situation où clientWidth
ne fonctionne pas, comme l'iPhone (au moins le mien) est retourné 980, pas 320, donc j'utilisé window.screen.width
. Je travaillais sur un site existant, étant fait « sensibles » et nécessaire pour forcer les navigateurs plus grands à utiliser une autre méta-fenêtre.
Espérons que cela aide quelqu'un, il ne peut pas être parfait, mais il travaille dans mes tests sur iOs et Android.
//sweet hack to set meta viewport for desktop sites squeezing down to mobile that are big and have a fixed width
//first see if they have window.screen.width avail
(function() {
if (window.screen.width)
{
var setViewport = {
//smaller devices
phone: 'width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no',
//bigger ones, be sure to set width to the needed and likely hardcoded width of your site at large breakpoints
other: 'width=1045,user-scalable=yes',
//current browser width
widthDevice: window.screen.width,
//your css breakpoint for mobile, etc. non-mobile first
widthMin: 560,
//add the tag based on above vars and environment
setMeta: function () {
var params = (this.widthDevice <= this.widthMin) ? this.phone : this.other;
var head = document.getElementsByTagName("head")[0];
var viewport = document.createElement('meta');
viewport.setAttribute('name','viewport');
viewport.setAttribute('content',params);
head.appendChild(viewport);
}
}
//call it
setViewport.setMeta();
}
}).call(this);
J'ai regardé et trouvé un moyen croix navigateur:
function myFunction(){
if(window.innerWidth !== undefined && window.innerHeight !== undefined) {
var w = window.innerWidth;
var h = window.innerHeight;
} else {
var w = document.documentElement.clientWidth;
var h = document.documentElement.clientHeight;
}
var txt = "Page size: width=" + w + ", height=" + h;
document.getElementById("demo").innerHTML = txt;
}
<!DOCTYPE html>
<html>
<body onresize="myFunction()" onload="myFunction()">
<p>
Try to resize the page.
</p>
<p id="demo">
</p>
</body>
</html>
Ce code est de http://andylangton.co.uk / articles / javascript / get-viewport taille-javascript /
function viewport() {
var e = window, a = 'inner';
if (!('innerWidth' in window )) {
a = 'client';
e = document.documentElement || document.body;
}
return { width : e[ a+'Width' ] , height : e[ a+'Height' ] };
}
NB: pour lire la largeur, l'utilisation console.log('viewport width'+viewport().width);
Il y a une différence entre window.innerHeight
et document.documentElement.clientHeight
. La première comprend la hauteur de la barre de défilement horizontal.
Si vous êtes à la recherche d'une solution non-jQuery qui donne des valeurs correctes en pixels virtuels sur mobile , et vous pensez que window.innerHeight
simple ou document.documentElement.clientHeight
peut résoudre votre problème, s'il vous plaît étudier ce lien premier: https://tripleodeon.com/assets/2011/12/table.html
Le développeur a fait un bon test qui révèle le problème: vous pouvez obtenir des valeurs inattendues pour Android / iOS, paysage / portrait, affiche normale densité / haute.
Ma réponse actuelle n'est pas encore balle d'argent (// todo), mais plutôt un avertissement à ceux qui vont copier-coller rapidement une solution donnée de ce fil dans le code de production.
Je cherchais la largeur de la page dans pixels virtuels sur mobile, et je l'ai trouvé le seul code de travail est (de façon inattendue!) window.outerWidth
. Je vais examiner plus tard ce tableau pour une solution correcte donnant hauteur hors barre de navigation, quand j'ai le temps.
Une solution qui serait conforme aux normes du W3C serait de créer un div transparent (par exemple de manière dynamique avec JavaScript), définir sa largeur et la hauteur de 100vw / 100vh (unités de visualisation) et ensuite obtenir son offsetWidth et offsetHeight. Après cela, l'élément peut être retiré à nouveau. Cela ne fonctionnera pas dans les anciens navigateurs, car les unités de fenêtres sont relativement nouveaux, mais si vous ne se soucient pas eux, mais plutôt sur les normes, (bientôt à être), vous pouvez certainement aller de cette façon:
var objNode = document.createElement("div");
objNode.style.width = "100vw";
objNode.style.height = "100vh";
document.body.appendChild(objNode);
var intViewportWidth = objNode.offsetWidth;
var intViewportHeight = objNode.offsetHeight;
document.body.removeChild(objNode);
Bien sûr, vous pouvez également définir objNode.style.position = « fixe », puis utiliser 100% en largeur / hauteur - cela devrait avoir le même effet et d'améliorer la compatibilité dans une certaine mesure. En outre, la position de réglage fixe pourrait être une bonne idée en général, parce que sinon la div sera invisible mais consomment un peu d'espace, ce qui conduira à des barres de défilement apparaissent etc.
Ceci est la façon dont je le fais, je l'ai essayé dans IE 8 -> 10, FF 35, Chrome 40, il fonctionnera très bien dans tous les navigateurs modernes (comme window.innerWidth est définie) et dans IE 8 (avec pas window.innerWidth), il fonctionne en douceur et, toute question (comme clignotant à cause de trop-plein: « caché »), s'il vous plaît le signaler. Je ne suis pas vraiment intéressé à la hauteur de la fenêtre que je fait cette fonction juste pour contourner des outils adaptés, mais il pourrait être mis en œuvre. Espérons que cela aide, j'apprécie les commentaires et suggestions.
function viewportWidth () {
if (window.innerWidth) return window.innerWidth;
var
doc = document,
html = doc && doc.documentElement,
body = doc && (doc.body || doc.getElementsByTagName("body")[0]),
getWidth = function (elm) {
if (!elm) return 0;
var setOverflow = function (style, value) {
var oldValue = style.overflow;
style.overflow = value;
return oldValue || "";
}, style = elm.style, oldValue = setOverflow(style, "hidden"), width = elm.clientWidth || 0;
setOverflow(style, oldValue);
return width;
};
return Math.max(
getWidth(html),
getWidth(body)
);
}