Je souhaite offrir à mes visiteurs la possibilité de voir des images en haute qualité. Existe-t-il un moyen de détecter la taille de la fenêtre?
Ou mieux encore, la taille de la fenêtre d'affichage du navigateur avec JavaScript? Voir la zone verte ici:
@media (width)
et @media (height)
valeursvar w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
var h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
window.innerWidth
et .innerHeight
@media (width)
et @media (height)
qui incluent des barres de défilementinitial-scale
et zoom variations peuvent entraîner des valeurs mobiles à tort redimensionnez jusqu'à ce que PPK appelle viewport et soyez plus petit que les valeurs @media
undefined
dans IE8-document.documentElement.clientWidth
et .clientHeight
@media (width)
et @media (height)
quand il y a non barre de défilementjQuery(window).width()
qui jQuery appelle la fenêtre de visualisation du navigateur.matchMedia
pour obtenir des dimensions précises dans n’importe quelle unité$(window).width()
et $(window).height()
Vous pouvez utiliser les propriétés window.innerWidth et window.innerHeight .
Si vous n'utilisez pas jQuery, cela devient moche. Voici un extrait qui devrait fonctionner sur tous les nouveaux navigateurs. Le comportement est différent en mode Quirks et en mode standard dans IE. Cela s'en occupe.
var elem = (document.compatMode === "CSS1Compat") ?
document.documentElement :
document.body;
var height = elem.clientHeight;
var width = elem.clientWidth;
J'ai pu trouver une réponse définitive en JavaScript: The Definitive Guide, 6e édition, de O'Reilly, p. 391:
Cette solution fonctionne même en mode Quirks, contrairement à la solution actuelle de ryanve et ScottEvernden.
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 };
}
à part le fait que je me demande pourquoi la ligne if (document.compatMode == "CSS1Compat")
n'est pas if (d.compatMode == "CSS1Compat")
, tout est beau.
Je sais que la réponse est acceptable, mais je me suis heurté à une situation où clientWidth
ne fonctionnait pas, car l'iPhone (du moins le mien) en renvoyait 980, et non 320, alors j'ai utilisé window.screen.width
. Je travaillais sur un site existant, je devenais "réactif" et je devais obliger les grands navigateurs à utiliser un méta-viewport différent.
J'espère que cela aide quelqu'un, ce n'est peut-être pas parfait, mais cela fonctionne 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 cherché et trouvé une méthode de navigation croisée:
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>
Il y a une différence entre window.innerHeight
et document.documentElement.clientHeight
. Le premier inclut la hauteur de la barre de défilement horizontale.
Ce code provient de http://andylangton.co.uk/articles/javascript/get-viewport-size-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, utilisez console.log('viewport width'+viewport().width);
Si vous recherchez une solution non-jQuery donnant des valeurs correctes en pixels virtuels sur le mobile , et que vous pensez que plain window.innerHeight
ou document.documentElement.clientHeight
peut résoudre votre problème, veuillez d'abord étudier ce lien: https://tripleodeon.com/assets/2011/12/table.html
Le développeur a fait de bons tests qui révèlent le problème: vous pouvez obtenir des valeurs inattendues pour les écrans Android/iOS, Paysage/Portrait, Normal/Haute densité.
Ma réponse actuelle n’est pas encore la solution miracle (// todo), mais plutôt un avertissement à ceux qui vont rapidement copier-coller 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 j'ai trouvé que le seul code qui fonctionne est (de manière inattendue!) window.outerWidth
. J'examinerai plus tard ce tableau pour trouver la solution correcte en donnant la hauteur, à l'exclusion de la barre de navigation, lorsque j'en aurai le temps.
Une solution conforme aux normes du W3C consisterait à créer une division transparente (par exemple de manière dynamique avec JavaScript), à définir sa largeur et sa hauteur sur 100 vw/100vh (unités Viewport), puis à obtenir ses propriétés offsetWidth et offsetHeight. Après cela, l'élément peut être supprimé à nouveau. Cela ne fonctionnera pas dans les anciens navigateurs car les unités de la fenêtre de visualisation sont relativement nouvelles, mais si vous ne vous en souciez pas, mais plutôt des normes (à venir), vous pouvez certainement procéder ainsi:
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 = "fixed" puis utiliser 100% comme largeur/hauteur - cela devrait avoir le même effet et améliorer dans une certaine mesure la compatibilité. Aussi, régler la position sur fixed pourrait être une bonne idée en général, car sinon la div sera invisible mais consommera un peu d’espace, ce qui entraînera l’affichage de barres de défilement, etc.
C’est ce que je fais, j’ai essayé dans IE 8 -> 10, 35 FF, Chrome 40, cela fonctionnera de manière très fluide dans tous les navigateurs modernes (comme window.innerWidth est défini) et dans IE 8 (sans window.innerWidth), tout se passe bien, tout problème (comme le clignotement dû au débordement: "masqué"), signalez-le. La hauteur de la fenêtre d'affichage ne m'intéresse pas vraiment car j'ai créé cette fonction pour contourner certains outils réactifs, mais elle pourrait être implémentée. J'espère que cela vous aidera, j'apprécie vos 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)
);
}