記一次移動端H5開發所遇到的問題與細節,以及ios相容
第一次弄移動端H5專案開發,雖然是簡單的頁面展示,但也遇到了很多細節問題與相容問題,尤其是h5視訊標籤video,
一.移動端禁止縮放 相容
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
主要屬性是user-scalable=no",
- width:視口的寬度,width=device-width:寬度是裝置的寬度
- initial-scale:初始化縮放,- initial-scale=1.0:不縮放
- user-scalable:是否允許使用者自行縮放,取值0或1,yes或no
- minimum-scale:最小縮放
- maximum-scale:最大縮放
- 一般設定了不允許縮放,就沒必要設定最大最小縮放了。
在開發移動端時,meta 還有很多屬性可以設定,比如
1.設定當前html檔案的字元編碼
<meta charset="UTF-8">
2.設定瀏覽器的相容模式(讓IE使用最新的瀏覽器渲染)
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
3.是用於設定禁止瀏覽器從本地機的快取中調閱頁面內容,設定後一旦離開網頁就無法從Cache中再調出
<meta http-equiv="Pragma" content="no-cache"/>
4.禁止將頁面中的一連串數字識別為電話號碼、並設定為手機可以撥打的一個連線。
這個標籤的預設值是telephone=yes。
<meta content="telephone=no" name="format-detection"/>
5.刪除預設的蘋果工具欄和選單欄
當我們需要顯示工具欄和選單欄時,這個行meta就不用加了,預設就是顯示。
<meta content="yes" name="apple-mobile-web-app-capable"/>
6.控制狀態列顯示樣式
content設定狀態列顏色,iphone的私有標籤,它指定的iphone中safari頂端的狀態條的樣式;
<meta content="black" name="apple-mobile-web-app-status-bar-style"/>
7.條件註釋
!--[if lt IE 9]>
<script src="lib/html5shiv/html5shiv.min.js"></script>
<script src="lib/respond/respond.min.js"></script>
<![endif]-->
- html5shiv讓瀏覽器可以識別html5的新標籤;
- respond讓低版本瀏覽器可以使用CSS3的媒體查詢。
8.iphone裝置中的safari私有meta標籤,它表示:允許全屏模式瀏覽;
<meta content="yes" name="apple-mobile-web-app-capable">
還有其他的這裡就不一一介紹了
<!-- 檢視視窗,移動端特屬的標籤。 -->
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no" />
<!-- 是否啟動webapp功能,會刪除預設的蘋果工具欄和選單欄。 -->
<meta name="apple-mobile-web-app-capable" content="yes" />
<!-- 這個主要是根據實際的頁面設計的主體色為搭配來進行設定。 -->
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<!-- 忽略頁面中的數字識別為電話號碼,email識別 -->
<meta name="format-detection" content="telephone=no, email=no" />
<!-- 啟用360瀏覽器的極速模式(webkit) -->
<meta name="renderer" content="webkit">
<!-- 避免IE使用相容模式 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- 針對手持裝置優化,主要是針對一些老的不識別viewport的瀏覽器,比如黑莓 -->
<meta name="HandheldFriendly" content="true">
<!-- 微軟的老式瀏覽器 -->
<meta name="MobileOptimized" content="320">
<!-- uc強制豎屏 -->
<meta name="screen-orientation" content="portrait">
<!-- QQ強制豎屏 -->
<meta name="x5-orientation" content="portrait">
<!-- UC強制全屏 -->
<meta name="full-screen" content="yes">
<!-- QQ強制全屏 -->
<meta name="x5-fullscreen" content="true">
<!-- UC應用模式 -->
<meta name="browsermode" content="application">
<!-- QQ應用模式 -->
<meta name="x5-page-mode" content="app">
<!-- windows phone 點選無高光 -->
<meta name="msapplication-tap-highlight" content="no">
二.
移動端Retina螢幕1px邊框問題
造成邊框變粗的原因:因為css中的1px並不等於移動裝置的1px,這些由於不同的手機有不同的畫素密度。在window物件中有一個devicePixelRatio屬性,他可以反應css中的畫素與裝置的畫素比。devicePixelRatio的官方的定義為:裝置物理畫素和裝置獨立畫素的比例,也就是 devicePixelRatio = 物理畫素 / 獨立畫素
1.設定0.5px邊框:解決方案是通過 JavaScript 檢測瀏覽器能否處理0.5px的邊框,如果可以,給html標籤元素添加個class。
if (window.devicePixelRatio && devicePixelRatio >= 2)
{
var testElem = document.createElement('div');
testElem.style.border = '.5px solid transparent';
document.body.appendChild(testElem); }
if(testElem.offsetHeight==1) {
document.querySelector('html').classList.add('hairlines');
}
document.body.removeChild(testElem);
} // 指令碼應該放在內,如果在裡面執行,需要包裝 $(document).ready(function() {})
然後使用:
div{border:1px solid #000}; . hairlines div{border-width:0.5px}
優點:程式碼簡單 缺點:無法相容安卓裝置、 iOS 8 以下裝置。
2.使用background-image實現
background-image:你要先準備一張符合你要求的圖片。然後將邊框模擬在背景上。
.background-image-1px { background: url(../img/line.png) repeat-x left bottom; -webkit-background-size: 100% 1px; background-size: 100% 1px; }
優點:可以設定單條,多條邊框 ;沒有效能瓶頸的問題 缺點:修改顏色麻煩, 需要替換圖片;圓角需要特殊處理,並且邊緣會模糊
3.使用box-shadow模擬邊框
利用css 對陰影處理的方式實現0.5px的效果;
.box-shadow-1px{box-shadow:inset 0 -1px 1px -1px #000;
優點:程式碼少,可滿足所有場景 缺點:邊框有陰影,顏色變淺;
4.viewport + rem 實現
同時通過設定對應viewport的rem基準值,這種方式就可以像以前一樣輕鬆愉快的寫1px了。
在devicePixelRatio = 2 時,輸出viewport:
<meta name="viewport" content="width=device-width,initial-scale=0.5,maximum-scale=0.5,minimum-scale=0.5,user-scalable=no">
在devicePixelRatio = 3 時,輸出viewport:<meta name="viewport" content="width=device-width,initial-scale=0.33333333333333333,maximum-scale=0.33333333333333333,minimum-scale=0.33333333333333333,user-scalable=no">
這種相容方案相對比較完美,適合新的專案,老的專案修改成本過大。 對於這種方案,可以看看《使用Flexible實現手淘H5頁面的終端適配》
優點:所有場景都能滿足;一套程式碼,可以相容基本所有佈局;這個也是我們開發移動端時需要使用的rem佈局,這個對移動端開發很重要,
缺點:老專案修改代價過大,只適用於新專案;
5.偽類 + transform 實現 針對老專案
原理是把原先元素的 border 去掉,然後利用 :before 或者 :after 重做 border ,並 transform 的 scale 縮小一半,原先的元素相對定位,新做的 border 絕對定位。 單條border樣式設定:
.scale{ position: relative; border:none; } .scale:after{ content: ''; position: absolute; bottom: 0; background: #000; width: 100%; height: 1px; -webkit-transform: scaleY(0.5); transform: scaleY(0.5); -webkit-transform-origin: 0 0; transform-origin: 0 0; }
三.判斷裝置型別是android還是ios
let u = navigator.userAgent;
let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android終端
let isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios終端
if(isAndroid) {
console.log('Android')
} else if(isiOS) {
console.log('IOS')
} else {
console.log('PC“)
},
/
/判斷訪問終端
var browser={
versions:function(){
var u = navigator.userAgent, app = navigator.appVersion;
return {
trident: u.indexOf('Trident') > -1, //IE核心
presto: u.indexOf('Presto') > -1, //opera核心
webKit: u.indexOf('AppleWebKit') > -1, //蘋果、谷歌核心
gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1,//火狐核心
mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否為移動終端
ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios終端
android: u.indexOf('Android') > -1 || u.indexOf('Adr') > -1, //android終端
iPhone: u.indexOf('iPhone') > -1 , //是否為iPhone或者QQHD瀏覽器
iPad: u.indexOf('iPad') > -1, //是否iPad
webApp: u.indexOf('Safari') == -1, //是否web應該程式,沒有頭部與底部
weixin: u.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增)
qq: u.match(/\sQQ/i) == " qq" //是否QQ
};
}(),
language:(navigator.browserLanguage || navigator.language).toLowerCase()
};
使用方法:
//判斷是否IE核心
if(browser.versions.trident){ alert("is IE"); }
//判斷是否webKit核心
if(browser.versions.webKit){ alert("is webKit"); }
//判斷是否移動端
if(browser.versions.mobile||browser.versions.android||browser.versions.ios){ alert("移動端"); }
檢查瀏覽器語言:
currentLang = navigator.language; //判斷除IE外其他瀏覽器使用語言if(!currentLang){//判斷IE瀏覽器使用語言currentLang = navigator.browserLanguage;}
四.ios滑動卡頓問題
-webkit-overflow-scrolling: touch;
五.ios移動端頭部底部fixed定位,輸入框收回閃屏問題
只需要在中間部分外層div新增css樣式
position:fixed;top:50px;bottom:50px;overflow:scroll
六.html在移動端IOS點選閃屏問題
html或者body{-webkit-tap-highlight-color: rgba(0, 0, 0, 0);}
七.打電話,發簡訊,寫郵件
1.打電話:<a href:"tel:10086">撥打10086</a>
2.發簡訊:<a href="sms:10086">發簡訊給10086</a> //winphone系統無效
3.發郵件:
//注:在新增這些功能時,第一個功能以"?"開頭,後面的以"&"開頭
//1.普通郵件 <a href="mailto:[email protected]">點選我發郵件</a>
//2.收件地址後新增?cc=開頭,可新增抄送地址(Android存在相容問題) <a href="mailto:[email protected][email protected]">點選我發郵件</a>
//3.跟著抄送地址後,寫上&bcc=,可新增密件抄送地址(Android存在相容問題) <a href="mailto:[email protected][email protected]&[email protected]">點選我發郵件</a>
//4.包含多個收件人、抄送、密件抄送人,用分號(;)隔開多個郵件人的地址 <a href="mailto:[email protected];[email protected]">點選我發郵件</a>
//5.包含主題,用?subject= <a href="mailto:[email protected]?subject=郵件主題">點選我發郵件</a> //6.包含內容,用?body=;如內容包含文字,使用%0A給文字換行 <a href="mailto:[email protected]?body=郵件主題內容%0A騰訊誠信%0A期待您的到來">點選我發郵件</a>
//7.內容包含連結,含http(s)://等的文字自動轉化為連結 <a href="mailto:[email protected]?body=http://www.baidu.com">點選我發郵件</a>
//8.內容包含圖片(PC不支援) <a href="mailto:[email protected]?body=">點選我發郵件</a>
">點選我發郵件</a>
八.修改移動端難看的點選的高亮效果,iOS和安卓下都有效
* { -webkit-tap-highlight-color: rgba(0,0,0,0); }
九.阻止旋轉螢幕時自動調整字型大小
* { -webkit-text-size-adjust: none; }
十.iOS下取消input在輸入的時候英文首字母的預設大寫
<input type="text" autocapitalize="none">
十一.移動端click螢幕產生200-300ms的延時響應
1.FastClick解決延遲點選的原始碼解析:
使用第三方js檔案
首先,我們來看FastClick的使用。
window.addEventListener(
"load"
,
function
() {
FastClick.attach( document.body );
},
false
);
2.
zepto的touch模組,tap事件也是為了解決在click的延遲問題
十二.input的placeholder會出現文字位置偏上的情況
input 的placeholder會出現文字位置偏上的情況:PC端設定line-height等於height能夠對齊,而移動端仍然是偏上,解決方案時是設定css
line-height:normal;