简短的回答:
很遗憾,目前没有办法检测虚拟键盘何时出现。但是可以通过以下方式检测屏幕方向:
- 使用CSS媒体查询(如您的示例)
- 使用JavaScript监听
orientationchange
事件。
- 使用JavaScript监听
resize
事件,并通过window.innerHeight > window.innerWidth
来推断方向。
详细的回答:
理论上讲,虚拟键盘不应该影响由CSS媒体查询解释的orientation
属性。
@media screen and (orientation: landscape) {
...
}
W3C的媒体查询推荐中针对orientation
属性的说明如下:
当‘height’媒体特性的值大于或等于‘width’媒体特性的值时,‘orientation’媒体特性为‘portrait’。否则,‘orientation’为‘landscape’。
在表单文本框字段中输入时,键盘出现不应触发orientation
属性更改。
过去,在使用设备仿真器(例如Google Chrome devtools旧版本中的Device Mode)时,我曾遇到过您的问题。然而,当在真实移动设备上进行测试时,该问题并未发生。
此外,移动版Chrome中存在错误,可能会导致键盘出现时触发调整大小事件。
也许如果您正在使用仿真器,则会错误地导致视口高度发生变化,从而导致在媒体查询中更改orientation
属性。
我提供的简单要点如下(
您可以在开发环境中运行它以查看发生了什么):
- 当移动设备处于纵向方向时,屏幕显示两个表单输入字段(显示单词:“foo”和“baz”)。
- 当我触摸任一表单输入字段时,键盘会显示,页面内容不会更改。
- 当设备旋转90度到横向方向时,会出现一个灰色面板,显示单词:“将设备旋转至纵向方向”
注意:上述步骤是在几台真实移动设备上测试下面的要点时发生的,这些设备运行着iOS上的Safari和Android上的移动Chrome(...不是模拟器!)。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>StackOveflow question 40175207</title>
<meta name="description" content="Example gist using orientation css media query to hsow message when device is landscape" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<style type="text/css">
body {
padding: 0;
margin: 0;
}
.wrapper {
position: absolute;
width: 100%;
height: 100%;
overflow: hidden;
padding: 0;
margin: 0;
}
.message-panel {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: gray;
-webkit-transform: translateX(100%);
transform: translateX(100%);
will-change: transform;
}
.message-panel__text {
position: absolute;
top: 50%;
text-align: center;
font: 1em Helvetica, sans-serif;
width: 100%;
height: 50px;
margin: auto;
-webkit-transform: translateX(-50%);
transform: translateY(-50%);
}
@media screen and (orientation: landscape) {
.message-panel {
transform: translateX(0);
}
}
</style>
</head>
<body>
<div class="wrapper">
<form>
<input type="text" name="input-one" value="foo">
<input type="text" name="input-two" value="baz">
</form>
<div class="message-panel">
<div class="message-panel__text">Rotate your device to portrait</div>
</div>
</div>
</body>
</html>
PS:在Chrome for Android中还有Web应用程序清单,可以锁定设备的方向。有关更多信息,请参见此处。
希望这能帮到您!