android界面布局錯位,IOS 瀏覽器頁面布局錯位(如:點不到)的分析與解決

IOS 瀏覽器頁面布局錯位(如:點不到)的分析與解決

IOS 瀏覽器軟鍵盤的拉起與收縮、微信 IOS 瀏覽器底部導航條的顯示與隱藏,很容易導致頁面布局錯位(相對窗體的絕對定位元素):

明明按鈕在這里,卻要在上面一點兒點擊屏幕才能點到它

明明彈框是居中顯示的,卻向上偏移了很多,導致下面很多空白

明明是固定浮動在某個位置,卻點不到它

1. Android 與 IOS 的差異

在 Android 中,軟鍵盤的彈起與收縮會觸發 window 對象的 resize 事件,而 IOS 不會

微信 IOS 瀏覽器底部導航條的顯示與隱藏會觸發 window 對象的 resize 事件,而 Android 中沒有底部導航條

2. IOS 里的一些特性

為了達到極致的體驗,IOS 瀏覽器很多特性是不遵循 W3C 規范的

軟鍵盤的彈起與收縮不會觸發 window 對象的 resize 事件

軟鍵盤收縮后,固定定位的元素處于錯位狀態,需要滑動頁面后才能刷新頁面恢復到正常狀態

3. 具體情況分析

不管是 IOS 瀏覽器軟鍵盤的拉起與收縮,還是微信 IOS 瀏覽器底部導航條的顯示與隱藏,都是改變的 window 窗體的大小。

微信 IOS 瀏覽器底部導航條的顯示與隱藏跟軟鍵盤的拉起與收縮是差不多的,但微信 IOS 瀏覽器底部導航條還有一個很大的特點:

在單頁面應用(SPA)中,當路由發生變化時,底部導航條會一下子就顯示,而這很難確定是先渲染了頁面還是先顯示了底部導航條,

這也很容易導致元素布局錯位。

4. 怎么解決

4.1 監聽鍵盤彈起與收縮,自動做一些操作

新建 watch-keyboard.js 腳本,引入到頁面中。

當頁面中鍵盤彈起時,body 會有 keyboard-active class,可以根據這個隱藏一些元素。

import {isIos} from '../utils';

import debounce from 'lodash/debounce';

// 初始高度

const winHeight = window.innerHeight;

// 判斷是不是彈起了軟鍵盤

const judgeDistance = 200;

if (!isIos) {

window.addEventListener(

'resize',

debounce(() => {

if (window.innerHeight < winHeight - judgeDistance) {

// 鍵盤彈起

document.body.classList.add('keyboard-active');

} else {

document.body.classList.remove('keyboard-active');

}

}, 300),

!1

);

}

else {

// IOS 軟鍵盤的彈起與收縮不會觸發 `window` 對象的 `resize` 事件,用定時器實現

// 保證能夠滾動

document.body.style.minHeight = (winHeight + 2) + 'px';

// 上兩次高度記錄

let secondLastWinHeight = winHeight;

// 上一次高度記錄

let lastWinHeight = winHeight;

setInterval(() => {

const newWinHeight = window.innerHeight;

// 變化結束

if (secondLastWinHeight !== lastWinHeight && lastWinHeight === newWinHeight) {

if (newWinHeight < winHeight - judgeDistance) {

// 鍵盤彈起

document.body.classList.add('keyboard-active');

} else {

document.body.classList.remove('keyboard-active');

// window 需要滾動一下,讓頁面刷新一下,否則彈框會出現錯位的問題

window.scrollTo(0, window.scrollY ? window.scrollY - 1 : 1);

}

}

secondLastWinHeight = lastWinHeight;

lastWinHeight = newWinHeight;

}, 300); // 可以根據需要調整間隔時間(越小越精確)

}

4.2 監聽窗體大小變化,執行一個回調,做更多操作

當軟鍵盤彈起時,又點擊了一個按鈕,然后顯示彈框(如:從底部向上彈出)的時候,這個時候就需要等待軟鍵盤收起之后,IOS 刷新屏幕之后,再顯示彈框。

新建 wait-for-stable-win-height.js 腳本,引入到頁面中。

import { isIos } from '../utils';

/**

* 等待 window 高度不變了之后執行一個回調函數

*

* @param onComplete 完成的回調

* @param delay 延遲多少時間再判斷

* @param interval 定時器間隔時間

*/

