軟鍵盤彈出和收起邏輯說明

1. 軟鍵盤彈出的邏輯說明

(1) 邏輯說明:App平臺軟鍵盤彈出有 adjustResize|adjustPan 兩種模式,默認為 adjustPan 模式,小程序平臺只支持 adjustPan 模式,H5平臺因不同瀏覽器而異

  • adjustResize:軟鍵盤彈出時,webview窗體高度擠壓(頁面變形)。屏幕高度=webview窗體高度+軟鍵盤高度
  • adjustPan:軟鍵盤彈出時,webview窗體高度不變,但窗體上推,以保證輸入框不被軟鍵盤蓋住

(2) 配置方式,在 pages.json 中配置 style

"app-plus": {
    "softinputMode": "adjustPan"
}

注意:adjustResize模式在Android App上,彈起鍵盤和收回鍵盤時,因為要重設webview窗體高度,可能會在個別安卓機型閃現灰屏或漏出下層頁面內容。
疑問:HbuilderX升級后,雖然softinputMode設為adjustPan,但輸入框聚焦軟鍵盤彈出時頁面仍被擠壓??赏ㄟ^給被壓縮的區域設置一個最小高度(即一個能讓所有元素按原來布局排列的高度)來解決頁面變形問題,參考手機軟鍵盤彈起導致頁面變形的一種解決方案
示例:設置中間被壓縮區域最小高度min-height: 300upx;

<template>
    <view class="uni-flex uni-column" style="width: 100%;height: 100%;">
        <view class="uni-flex uni-row justify-end align-center" style="width: 100%;height: 14%;">1.頂部區域</view>
        
        <view class="uni-flex uni-row justify-center align-center" style="width: 100%;height: 72%;min-height: 300upx;">
            <view class="flex-treble uni-flex justify-center align-center" style="height: 100%;">2.1中間左邊區域</view>
            
            <view class="flex-five uni-flex uni-column justify-center align-center" style="height: 100%;">
                <view class="flex-treble uni-flex uni-row justify-center align-center" style="width: 100%;">2.2主區域-(1)頂部</view>

                <view class="flex-four uni-flex uni-column justify-center align-center" style="width: 100%;">
                    <view class="flex-sub uni-flex uni-column justify-start align-center padding-lr-15" style="width: 100%;">
                        <view class="uni-flex uni-row justify-start align-center" style="width: 100%;">
                            <image class="icon_user" src="../../static/icon_user.png"></image>
                            <input v-model="account" placeholder="輸入用戶名"></input>
                        </view>
                        <view class="shape_line"></view>
                    </view>

                    <view class="flex-sub uni-flex uni-column justify-start align-center padding-lr-15" style="width: 100%;">
                        <view class="uni-flex uni-row justify-start align-center" style="width: 100%;">
                            <image class="icon_password" src="../../static/icon_password.png"></image>
                            <input password v-model="password" placeholder="輸入密碼"></input>
                        </view>
                        <view class="shape_line"></view>
                    </view>
                </view>

                <view class="flex-twice uni-flex uni-row justify-center align-center padding-lr-15" style="width: 100%;">
                    <button class="flex-sub  @tap="userLogin">登錄</button>
                    <view class="flex-sub">2.2主區域-(3)底部</view>
                    <button class="flex-sub">注冊帳號</button>
                </view>
            </view>

            <view class="flex-sub uni-flex  justify-center align-center" style="height: 100%;">2.3中間右邊區域</view>
        </view>
        
        <view style="width: 100%;height: 14%;">3.底部區域</view>
        
    </view>
</template>

2. 軟鍵盤收起的邏輯說明

(1) 邏輯說明

  • Android上在軟鍵盤彈出后,點擊back或點擊非置焦區域可收起軟鍵盤。
  • iOS上如果軟鍵盤上方有帶有“完成”的橫條,則需要點完成才能收起鍵盤;如果沒有軟鍵盤上方橫條,則點擊非input/textarea區域即可收起軟鍵盤。

以上為默認邏輯,uni-app同時提供了隱藏軟鍵盤的api:uni.hideKeyboard()。

uni.hideKeyboard();//隱藏軟鍵盤
// plus.key.hideSoftKeybord();

注意:它只隱藏已經顯示的軟鍵盤,如果軟鍵盤沒有顯示則不做任何操作。在實際應用中,如外接掃碼槍時,不能通過該api來實現完全禁用軟鍵盤的效果。

focus:function(){
    console.log("輸入框聚焦");
    // 并不能完全禁用軟鍵盤
    setTimeout(function(){
        uni.hideKeyboard();//隱藏軟鍵盤
        // plus.key.hideSoftKeybord();
    },250);
            
},
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容