我正在为移动设备建立一个网站。有一页特别适合在横屏模式下浏览。
是否有一种方法来检测访问该页面的用户是否在纵向模式下查看它,如果是的话,显示一条消息通知用户该页面在横向模式下查看最好?如果用户已经在横屏模式下查看,则不会出现任何消息。
所以基本上,我想让网站检测视口的方向,如果方向是纵向,然后显示一个警告消息,建议用户这个页面最好在横向模式下查看。
我正在为移动设备建立一个网站。有一页特别适合在横屏模式下浏览。
是否有一种方法来检测访问该页面的用户是否在纵向模式下查看它,如果是的话,显示一条消息通知用户该页面在横向模式下查看最好?如果用户已经在横屏模式下查看,则不会出现任何消息。
所以基本上,我想让网站检测视口的方向,如果方向是纵向,然后显示一个警告消息,建议用户这个页面最好在横向模式下查看。
当前回答
我用的是Android Chrome的“屏幕朝向API”
要查看当前的方向,请调用console.log(screen.orientation.type)(也可以调用screen.orientation.angle)。
结果:肖像-主|肖像-次|景观-主|景观-次
下面是我的代码,希望对大家有所帮助:
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();
我只测试了Android Chrome -好的
其他回答
这是对之前答案的扩展。我发现的最好的解决方案是创建一个无害的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 + "!");
});
});
最好的部分是,在我写这个答案的时候,它似乎对桌面界面没有任何影响,因为它们(通常)没有(似乎)向页面传递任何朝向参数。
$(window).on("orientationchange",function( event ){
alert(screen.orientation.type)
});
有些设备不提供orientationchange事件,但会触发窗口的resize事件:
// Listen for resize changes
window.addEventListener("resize", function() {
// Get screen size (inner/outerWidth, inner/outerHeight)
}, false);
没有orientationchange事件那么明显,但是工作得很好。请在这里查看
另一种基于宽度/高度的比较来确定方向的方法:
var mql = window.matchMedia("(min-aspect-ratio: 4/3)");
if (mql.matches) {
orientation = 'landscape';
}
你在"resize"事件上使用它:
window.addEventListener("resize", function() { ... });
下面是我根据David Walsh的文章(检测移动设备的方向变化)找到的最好的方法。
if ( window.matchMedia("(orientation: portrait)").matches ) {
alert("Please use Landscape!")
}
解释:
match media()是一个本地方法,允许您定义媒体查询规则并在任何时间点检查其有效性。
我发现在这个方法的返回值上附加一个onchange侦听器很有用。例子:
var mediaQueryRule = window.matchMedia("(orientation: portrait)")
mediaQueryRule.onchange = function(){ alert("screen orientation changed") }