export default ({ onComplete, delay = 200, interval = 50 }) => {

setTimeout(() => {

let winHeight = window.innerHeight;

const timer = setInterval(() => {

const newWinHeight = window.innerHeight;

if (winHeight === newWinHeight) {

clearInterval(timer);

if (onComplete) {

if (!isIos) {

setTimeout(() => {

onComplete();

}, 100);

return;

}

// window 需要滾動一下,讓頁面刷新一下,否則彈框會出現錯位的問題

window.scrollTo(0, window.scrollY ? window.scrollY - 1 : 1);

setTimeout(() => {

onComplete();

}, 200);

}

} else {

winHeight = newWinHeight;

}

}, interval);

}, delay);

};

后續

版權聲明:自由轉載-非商用-非衍生-保持署名(創意共享 3.0 許可證)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397835.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397835.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397835.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

做進度條 根據自己的數據顯示進度

做了很多種方法 1&#xff1a; 線程 thread的方法 2&#xff1a; backGroundWorker的方法 3&#xff1a; 自定義線程類 4&#xff1a; 做一個進度條的窗體 通過自定義設置做&#xff08;最方便快捷&#xff09; public partial class waitingProcessbar : Form{public waitin…

視圖和模型變換

視圖變換&#xff0c;是指變換照相機的位置&#xff0c;角度。 模型變換&#xff0c;是指變換被照物體的位置&#xff0c;角度。 這兩個變換&#xff0c;都會影響最終圖形中&#xff0c;物體的位置&#xff0c;角度。而這兩個變換&#xff0c;可以達到相同的效果。比如&#x…

phoenix的元數據一般存在哪里_Phoenix的一些問題

date: 2020-09-10 13:50:00updated: 2020-09-14 16:30:001. Phoenix索引全局索引&#xff1a;適合讀多寫少的場景。寫數據時因為索引表分布在不同數據節點&#xff0c;跨節點數據傳輸帶來巨大的性能消耗。全局索引必須是查詢語句中所有列都包含在全局索引中&#xff0c;它才會生…

鴻蒙os全面升級,華為突然宣布,鴻蒙OS正式版6月底全面升級,幸福來得太突然...

原標題&#xff1a;華為突然宣布&#xff0c;鴻蒙OS正式版6月底全面升級&#xff0c;幸福來得太突然摘要&#xff1a;早在今年2月華為Mate X2折疊屏新品發布會上&#xff0c;余承東曾表示&#xff0c;鴻蒙OS正式版將于今年4月份全面上線。或許是因為華為宣布賣車分散了很多的精…

5-python學習——條件語句

5-python學習——條件語句 5-python學習——條件語句 條件語句if else形式if else條件語句說明 測試一下編程語言一般都由這么幾個部分組成 變量條件分支語句循環語句函數這里要說的就是條件分支語句。 python的條件語句和shell腳本的非常像&#xff0c;也就是if else if else這…

eclipse啟動失敗:An internal error occurred during: reload maven project

2019獨角獸企業重金招聘Python工程師標準>>> 1.找到workspace文件夾下的/.metadata文件夾&#xff0c;將其刪除掉&#xff0c;然后在講項目重新導入進去eclipse中。但是這個有一點不好的地方&#xff0c;之前對eclipse所做的配置也會恢復為默認配置 2.在.metadata下…

Quartz2D知識點聚合案例

Quartz2D知識點聚合 基本 //畫圖片UIImage *image [UIImage imageNamed:"阿貍頭像"];[image drawInRect:rect];//字體NSString *title "標題";NSMutableDictionary *atr [NSMutableDictionary dictionary];atr[NSFontAttributeName] [UIFont systemFon…

skt7850鴻蒙策略,lol 英雄聯盟 SKT狀態回暖輕取外卡,SUP難擋Faker

MSI 第四日 SUP vs SKT雙方bpBAN LISTBAN&#xff1a;SUP:流浪 牛頭 豹女SKT&#xff1a;巴德 妖姬 魚人PICKSUP:大樹 男槍 冰女 盧錫安 錘石SKT&#xff1a;艾克 千玨 沙皇 EZ 布隆比賽開始&#xff0c;雙方正常對線開局。前期下路錘石多次勾中ez&#xff0c;男槍也來逼出EZ布…

spring集成struts2

Struts2前身是WebWork&#xff0c;核心并沒有改變&#xff0c;其實就是把WebWork改名為struts2&#xff0c;與Struts1一點關系沒有。 Struts2中通過ObjectFactory接口實現創建及獲取Action實例&#xff0c;類似于Spring的IoC容器&#xff0c;所以Action實例可以由ObjectFactory…

