我正在建立专门针对移动设备的网站。特别是有一个页面,最好以横向模式查看。
有没有办法检测访问该页面的用户是否在纵向模式下查看它?如果是,则显示一条消息,通知用户该页面最好以横向模式查看?如果用户已在横向模式下查看,则不会显示任何消息。
所以基本上,我希望网站检测视口方向,如果方向是纵向,则显示一条警告消息,告知用户该页面在风景模式。
非常感谢, 丹
答案 0 :(得分:242)
if(window.innerHeight > window.innerWidth){
alert("Please use Landscape!");
}
jQuery Mobile有一个事件可以处理此属性的更改...如果您想要警告某人是否稍后轮换 - orientationchange
此外,经过一些谷歌搜索,请查看window.orientation
(我相信以度数衡量......)
答案 1 :(得分:128)
你也可以使用我使用的window.matchMedia
,因为它非常类似于CSS语法:
if (window.matchMedia("(orientation: portrait)").matches) {
// you're in PORTRAIT mode
}
if (window.matchMedia("(orientation: landscape)").matches) {
// you're in LANDSCAPE mode
}
在iPad 2上测试。
答案 2 :(得分:86)
David Walsh有一个更好,更直接的方法。
// Listen for orientation changes
window.addEventListener("orientationchange", function() {
// Announce the new orientation number
alert(window.orientation);
}, false);
在这些更改期间,window.orientation属性可能会更改。值0表示纵向视图,-90表示设备横向旋转到右侧,90表示设备横向旋转到左侧。
答案 3 :(得分:33)
您可以使用CSS3:
@media screen and (orientation:landscape)
{
body
{
background: red;
}
}
答案 4 :(得分:18)
有几种方法可以做到,例如:
window.orientation
值innerHeight
与innerWidth
您可以采用以下方法之一。
检查设备是否处于纵向模式
function isPortrait() {
return window.innerHeight > window.innerWidth;
}
检查设备是否处于横向模式
function isLandscape() {
return (window.orientation === 90 || window.orientation === -90);
}
使用示例
if (isPortrait()) {
alert("This page is best viewed in landscape mode");
}
如何检测方向更改?
$(document).ready(function() {
$(window).on('orientationchange', function(event) {
console.log(orientation);
});
});
答案 5 :(得分:10)
我认为更稳定的解决方案是使用屏幕而不是窗口,因为如果您要在桌面计算机上调整浏览器窗口的大小,它可以是横向或纵向。
if (screen.height > screen.width){
alert("Please use Landscape!");
}
答案 6 :(得分:8)
为了将所有这些出色的评论应用到我的日常编码中,为了保证所有应用程序之间的连续性,我决定在jquery和jquery移动代码中使用以下内容。
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");
}
}
答案 7 :(得分:6)
不要尝试修复window.orientation查询(0,90等并不意味着肖像,风景等):
http://www.matthewgifford.com/blog/2011/12/22/a-misconception-about-window-orientation/
即使在iOS7上,根据你进入浏览器的方式,0也不总是肖像
答案 8 :(得分:5)
经过一些实验,我发现旋转方向感知设备将始终触发浏览器窗口的resize
事件。所以在你的resize处理程序中只需调用一个函数:
function is_landscape() {
return (window.innerWidth > window.innerHeight);
}
答案 9 :(得分:5)
我结合了两个解决方案,它对我来说很好。
window.addEventListener("orientationchange", function() {
if (window.matchMedia("(orientation: portrait)").matches) {
alert("PORTRAIT")
}
if (window.matchMedia("(orientation: landscape)").matches) {
alert("LANSCAPE")
}
}, false);
答案 10 :(得分:4)
通过
获取方向(在js代码中的任何时间)window.orientation
当window.orientation
返回0
或180
时,您处于纵向模式,返回90
或270
时处于横向模式。
答案 11 :(得分:3)
我不同意最投票的答案。使用screen
而非window
if(screen.innerHeight > screen.innerWidth){
alert("Please use Landscape!");
}
是正确的方法吗?如果您使用window.height
进行计算,则会遇到Android问题。当键盘打开时,窗口会缩小。所以使用屏幕而不是窗口。
screen.orientation.type
是一个很好的答案,但使用IE浏览器。
https://caniuse.com/#search=screen.orientation
答案 12 :(得分:2)
$(window).on("orientationchange",function( event ){
alert(screen.orientation.type)
});
答案 13 :(得分:2)
//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");
}
}
答案 14 :(得分:2)
另一种确定方向的替代方案,基于宽度/高度的比较:
var mql = window.matchMedia("(min-aspect-ratio: 4/3)");
if (mql.matches) {
orientation = 'landscape';
}
你在" resize"上使用它事件:
window.addEventListener("resize", function() { ... });
答案 15 :(得分:2)
iOS不会更新screen.width
&方向改变时screen.height
。 Android在更改时不会更新window.orientation
。
我解决这个问题的方法:
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
}
}
您可以使用以下代码在Android和iOS上检测此方向更改:
var supportsOrientationChange = "onorientationchange" in window,
orientationEvent = supportsOrientationChange ? "orientationchange" : "resize";
window.addEventListener(orientationEvent, function() {
alert("the orientation has changed");
}, false);
如果不支持onorientationchange
事件,则事件绑定将是resize
事件。
答案 16 :(得分:2)
仅限CCS
@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;
}
}
在某些情况下,您可能希望在访问者旋转设备后添加一小段代码重新加载到页面,以便正确呈现CSS:
window.onorientationchange = function() {
var orientation = window.orientation;
switch(orientation) {
case 0:
case 90:
case -90: window.location.reload();
break; }
};
答案 17 :(得分:1)
感谢tobyodavies指导方向。
要根据移动设备的方向获取提醒消息,您需要在function setHeight() {
if(window.innerHeight > window.innerWidth){
alert("Please view in landscape");
}
答案 18 :(得分:1)
这就是我使用的。
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
}
}
实施
window.addEventListener("orientationchange", function() {
// if orientation is landscape...
if( getOrientation() === 'landscape' ) {
// ...do your thing
}
}, false);
答案 19 :(得分:1)
iOS设备上的JavaScript中的窗口对象具有一个orientation属性,可用于确定设备的旋转。以下显示了不同方向的iOS设备(例如iPhone,iPad,iPod)的值window.orientation。
此解决方案也适用于Android设备。我检查了Android原生浏览器(互联网浏览器)和Chrome浏览器,即使是旧版本的。
function readDeviceOrientation() {
if (Math.abs(window.orientation) === 90) {
// Landscape
} else {
// Portrait
}
}
答案 20 :(得分:1)
screen.orientation.addEventListener("change", function(e) {
console.log(screen.orientation.type + " " + screen.orientation.angle);
}, false);
答案 21 :(得分:1)
我用于Android Chrome "The Screen Orientation API"
查看当前方向调用console.log(screen.orientation.type)(可能还有screen.orientation.angle)。
结果:portrait-primary |肖像中学| landscape-primary |横长的二次
以下是我的代码,我希望它会有所帮助:
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();
答案 22 :(得分:1)
这是我找到的最佳方法,基于David Walsh的文章(Detect Orientation Change on Mobile Devices)
if ( window.matchMedia("(orientation: portrait)").matches ) {
alert("Please use Landscape!")
}
说明:
Window.matchMedia()是一种本机方法,允许您定义媒体查询规则并在任何时间点检查其有效性。
我发现在此方法的返回值上附加onchange
侦听器很有用。例如:
var mediaQueryRule = window.matchMedia("(orientation: portrait)")
mediaQueryRule.onchange = function(){ alert("screen orientation changed") }
答案 23 :(得分:1)
这扩展了之前的答案。我发现的最佳解决方案是创建一个无害的CSS属性,只有在满足CSS3媒体查询时才出现,然后对该属性进行JS测试。
例如,在CSS中你有:
@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;
}
}
然后转到JavaScript(我使用jQuery进行测试)。颜色声明可能很奇怪,所以你可能想要使用别的东西,但这是我发现的最简单的测试方法。然后,您可以使用resize事件来接收切换。全部放在一起:
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 + "!");
});
});
最好的部分是,在我写这个答案时,它似乎对桌面界面没有任何影响,因为它们(通常)不会(似乎)传递任何参数页面方向。
答案 24 :(得分:1)
而不是270,它可以是-90(减去90)。
答案 25 :(得分:0)
有一种方法可以检测用户是否使用screen.orientation
将设备翻转为纵向模式
只需使用以下代码:
screen.orientation.onchange = function () {
var type = screen.orientation.type;
if (type.match(/portrait/)) {
alert('Please flip to landscape, to use this app!');
}
}
现在,当用户翻转设备时,onchange
会被触发,当用户使用纵向模式时会弹出警告。
答案 26 :(得分:0)
关于window.orientation
需要注意的一点是,如果您不在移动设备上,它将返回undefined
。因此检查方向的好功能可能如下所示,其中x
为window.orientation
:
//check for orientation
function getOrientation(x){
if (x===undefined){
return 'desktop'
} else {
var y;
x < 0 ? y = 'landscape' : y = 'portrait';
return y;
}
}
这样称呼:
var o = getOrientation(window.orientation);
window.addEventListener("orientationchange", function() {
o = getOrientation(window.orientation);
console.log(o);
}, false);
答案 27 :(得分:0)
或者你可以使用它..
window.addEventListener("orientationchange", function() {
if (window.orientation == "90" || window.orientation == "-90") {
//Do stuff
}
}, false);
答案 28 :(得分:0)
<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>
答案 29 :(得分:0)
如果您使用最新的浏览器,window.orientation
可能无法使用。在这种情况下,请使用以下代码获取角度-
var orientation = window.screen.orientation.angle;
这仍然是一项实验性技术,您可以检查浏览器的兼容性here
答案 30 :(得分:0)
某些设备不提供//datasource.properties
spring.datasource.password=${DB_PASSWORD}
事件,但是会触发窗口的resize事件:
orientationchange
不及方向更改事件那么明显,但效果很好。 Please check here