01、ios端相容input高度
#問題描述
input輸入框游標,游標的高度和父盒子的高度一樣,而android手機沒問題
android
ios
#產生原因
通常我們習慣用height屬性設定行間的高度和line-height屬性設定行間的距離(行高),當點選輸入的時候,游標的高度就自動和父盒子的高度一樣了。(谷歌瀏覽器的設計原則,還有一種可能就是當沒有內容的時候游標的高度等於input的line-height的值,當有內容時,游標從input的頂端到文字的底部
#解決
padding 去替換 line-height
.content {
box-sizing: border-box; height: 88px; .content-input { display: block;//塊元素 box-sizing: border-box;//怪異盒模型 width: 100%; font-size: 28px; //line-height: 88px; padding: 30px 0; } }
02、ios上下滑動頁面卡頓,頁面缺失
#問題描述
在ios端,上下滑動頁面時,如果頁面高度超出了一屏,就會出現明顯的卡頓,頁面有部分內容顯示不全的情況,例如下圖,右圖是正常頁面,邊是ios上下滑動後,卡頓導致如左圖下面部分丟失。
#產生原因
微信瀏覽器的核心,Android上面是使用自帶的WebKit核心,iOS裡面由於蘋果的原因,使用了自帶的Safari核心,Safari對於overflow-scrolling用了原生控制元件來實現。對於有-webkit-overflow-scrolling的網頁,會建立一個UIScrollView,提供子layer給渲染模組使用。
原來在iOS5.0以及之後的版本,滑動有定義兩個值auto和touch,預設值為auto.
-webkit-overflow-scrolling:touch; 當手指從觸控式螢幕上移開,會保持一段時間的滾動.
-webkit-overflow-scrolling:auto; 當手指從觸控式螢幕上移開,滾動會立即停止.
#解決
方案一
在需要滑動的位置加上如下css程式碼:
overflow:scroll;
-webkit-overflow-scrolling:touch;
#存在問題
1、在滑動介面之中使用的position:fixed 無法固定下來,會隨著介面進行一起滾動
解決方法:將使用的position:fixed(頭部導航)寫在滑動部位外部,在使用絕對定位進行佈局,以此解決問題
2、vue中使用v-if導致的介面初始化之後無法滑動
解決方法:將v-if改成v-show進行展示,解決介面進入之後第一次不能滑動的問題
#擴充套件
-webkit-overflow-scrolling 屬性控制元素在移動裝置上是否使用滾動回彈效果.auto: 使用普通滾動, 當手指從觸控式螢幕上移開,滾動會立即停止。touch: 使用具有回彈效果的滾動, 當手指從觸控式螢幕上移開,內容會繼續保持一段時間的滾動效果。繼續滾動的速度和持續的時間和滾動手勢的強烈程度成正比。同時也會建立一個新的堆疊上下文
03、input輸入框在iOS中獲取到焦點之後介面上移無法回落問題
#問題描述
輸入內容,軟鍵盤彈出,頁面內容整體上移,但是鍵盤收起,頁面內容不下滑
#產生原因
固定定位的元素 在元素內 input 框聚焦的時候 彈出的軟鍵盤佔位 失去焦點的時候軟鍵盤消失 但是還是佔位的 導致input框不能再次輸入 。
#解決
<input class="content-input" placeholder="請輸入姓名" v-model="peopleList.name" @blur.prevent="changeBlur()" />
changeBlur(){ let u = navigator.userAgent, app = navigator.appVersion; let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); if(isIOS){ setTimeout(() => { const scrollHeight = document.documentElement.scrollTop || document.body.scrollTop || 0 window.scrollTo(0, Math.max(scrollHeight - 1, 0)) }, 200) } }
#擴充套件
- prevent: 阻止預設事件
- blur: 失去焦點
- position:fixed 的元素在ios裡,收起鍵盤的時候會被頂上去,特別是第三方鍵盤
04、介面點反應慢、延時問題解決方案
#產生原因
iOS巢狀介面之後,介面點選效果會自動產生一個300毫秒的延時
#解決
1、下載fastclick
npm i -S fastclick
2、引入
FastClick.attach(document.body);
#存在問題
引入fastclick之後,會有一個副作用:input輸入框需要連續點選兩次或者長按才能獲取焦點
|解決
再引入fastClick的js中加入如下程式碼即可解決input輸入框點選不能獲取焦點的問題
FastClick.prototype.focus = function(targetElement) { var length; if (deviceIsIOS&& targetElement.setSelectionRange &&
targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' &&
targetElement.type !== 'month') { length = targetElement.value.length; targetElement.focus(); targetElement.setSelectionRange(length, length); } else { targetElement.focus(); } };
05、new Date()轉換時間在iOS中不生效問題
#產生原因
前端介面使用new Date('2021-3-14 23:59:59').getTime(),iOS不解析。
#解決
換用其他格式:new Date('2021-3-14T23:59:59').getTime()
06、關於部分拷貝方法在iOS中不生效問題
#解決
前端有時候需要用到拷貝部分內容到剪下板中,但是在使用時發現,部分網上提供的拷貝方法在Android中正常使用,但是在iOS中無法進行拷貝,經過試驗發現一種通用的拷貝方法,如下:
/** * 將內容拷貝到剪下板中 */ function copyContent(message) { // text: 要複製的內容, callback: 回撥 var input = document.createElement("input"); input.value = message; document.body.appendChild(input); input.select(); input.setSelectionRange(0, input.value.length); document.execCommand('Copy'); document.body.removeChild(input); }
07、android彈出的鍵盤遮擋輸入框
#解決
給input和textarea標籤新增focus事件
先判斷是不是安卓手機下的操作,當然,可以不用判斷機型,Document 物件屬性和方法,setTimeout延時0.5秒,因為呼叫安卓鍵盤有一點遲鈍,導致如果不延時處理的話,滾動就失效了
changefocus(){ let u = navigator.userAgent, app = navigator.appVersion; let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; if(isAndroid){ setTimeout(function() { document.activeElement.scrollIntoViewIfNeeded(); document.activeElement.scrollIntoView(); }, 500); } },
08、iOS上拉邊界下拉出現白色空白
#問題描述
手指按住 螢幕下拉,螢幕頂部會多出一塊白色區域.手指按住螢幕上拉,底部多出一塊白色區域。
#產生原因
在iOS中,手指按住螢幕上下拖動,會觸發touchmove事件.這個事件觸發的物件時整個webview容器.容器自然會被拖動,剩下的部分會成空白
#解決
<template> <div id="app" @touchmove="handleTouch"> <div id="nav"> <router-link to="/">Home</router-link> | <router-link to="/about">About</router-link> </div> <router-view/> </div> </template> <script> export default { created () { document.body.addEventListener('touchmove', (e) => { if (e._isScroller) return; e.preventDefault() }, { passive: false }) }, methods: { handleTouch (e) { e._isScroller = true } } } </script> <style> html,body { height: 100%; overflow: hidden; } #app { height: 100%; overflow-y: auto; overflow-x: hidden; } <style>