Je construis un site Web spécifiquement pour les appareils mobiles. Il y a une page en particulier qui est mieux visualisée en mode paysage.
Existe-t-il un moyen de détecter si l’utilisateur visitant cette page l’affiche en mode Portrait et, le cas échéant, d’afficher un message l’informant que la meilleure visualisation de la page est en mode Paysage? Si l'utilisateur le visualise déjà en mode paysage, aucun message ne s'affichera.
Donc, fondamentalement, je veux que le site détecte l'orientation de la fenêtre d'affichage, si l'orientation est Portrait , puis affiche un message d'alerte informant l'utilisateur que la meilleure visualisation de cette page est en mode Paysage .
Merci beaucoup, Dan
if(window.innerHeight > window.innerWidth){
alert("Please use Landscape!");
}
jQuery Mobile a un événement qui gère le changement de cette propriété ... si vous voulez avertir si quelqu'un tourne plus tard - orientationchange
En outre, après quelques recherches sur Google, consultez window.orientation
(qui est, je crois, mesuré en degrés ...
Vous pouvez également utiliser window.matchMedia
, que j'utilise et préfère car il ressemble beaucoup à la syntaxe CSS:
if (window.matchMedia("(orientation: portrait)").matches) {
// you're in PORTRAIT mode
}
if (window.matchMedia("(orientation: landscape)").matches) {
// you're in LANDSCAPE mode
}
Testé sur iPad 2.
David Walsh a une approche meilleure et directe.
// Listen for orientation changes
window.addEventListener("orientationchange", function() {
// Announce the new orientation number
alert(window.orientation);
}, false);
Au cours de ces modifications, la propriété window.orientation peut être modifiée. Une valeur de 0 correspond à une vue en portrait, -90 à un paysage tourné à droite et 90 à un paysage.
Vous pouvez utiliser CSS3:
@media screen and (orientation:landscape)
{
body
{
background: red;
}
}
Il y a plusieurs façons de le faire, par exemple:
window.orientation
innerHeight
contre innerWidth
Vous pouvez adapter l’une des méthodes ci-dessous.
Vérifiez si l'appareil est en mode portrait
function isPortrait() {
return window.innerHeight > window.innerWidth;
}
Vérifiez si l'appareil est en mode paysage
function isLandscape() {
return (window.orientation === 90 || window.orientation === -90);
}
Exemple d'utilisation
if (isPortrait()) {
alert("This page is best viewed in landscape mode");
}
Comment détecter le changement d'orientation?
$(document).ready(function() {
$(window).on('orientationchange', function(event) {
console.log(orientation);
});
});
Je pense que la solution la plus stable consiste à utiliser l’écran plutôt que la fenêtre, car ce pourrait être à la fois en mode paysage ou portrait si vous redimensionnez la fenêtre de votre navigateur sur un ordinateur de bureau.
if (screen.height > screen.width){
alert("Please use Landscape!");
}
Afin d’appliquer tous ces excellents commentaires à mon codage quotidien, pour assurer la continuité entre toutes mes applications, j’ai décidé d’utiliser les éléments suivants dans les codes jquery et jquery mobile.
window.onresize = function (event) {
applyOrientation();
}
function applyOrientation() {
if (window.innerHeight > window.innerWidth) {
alert("You are now in portrait");
} else {
alert("You are now in landscape");
}
}
N'essayez pas de résoudre le problème window.orientation (0, 90, etc.) ne signifie pas portrait, paysage, etc.):
http://www.matthewgifford.com/blog/2011/12/22/a-misconception-about-window-orientation/
Même sur iOS7, selon la manière dont vous entrez dans le navigateur, 0 n'est pas toujours portrait
Après quelques expériences, j'ai constaté que la rotation d'un périphérique sensible à l'orientation déclenchera toujours l'événement resize
d'une fenêtre de navigateur. Donc, dans votre gestionnaire de redimensionnement, appelez simplement une fonction comme:
function is_landscape() {
return (window.innerWidth > window.innerHeight);
}
J'ai combiné deux solutions et cela fonctionne bien pour moi.
window.addEventListener("orientationchange", function() {
if (window.matchMedia("(orientation: portrait)").matches) {
alert("PORTRAIT")
}
if (window.matchMedia("(orientation: landscape)").matches) {
alert("LANSCAPE")
}
}, false);
Obtenir l'orientation (à tout moment dans votre code js) via
window.orientation
Lorsque window.orientation
renvoie 0
ou 180
, vous êtes en mode portrait , lorsque vous renvoyez 90
ou 270
, vous passez en mode paysage .
Je ne suis pas d'accord avec la réponse la plus votée. Utilisez screen
et non window
if(screen.innerHeight > screen.innerWidth){
alert("Please use Landscape!");
}
Est-ce la bonne façon de le faire. Si vous calculez avec window.height
, vous aurez des problèmes sur Android. Lorsque le clavier est ouvert, la fenêtre se réduit. Donc, utilisez l'écran au lieu de la fenêtre.
Le screen.orientation.type
est une bonne réponse mais avec IE. https://caniuse.com/#search=screen.orientation
une autre alternative pour déterminer l’orientation, basée sur une comparaison largeur/hauteur:
var mql = window.matchMedia("(min-aspect-ratio: 4/3)");
if (mql.matches) {
orientation = 'landscape';
}
Vous l'utilisez pour l'événement "redimensionner":
window.addEventListener("resize", function() { ... });
iOS ne met pas à jour screen.width
& screen.height
lorsque l'orientation change. Android ne met pas à jour window.orientation
quand il change.
Ma solution à ce problème:
var isAndroid = /(Android)/i.test(navigator.userAgent);
if(isAndroid)
{
if(screen.width < screen.height){
//portrait mode on Android
}
} else {
if(window.orientation == 0){
//portrait mode iOS and other devices
}
}
Vous pouvez détecter ce changement d'orientation sur Android ainsi que sur iOS avec le code suivant:
var supportsOrientationChange = "onorientationchange" in window,
orientationEvent = supportsOrientationChange ? "orientationchange" : "resize";
window.addEventListener(orientationEvent, function() {
alert("the orientation has changed");
}, false);
Si l'événement onorientationchange
n'est pas pris en charge, l'événement lié sera l'événement resize
.
//see also http://stackoverflow.com/questions/641857/javascript-window-resize-event
//see also http://mbccs.blogspot.com/2007/11/fixing-window-resize-event-in-ie.html
/*
Be wary of this:
While you can just hook up to the standard window resize event, you'll find that in IE, the event is fired once for every X and once for every Y axis movement, resulting in a ton of events being fired which might have a performance impact on your site if rendering is an intensive task.
*/
//setup
window.onresize = function(event) {
window_resize(event);
}
//timeout wrapper points with doResizeCode as callback
function window_resize(e) {
window.clearTimeout(resizeTimeoutId);
resizeTimeoutId = window.setTimeout('doResizeCode();', 10);
}
//wrapper for height/width check
function doResizeCode() {
if(window.innerHeight > window.innerWidth){
alert("Please view in landscape");
}
}
$(window).on("orientationchange",function( event ){
alert(screen.orientation.type)
});
CCS uniquement
@media (max-width: 1024px) and (orientation: portrait){ /* tablet and smaller */
body:after{
position: absolute;
z-index: 9999;
width: 100%;
top: 0;
bottom: 0;
content: "";
background: #212121 url(http://i.stack.imgur.com/sValK.png) 0 0 no-repeat; /* replace with an image that tells the visitor to rotate the device to landscape mode */
background-size: 100% auto;
opacity: 0.95;
}
}
Dans certains cas, vous voudrez peut-être ajouter un petit morceau de code à recharger sur la page après que le visiteur a fait pivoter le périphérique, afin que le CSS soit restitué correctement:
window.onorientationchange = function() {
var orientation = window.orientation;
switch(orientation) {
case 0:
case 90:
case -90: window.location.reload();
break; }
};
Au lieu de 270, il peut être -90 (moins 90).
Merci à tobyodavies pour avoir guidé le chemin.
Pour obtenir un message d'alerte en fonction de l'orientation du périphérique mobile, vous devez implémenter le script suivant dans la fonction function setHeight() {
.
if(window.innerHeight > window.innerWidth){
alert("Please view in landscape");
}
Cela développe une réponse précédente. La meilleure solution que j'ai trouvée consiste à créer un attribut CSS inoffensif qui apparaît uniquement si une requête de support CSS3 est remplie, puis à effectuer le test JS pour cet attribut.
Ainsi, par exemple, dans le CSS, vous avez:
@media screen only and (orientation:landscape)
{
// Some innocuous rule here
body
{
background-color: #fffffe;
}
}
@media screen only and (orientation:portrait)
{
// Some innocuous rule here
body
{
background-color: #fffeff;
}
}
Vous allez ensuite à JavaScript (j'utilise jQuery pour les funsies). Les déclarations de couleur peuvent être étranges, alors vous voudrez peut-être utiliser autre chose, mais c'est la méthode la plus infaillible que j'ai trouvée pour la tester. Vous pouvez ensuite simplement utiliser l'événement de redimensionnement pour choisir le changement. Mettez tout cela ensemble pour:
function detectOrientation(){
// Referencing the CSS rules here.
// Change your attributes and values to match what you have set up.
var bodyColor = $("body").css("background-color");
if (bodyColor == "#fffffe") {
return "landscape";
} else
if (bodyColor == "#fffeff") {
return "portrait";
}
}
$(document).ready(function(){
var orientation = detectOrientation();
alert("Your orientation is " + orientation + "!");
$(document).resize(function(){
orientation = detectOrientation();
alert("Your orientation is " + orientation + "!");
});
});
La meilleure partie de ceci est que, au moment où j'écris cette réponse, cela ne semble pas avoir d'effet sur les interfaces de bureau, puisqu'elles ne (généralement) passent (apparemment) aucun argument pour l'orientation vers la page.
L'objet Window en JavaScript sur les périphériques iOS a une propriété d'orientation qui peut être utilisée pour déterminer la rotation du périphérique. Ce qui suit montre les valeurs window.orientation pour les appareils iOS (par exemple, iPhone, iPad, iPod) selon différentes orientations.
Cette solution fonctionne également pour les appareils Android. J'ai vérifié dans le navigateur natif Android (navigateur Internet) et dans le navigateur Chrome, même dans les anciennes versions.
function readDeviceOrientation() {
if (Math.abs(window.orientation) === 90) {
// Landscape
} else {
// Portrait
}
}
Voici la meilleure méthode que j'ai trouvée, basée sur l'article de David Walsh ( Détecter le changement d'orientation sur les appareils mobiles )
if ( window.matchMedia("(orientation: portrait)").matches ) {
alert("Please use Landscape!")
}
Explication:
Window.matchMedia () est une méthode native qui vous permet de définir une règle de requête multimédia et de vérifier sa validité à tout moment.
Je trouve utile d'attacher un auditeur onchange
sur la valeur de retour de cette méthode. Exemple:
var mediaQueryRule = window.matchMedia("(orientation: portrait)")
mediaQueryRule.onchange = function(){ alert("screen orientation changed") }
J'ai utilisé pour Android Chrome "L'API d'orientation de l'écran"
Pour consulter l'orientation actuelle, appelez console.log (screen.orientation.type) (et éventuellement screen.orientation.angle).
Résultats: portrait-primaire | portrait secondaire | paysage-primaire | paysage secondaire
Ci-dessous mon code, j'espère que cela vous sera utile:
var m_isOrientation = ("orientation" in screen) && (typeof screen.orientation.lock == 'function') && (typeof screen.orientation.unlock == 'function');
...
if (!isFullscreen()) return;
screen.orientation.lock('landscape-secondary').then(
function() {
console.log('new orientation is landscape-secondary');
},
function(e) {
console.error(e);
}
);//here's Promise
...
screen.orientation.unlock();
C'est ce que j'utilise.
function getOrientation() {
// if window.orientation is available...
if( window.orientation && typeof window.orientation === 'number' ) {
// ... and if the absolute value of orientation is 90...
if( Math.abs( window.orientation ) == 90 ) {
// ... then it's landscape
return 'landscape';
} else {
// ... otherwise it's portrait
return 'portrait';
}
} else {
return false; // window.orientation not available
}
}
La mise en oeuvre
window.addEventListener("orientationchange", function() {
// if orientation is landscape...
if( getOrientation() === 'landscape' ) {
// ...do your thing
}
}, false);
screen.orientation.addEventListener("change", function(e) {
console.log(screen.orientation.type + " " + screen.orientation.angle);
}, false);
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Rotation Test</title>
<link type="text/css" href="css/style.css" rel="stylesheet"></style>
<script src="js/jquery-1.5.min.js" type="text/javascript"></script>
<script type="text/javascript">
window.addEventListener("resize", function() {
// Get screen size (inner/outerWidth, inner/outerHeight)
var height = $(window).height();
var width = $(window).width();
if(width>height) {
// Landscape
$("#mode").text("LANDSCAPE");
} else {
// Portrait
$("#mode").text("PORTRAIT");
}
}, false);
</script>
</head>
<body onorientationchange="updateOrientation();">
<div id="mode">LANDSCAPE</div>
</body>
</html>
Certains périphériques n'ont pas fourni l'événement d'orientationchange, mais déclenchent l'événement de redimensionnement de la fenêtre:
// Listen for resize changes
window.addEventListener("resize", function() {
// Get screen size (inner/outerWidth, inner/outerHeight)
}, false);
Un peu moins évident que l'événement orientationchange, mais fonctionne très bien. S'il vous plaît vérifier ici
Une chose à noter à propos de window.orientation
est qu'il retournera undefined
si vous n'êtes pas sur un appareil mobile. Donc, une bonne fonction pour vérifier l’orientation pourrait ressembler à ceci, où x
est window.orientation
:
//check for orientation
function getOrientation(x){
if (x===undefined){
return 'desktop'
} else {
var y;
x < 0 ? y = 'landscape' : y = 'portrait';
return y;
}
}
Appelez ça comme ça:
var o = getOrientation(window.orientation);
window.addEventListener("orientationchange", function() {
o = getOrientation(window.orientation);
console.log(o);
}, false);
Ou vous pouvez simplement utiliser ceci ..
window.addEventListener("orientationchange", function() {
if (window.orientation == "90" || window.orientation == "-90") {
//Do stuff
}
}, false);
Il existe un moyen de détecter si l'utilisateur a basculé son appareil en mode portrait à l'aide de screen.orientation
Il suffit d'utiliser le code ci-dessous:
screen.orientation.onchange = function () {
var type = screen.orientation.type;
if (type.match(/portrait/)) {
alert('Please flip to landscape, to use this app!');
}
}
Désormais, onchange
sera déclenché chaque fois que l'utilisateur retournera l'appareil et une alerte s'ouvrira lorsqu'il utilisera le mode portrait.
Si vous avez les derniers navigateurs, window.orientation
risque de ne pas fonctionner. Dans ce cas, utilisez le code suivant pour obtenir un angle -
var orientation = window.screen.orientation.angle;
Ceci est encore une technologie expérimentale, vous pouvez vérifier la compatibilité du navigateur ici