移動端中軟鍵盤彈出影響頁面佈局
在一個移動端的頁面上的input中輸入時,彈出的軟鍵盤會佔據window的位置。
如果當前頁面的中有絕對定位的元素,例如在頁面底部有一個position:fixed;bottom:0;的按鈕,當軟鍵盤彈起時,window的高度是窗體的頂部到軟鍵盤之上,底部絕對定位的元素就會覆蓋在輸入框之上,影響輸入。
這個問題一般出現在Android系統中。
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
<meta https-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>安卓端軟鍵盤問題</title>
<script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
<style type="text/css">
html,body,div{margin: 0;}
.message{height: 100px;}
.input-box{height: 50px;line-height: 50px;margin-top: 10px;padding: 10px;}
.input-box label{display:inline-block;width: 50px;}
.input-box input{width:80%;height: 30px;}
.footer-nav{position: fixed;bottom: 0;width: 100%;height: 50px;line-height: 50px;text-align: center;color: #ffffff;background-color: #055DAD;}
</style>
</head>
<body>
<div class="container">
<div class="message">
頁面底部有絕對定位的元素。
</div>
<div class="input-box">
<label>姓名</label>
<input type="text" placeholder="請輸入姓名">
</div>
<div class="input-box">
<label>電話</label>
<input type="text" placeholder="請輸入電話">
</div>
<div class="input-box">
<label>電話</label>
<input type="text" placeholder="請輸入地址">
</div>
<div class="footer-nav">完成提交</div>
</div>
</body>
</html>
目前我是實踐中解決這個問題是方法是:監控窗體的大小變化resize事件,窗體大小變化超過一定的閾值時,判斷為軟鍵盤彈出,彈出後將body元素的高度設定為軟鍵盤彈出前的高度,軟鍵盤關閉後將body元素的高度設定為100%
<script>
var winHeight = $(window).height(); //獲取當前頁面高度
$(window).resize(function() {
//當窗體大小變化時
var thisHeight = $(this).height(); //窗體變化後的高度
if (winHeight - thisHeight > 50) {
/*
軟鍵盤彈出
50是設定的閾值,用來排除其他影響窗體大小變化的因素,比如有的瀏覽器的工具欄的顯示和隱藏
*/
$(`body`).css(`height`, winHeight + `px`);
} else {
/*
軟鍵盤關閉
*/
$(`body`).css(`height`, `100%`);
}
});
</script>