slqite3庫查詢數據處理方式_SQLite3命令操作大全

SQLite3命令操作大全SQLite庫包含一個名字叫做sqlite3的命令行,它可以讓用戶手工輸入并執行面向SQLite數據庫的SQL命令。本文檔提供一個樣使用sqlite3的簡要說明.一.qlite3一些常用Sql語句操作創建表: create table 表名(元素名 類型,…);刪除表: drop …

Android學習之查看網絡圖片

在這里小編學習了查看網絡圖片的小案例,: 初始界面: 點擊瀏覽后,效果如下: 需要注意的是 該案例需要獲取聯網權限,即: <uses-permission android:name"android.permission.INTERNET"/>具體步驟如下: 1.定義并初始化控件: private EditText etImageUrl;private …

AutoLayout 淺析動畫

1.AutoLayout相關的幾個易混淆的方法 setNeedsLayout layoutIfNeeded layoutSubViews setNeedsUpdateConstraints updateConstraitsIfNeed updateConstraints 子視圖在界面上的顯示大概經過了&#xff1a;更新約束-通過約束依賴關系得到具體的frame-展示到界面。上面幾個是和au…

vue 轉為靜態html,Vue CLI 3使用:HTML和靜態資源(五)

HTMLpublic/index.html 文件是一個會被 html-webpack-plugin 處理的模板。構建中&#xff0c;各種資源路徑會被注入解析。可以使用 lodash template 語法插入內容。用來做不轉義插值&#xff1b;用來做 HTML 轉義插值&#xff1b;用來描述 JavaScript 流程控制。除了被 html-we…

animate css3 應用的借鑒,一個同事寫的JS

$("#banner").height($(window).height()-125);$(window).resize(function(){ $("#banner").height($(window).height()-125);}); //首頁幻燈$(".indeximgs:first").show();var i0;$(".leftbut").click(function(){$(".indexim…

從html導出帶樣式的excel,Jquery導出帶樣式的Excel

工作中做導出的時候&#xff0c;需要導出自定義的表格或嫌棄導出的Excel格式太難看了。需要設置顏色、字號大小、加粗、合并單元格等等。特性&#xff1a;支持過濾 某個位置支持過濾 img 標簽支持過濾 a 標簽支持過濾 input 標簽支持包含 行內樣式。HTML頁面&#xff1a;HTML頁…

elementui from表單提交_elementui upload與form一起提交

學生基本信息管理操作中&#xff0c;有照片&#xff0c;可以上傳也可以不上傳&#xff0c;在表單界面可以修改照片&#xff0c;el-upload控件可以帶額外參數提交&#xff0c;jquery的post模擬不了成表單帶文件提交的方式&#xff0c;因此&#xff0c;判斷如果有上傳文件時&…

information_schema.character_sets 學習

information_schema.character_sets 表用于查看字符集的詳細信息 1、character_sets 常用列說明&#xff1a; 1、character_set_name&#xff1a;    字符集名 2、default_collate_name&#xff1a;    默認排序規則   3、description&#xff1a;         …

asp.net mvc 用Redis實現分布式集群共享Session。

1、這兩天研究Redis搞分布式session問題&#xff0c;網上找的資料都是用ServiceStack.Redis來實現的&#xff0c;但是在做性能測試的時候發現最新的v4版本有限制每小時候最多請求6000次&#xff0c;因為官網開始商業化要收費了&#xff0c;好坑爹的說&#xff0c;還好我前期弄了…

如何用計算機求和,求和計算器

求和計算器您可以使用此求和計算器快速計算預定范圍內某個表達式的序列之和。如何使用求和計算器輸入總和的表達式輸入上限和下限提供表達式中使用的變量的詳細信息單擊“計算”按鈕生成結果。求和Σ符號計算器k ∑n 0變量:nixyzabc 103740支持的運算符常量和函數算術運算符加“…

Zookeeper概述、特點、數據模型

Zookeeper1.Zookeeper概述Zookeeper是一個工具&#xff0c;可以實現集群中的分布式協調服務。所謂的分布式協調服務&#xff0c;就是在集群的節點中進行可靠的消息傳遞&#xff0c;來協調集群的工作。Zookeeper之所以能夠實現分布式協調服務&#xff0c;靠的就是它能夠保證分布…