年後第一天到公司上班,整理一些在移動端H5開發常見的問題給你們作下分享,這裏不少是本身在開發過程當中遇到的大坑或者遭到過吐糟的問題,但願能給你們帶來或多或少的幫助,喜歡的大佬們能夠給個小贊,若是有問題也能夠一塊兒討論下。css
下面是最近一個月整理的JS基礎總結,可供你們溫故而知新。html
本人github: github.com/Michael-lzg前端
開箱即用的JS乾貨助力金三銀四
JS基礎總結(1)——數據類型
JS基礎總結(2)——原型與原型鏈
JS基礎總結(3)——做用域和閉包
JS基礎總結(4)——this指向及call/apply/bind
JS基礎總結(5)—— JS執行機制與EventLoopdvue
meta對於移動端的一些特殊屬性,可根據須要自行設置android
<meta name="screen-orientation" content="portrait"> //Android 禁止屏幕旋轉 <meta name="full-screen" content="yes"> //全屏顯示 <meta name="browsermode" content="application"> //UC應用模式,使用了application這種應用模式後,頁面講默認全屏,禁止長按菜單,禁止收拾,標準排版,以及強制圖片顯示。 <meta name="x5-orientation" content="portrait"> //QQ強制豎屏 <meta name="x5-fullscreen" content="true"> //QQ強制全屏 <meta name="x5-page-mode" content="app"> //QQ應用模式
在 iOS Safari (其餘瀏覽器和 Android 均不會)上會對那些看起來像是電話號碼的數字處理爲電話連接,好比:webpack
關閉識別ios
<meta name="format-detection" content="telephone=no" />
開啓識別git
<a href="tel:123456">123456</a>
安卓上會對符合郵箱格式的字符串進行識別,咱們能夠經過以下的 meta 來管別郵箱的自動識別:github
<meta content="email=no" name="format-detection" />
一樣地,咱們也能夠經過標籤屬性來開啓長按郵箱地址彈出郵件發送的功能:web
<a mailto:dooyoe@gmail.com">dooyoe@gmail.com</a>
移動端 H5 項目愈來愈多,設計師對於 UI 的要求也愈來愈高,好比 1px 的邊框。在高清屏下,移動端的 1px 會很粗。
那麼爲何會產生這個問題呢?主要是跟一個東西有關,DPR(devicePixelRatio) 設備像素比,它是默認縮放爲 100%的狀況下,設備像素和 CSS 像素的比值。目前主流的屏幕 DPR=2(iPhone 8),或者 3(iPhone 8 Plus)。拿 2 倍屏來講,設備的物理像素要實現 1 像素,而 DPR=2,因此 css 像素只能是 0.5。
下面介紹最經常使用的方法
/* 底邊框 */ .b-border { position: relative; } .b-border:before { content: ''; position: absolute; left: 0; bottom: 0; width: 100%; height: 1px; background: #d9d9d9; -webkit-transform: scaleY(0.5); transform: scaleY(0.5); -webkit-transform-origin: 0 0; transform-origin: 0 0; } /* 上邊框 */ .t-border { position: relative; } .t-border:before { content: ''; position: absolute; left: 0; top: 0; width: 100%; height: 1px; background: #d9d9d9; -webkit-transform: scaleY(0.5); transform: scaleY(0.5); -webkit-transform-origin: 0 0; transform-origin: 0 0; } /* 右邊框 */ .r-border { position: relative; } .r-border:before { content: ''; position: absolute; right: 0; bottom: 0; width: 1px; height: 100%; background: #d9d9d9; -webkit-transform: scaleX(0.5); transform: scaleX(0.5); -webkit-transform-origin: 0 0; transform-origin: 0 0; } /* 左邊框 */ .l-border { position: relative; } .l-border:before { content: ''; position: absolute; left: 0; bottom: 0; width: 1px; height: 100%; background: #d9d9d9; -webkit-transform: scaleX(0.5); transform: scaleX(0.5); -webkit-transform-origin: 0 0; transform-origin: 0 0; } /* 四條邊 */ .setBorderAll { position: relative; &:after { content: ' '; position: absolute; top: 0; left: 0; width: 200%; height: 200%; transform: scale(0.5); transform-origin: left top; box-sizing: border-box; border: 1px solid #e5e5e5; border-radius: 4px; } }
禁止用戶選擇頁面中的文字或者圖片
div { -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }
在 iOS 上,輸入框默認有內部陰影,以這樣關閉:
div { -webkit-appearance: none; }
代碼以下
img { -webkit-touch-callout: none; }
設置 input 裏面 placeholder 字體的顏色
input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { color: #c7c7c7; } input:-moz-placeholder, textarea:-moz-placeholder { color: #c7c7c7; } input:-ms-input-placeholder, textarea:-ms-input-placeholder { color: #c7c7c7; }
設置字體禁止縮放
body { -webkit-text-size-adjust: 100% !important; text-size-adjust: 100% !important; -moz-text-size-adjust: 100% !important; }
部分android系統點擊一個連接,會出現一個邊框或者半透明灰色遮罩, 不一樣生產商定義出來額效果不同。去除代碼以下
a,button,input,textarea{ -webkit-tap-highlight-color: rgba(0,0,0,0) -webkit-user-modify:read-write-plaintext-only; }
ios 手機上下滑動頁面會產生卡頓,手指離開頁面,頁面當即中止運動。總體表現就是滑動不流暢,沒有滑動慣性。 iOS 5.0 以及以後的版本,滑動有定義有兩個值 auto 和 touch,默認值爲 auto。
解決方案
.wrapper { -webkit-overflow-scrolling: touch; }
body { overflow-y: hidden; } .wrapper { overflow-y: auto; }
移動設備上的web網頁是有300ms延遲的,每每會形成按鈕點擊延遲甚至是點擊失效。解決方案:
觸摸事件的響應順序
這個不是bug,因爲自動播放網頁中的音頻或視頻,會給用戶帶來一些困擾或者沒必要要的流量消耗,因此蘋果系統和安卓系統一般都會禁止自動播放和使用 JS 的觸發播放,必須由用戶來觸發才能夠播放。加入自動觸發播放的代碼
$('html').one('touchstart', function() { audio.play() })
手指按住屏幕下拉,屏幕頂部會多出一塊白色區域。手指按住屏幕上拉,底部多出一塊白色區域。
在 iOS 中,手指按住屏幕上下拖動,會觸發 touchmove 事件。這個事件觸發的對象是整個 webview 容器,容器天然會被拖動,剩下的部分會成空白。
解決方案
document.body.addEventListener( 'touchmove', function(e) { if (e._isScroller) return // 阻止默認事件 e.preventDefault() }, { passive: false } )
將日期字符串的格式符號替換成'/'
'yyyy-MM-dd'.replace(/-/g, '/')
window.addEventListener('resize', function() { if ( document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA' ) { window.setTimeout(function() { if ('scrollIntoView' in document.activeElement) { document.activeElement.scrollIntoView(false) } else { document.activeElement.scrollIntoViewIfNeeded(false) } }, 0) } })
IOS 中 input 鍵盤事件 keyup、keydown、等支持不是很好, 用 input 監聽鍵盤 keyup 事件,在安卓手機瀏覽器中沒有問題,可是在 ios 手機瀏覽器中用輸入法輸入以後,並未馬上相應 keyup 事件
定位找到問題是 fastclick.js 對 IOS12 的兼容性,可在 fastclick.js 源碼或者 main.js 作如下修改
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.setSelectionRange(length, length) targetElement.focus() } else { targetElement.focus() } }
經過監聽鍵盤迴落時間滾動到原來的位置
window.addEventListener('focusout', function() { window.scrollTo(0, 0) }) //input輸入框彈起軟鍵盤的解決方案。 var bfscrolltop = document.body.scrollTop $('input') .focus(function() { document.body.scrollTop = document.body.scrollHeight //console.log(document.body.scrollTop); }) .blur(function() { document.body.scrollTop = bfscrolltop //console.log(document.body.scrollTop); })
軟鍵盤喚起後,頁面的 fixed 元素將失效,變成了 absolute,因此當頁面超過一屏且滾動時,失效的 fixed 元素就會跟隨滾動了。不只限於 type=text 的輸入框,凡是軟鍵盤(好比時間日期選擇、select 選擇等等)被喚起,都會遇到一樣地問題。
解決方法: 不讓頁面滾動,而是讓主體部分本身滾動,主體部分高度設爲 100%,overflow:scroll
<body> <div class='warper'> <div class='main'></div> <div> <div class="fix-bottom"></div> </body>
.warper { position: absolute; width: 100%; left: 0; right: 0; top: 0; bottom: 0; overflow-y: scroll; -webkit-overflow-scrolling: touch; /* 解決ios滑動不流暢問題 */ } .fix-bottom { position: fixed; bottom: 0; width: 100%; }
從零開始構建一個webpack項目
總結幾個webpack打包優化的方法
總結前端性能優化的方法
幾種常見的JS遞歸算法
搭建一個vue-cli的移動端H5開發模板
封裝一個toast和dialog組件併發布到npm
一文讀盡前端路由、後端路由、單頁面應用、多頁面應用
關於幾個移動端軟鍵盤的坑及其解決方案
淺談JavaScript的防抖與節流
關注的個人公衆號不按期分享前端知識,與您一塊兒進步!