網(wǎng)頁適配移動端問題總結,持續(xù)更新

兼容性

CSS偽類:active

如果你想使用元素的偽類來實現(xiàn) 按下激活 狀態(tài),那么你需要知道以下問題:

  • iOS上的幾乎任何瀏覽器筋现,定義元素的偽類 :active 都是無效;
  • Android上箱歧,Android BrowserChrome 都支持偽類 :active 矾飞,其它第三方瀏覽器有部分不支持;
  • 定義了 :active 并且當前瀏覽器環(huán)境支持呀邢,當手指在滾動或者無意間的劃過時洒沦,:active 狀態(tài)都會被激活;

為了規(guī)避上述所有的問題价淌,如果需要 按下激活 狀態(tài)申眼,推薦使用 js 新增一個 className

清除輸入框內(nèi)陰影

iOS上的幾乎任何瀏覽器輸入框(input, textarea)默認有內(nèi)部陰影,但無法使用 box-shadow 來清除蝉衣,如果不需要陰影括尸,可以這樣關閉:

input,
textarea {
    /* 方法1: 去掉邊框 */
    border: 0;

    /* 方法2: 邊框色透明 */
    border-color: transparent;

    /* 方法3: 重置輸入框默認外觀 */
    -webkit-appearance: none;
    appearance: none;
}

Samsung S4圓角Bug

Samsung S4 手機在 Android Browser4.4.2 上(其他版本未測),如果你使用了 border-radius病毡,并且使用了 -webkit-transform 屬性濒翻,當使用了 translatez 或者 translate3d 值,圓角會出現(xiàn)問題:

<style>
.test {
    border: 2px solid red;
    width: 50px;
    height: 50px;
    border-radius: 50%;
    background-color: gray;
    box-shadow: 0 2px 5px rgba(0, 0, 0, .3);
    -webkit-transform: translate(0, 0) translatez(0);
    transform: translate(0, 0) translatez(0);
}
</style>
<div class="test"></div>

如上代碼啦膜,-webkit-transform: translate(0, 0) translatez(0) 將會導致圓角無法包裹住 background-color有送。

當然,-webkit-transform: translate3d(0, 0, 0) 也是一樣的僧家,所以如果你的某個場景是這樣的雀摘,那么可以直接使用 -webkit-transform: translate(0, 0) 來避免這個問題。

邊框圓角致背景溢出

在紅米和OPPO等手機某些版本的 Android Webview 中八拱,如果一個元素定義了 border + border-radius阵赠,這時如果該元素有背景,那么背景將會溢出圓角之外肌稻。

之所以會出現(xiàn)這個問題:其主要原因是因為CSS對背景裁剪(background-clip)有不同的處理方式清蚀,通常它可以是 border-box | padding-box | content-box 這3種方式。

瀏覽器的默認裁減方式是 border-box灯萍,即溢出 border 之外的背景都將被裁減轧铁。

對于上述無法裁減邊框之外背景的手機每聪,將值定義為 padding-box | content-box 都能fix這問題旦棉,不過更推薦使用 padding-box齿风。因為使用 content-box,如果定義了 padding 不為 0绑洛,背景將無法鋪滿元素救斑。

一個失敗的圓(圓角)

在移動平臺上開發(fā)時,用CSS畫一個圓很簡單真屯,只需要一句代碼:

.circle {
    border-radius: 50%;
}

不過脸候,在 Android Browser2.* 上,這個定義將會失效绑蔫,而顯示為默認的矩形运沦。

因為 Android Browser2.* 不支持以 百分比 作為 border-radius 的值,所以如果你需要兼容 Android Browser2.*配深,那么你可以這樣:

.circle {
    width: 10rem;
    height: 10rem;
    border-radius: 5rem;
}

如果你覺得這樣定義不夠靈活携添,想懶一點,那么其實可以給 border-radius 預設一個比較大的值篓叶,比如 100rem烈掠,用以避免當元素的尺寸變了,圓角半徑也得跟著變缸托,除非元素的尺寸超出了你預設的閥值左敌。

不要使用偽元素動畫

有的時候你可能會為了減少頁面上的DOM數(shù),而使用偽元素俐镐。但如果你想給偽元素增加 animation 或者 transition 動畫矫限,這時候會碰上支持性問題。

如果你的項目需要支持以下系統(tǒng)版本佩抹,那么建議直接使用真實元素:

  • iOS Safari6.1及以下
  • Android Browser4.1.*及以下奇唤,包括一些深度定制的系統(tǒng),比如:
    • 魅族 - Flyme OS 4.1.1.1C及以下(比這高的版本尚未測試過)- 咱國產(chǎn)能別這么坑么(安卓版本為4.4.4的魅族MX4 pro)

:checked與兄弟選擇符一起使用的bug

Android Browser4.2.*及以下(可能版本稍有出入)(包括坑爹的Flyme)匹摇,如果你有這樣一段代碼:

input:checked ~ .test {
  background-color: #f00;
}

那么將無任何效果咬扇,如果你想使得上述代碼生效,有2種方式:

第一種廊勃,使用 input+ 進行激活:

html + input {}
input:checked ~ .test {
  background-color: #f00;
}

只要存在 input+ 選擇符配合使用的選擇器(空規(guī)則集也行)即可使得上述代碼激活生效懈贺。

第二種,直接換成 +

input:checked + .test {
  background-color: #f00;
}

為什么flex布局不生效

  • 使用塊級元素作為 flex items(flex子項)坡垫;

Android Browser4.3及以下梭灿,iOS Safari6.1及以下flex子項 需要使用塊級元素,在這些版本之上還可以使用行內(nèi)塊元素

在這些版本中冰悠,如果你發(fā)現(xiàn)flex子項之間出現(xiàn)了間隙堡妒,或者在未定義換行的情況下子項自身抑或子項之間換行了,或者出現(xiàn)了其它不正常的情況溉卓,那么仔細看一下flex子項可能是使用了行內(nèi)級元素皮迟;

  • 當橫向布局時搬泥,給 flex子項 子項定義 width 為非 auto 的值

Android Browser4.3及以下iOS Safari6.1及以下flex子項 如果沒有顯式的定義 width 為非 auto 的值伏尼,那么子項分配父元素剩余空間時將會不符合標準預期忿檩;

  • 當縱向布局時,給 flex子項 子項定義 height 為非 auto 的值

Android Browser4.3及以下爆阶,iOS Safari6.1及以下flex子項 如果沒有顯式的定義 height 為非 auto 的值燥透,那么子項分配父元素剩余空間時將會不符合標準預期;

為什么小于12px字號不生效

如果你是從pc開發(fā)轉到移動平臺的辨图,或者應該記得在pc端班套,Chrome及后來加入Webkit陣營的Opera都不支持頁面字號小于12px,當然你可以通過更改瀏覽器設置來改變這一情況故河,然后這并沒有什么卵用孽尽,不是么?

不幸的是,在移動端這個限制也依然存在,在Android Chrome上(包括部分版本上的Android Browser)沼本,仍然不支持小于12px的字號(測試至Android5.0.2, Chrome46)桩砰,除此之外,其他瀏覽器包括iOS上眾瀏覽器都能夠很好的支持超小字體。

所以,如果希望你的程序足夠安全,盡量不要定義小于12px的字號坎拐,或者換一種方式來實現(xiàn)。

題外話:假設你的項目使用了rem养匈,那么不要使用10作為換算因子哼勇,原因也如上

經(jīng)驗

禁止保存或拷貝圖像

通常當你在手機或者pad上長按圖像 img ,會彈出選項 存儲圖像 或者 拷貝圖像呕乎,如果你不想讓用戶這么操作积担,那么你可以通過以下方法來禁止:

img {
    -webkit-touch-callout: none;
}

需要注意的是,該方法只在 iOS 上有效猬仁。

取消touch高亮

在移動設備上帝璧,所有設置了偽類 :active 的元素,默認都會在激活狀態(tài)時湿刽,顯示高亮框的烁,如果不想要這個高亮,那么你可以通過以下方法來禁止:

.xxx {
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}

禁止選中內(nèi)容

如果你不想用戶可以選中頁面中的內(nèi)容诈闺,那么你可以禁掉:

html {
    -webkit-user-select: none;
}

快速回彈滾動

  1. 早期的時候渴庆,移動端的瀏覽器都不支持非body元素的滾動條,所以一般都借助 iScroll;
  2. Android 3.0/iOS解決了非body元素的滾動問題,但滾動條不可見襟雷,同時iOS上只能通過2個手指進行滾動刃滓;
  3. Android 4.0解決了滾動條不可見及增加了快速回彈滾動效果,不過隨后這個特性又被移除嗤军;
  4. iOS從5.0開始解決了滾動條不可見及增加了快速回彈滾動效果

在iOS上如果你想讓一個元素擁有像 Native 的滾動效果,你可以這樣做:

.xxx {
    overflow: auto; /* auto | scroll */
    -webkit-overflow-scrolling: touch; /* 該規(guī)則可能引起iOS UIWebView崩潰 */
}

設置添加到主屏幕的Web App標題

iOS Safari 允許用戶將一個網(wǎng)頁添加到主屏幕然后像 App 一樣來操作它晃危。我們知道每個 App 下方都會有一個名字叙赚,iOS Safari 提供了一個私有的 meta 來定義這個名字,代碼如下:

<meta name="apple-mobile-web-app-title" content="Web App名稱" />

Android Chrome31.0僚饭,Android Browser5.0 也開始支持添加到主屏幕了震叮,但并沒有提供相應的定義標題的方式,所以如果你想統(tǒng)一 iOSAndroid 平臺定義 Web app 名稱的方式鳍鸵,可以使用 title 標簽來定義苇瓣,代碼如下:

<title>Web App名稱</title>

但如果你想要網(wǎng)頁標題和App名字不一樣的話,那就只有iOS才行偿乖。

設置添加到主屏幕的Web App圖標

當我們將一個網(wǎng)頁添加到主屏幕時击罪,除了會需要設置標題之外,肯定還需要能夠自定義這個App的圖標贪薪,代碼如下:

<link rel="apple-touch-icon" href="app.png" />

不過該方案媳禁,在擬物設計的 iOS6及以前 會自動為圖標添加一層高光效果,iOS7 已使用了扁平化設計画切,所以如果使用該方案竣稽,在不同版本下得到的效果會不一致。

當然霍弹,你也可以使用原圖作為App的圖標毫别,用以保持各平臺表現(xiàn)一致,代碼如下:

<link rel="apple-touch-icon-precomposed" href="app.png" />

如果你想給不同的設備定不同的圖標典格,可以通過 sizes 屬性來定義岛宦,形如:

<link rel="apple-touch-icon" sizes="76x76" href="ipad.png@1x" />
<link rel="apple-touch-icon" sizes="120x120" href="iphone-retina@2x.png" />
<link rel="apple-touch-icon" sizes="152x152" href="ipad-retina@2x.png" />
<link rel="apple-touch-icon" sizes="180x180" href="iphone-retina@3x.png" />

規(guī)則如下:

  • 如果沒有跟相應設備推薦尺寸一致的圖標,會優(yōu)先選擇比推薦尺寸大并且最接近推薦尺寸的圖標耍缴。
  • 如果沒有比推薦尺寸大的圖標恋博,會優(yōu)先選擇最接近推薦尺寸的圖標。
  • 如果有多個圖標符合推薦尺寸私恬,會優(yōu)先選擇包含關鍵字precomposed的圖標债沮。

實際情況下,大部分智能手機都接近或者已經(jīng)達到視網(wǎng)膜屏質量本鸣,所以如果想省事的話疫衩,可以分別為 iPhoneiPad 定義一種高質量的 icon 即可。

該方案在 iOSAndroid5.0+ 上都通用荣德。

添加到主屏幕時隱藏地址欄和狀態(tài)欄(即全屏)

當我們將一個網(wǎng)頁添加到主屏幕時闷煤,會更希望它能有像 App 一樣的表現(xiàn)童芹,沒有地址欄和狀態(tài)欄全屏顯示,代碼如下:

<meta name="apple-mobile-web-app-capable" content="yes" />

該方案在 iOSAndroid5.0+ 上都通用鲤拿。

添加到主屏幕時設置系統(tǒng)頂欄顏色

當我們將一個網(wǎng)頁添加到主屏幕時假褪,還可以對 系統(tǒng)顯示手機信號、時間近顷、電池的頂部狀態(tài)欄 顏色進行設置生音,前提是開啟了:

<meta name="apple-mobile-web-app-capable" content="yes" />

有了這個前提,你可以通過下面的方式來進行定義:

<meta name="apple-mobile-web-app-status-bar-style" content="black" />

content只有3個固定值可選:default | black | black-translucent

  • 如果設置為 default窒升,狀態(tài)欄將為正常的缀遍,即白色,網(wǎng)頁從狀態(tài)欄以下開始顯示饱须;
  • 如果設置為 black域醇,狀態(tài)欄將為黑色,網(wǎng)頁從狀態(tài)欄以下開始顯示蓉媳;
  • 如果設置為 black-translucent譬挚,狀態(tài)欄將為灰色半透明,網(wǎng)頁將充滿整個屏幕酪呻,狀態(tài)欄會蓋在網(wǎng)頁之上殴瘦;

該設置只在 iOS 上有效。

電話號碼識別

iOS Safari (其他瀏覽器和Android均不會)上會對那些看起來像是電話號碼的數(shù)字處理為電話鏈接号杠,比如:

  • 7位數(shù)字蚪腋,形如:1234567
  • 帶括號及加號的數(shù)字,形如:(+86)123456789
  • 雙連接線的數(shù)字姨蟋,形如:00-00-00111
  • 11位數(shù)字屉凯,形如:13800138000

可能還有其他類型的數(shù)字也會被識別,但在具體的業(yè)務場景中眼溶,有些時候這是不必須的悠砚,所以你可以關閉電話自動識別,然后在需要撥號的地方堂飞,開啟電話呼出和短信功能灌旧。

  1. 關閉電話號碼識別:
<meta name="format-detection" content="telephone=no" />
  1. 開啟撥打電話功能:
<a href="tel:123456">123456</a>
  1. 開啟發(fā)送短信功能:
<a href="sms:123456">123456</a>

郵箱地址識別

Android (iOS不會)上,瀏覽器會自動識別看起來像郵箱地址的字符串绰筛,不論有你沒有加上郵箱鏈接枢泰,當你在這個字符串上長按,會彈出發(fā)郵件的提示铝噩。

  1. 關閉郵箱地址識別:
<meta name="format-detection" content="email=no" />
  1. 開啟郵件發(fā)送:
<a href="mailto:dooyoe@gmail.com">dooyoe@gmail.com</a>

如果想同時關閉電話和郵箱識別衡蚂,可以把它們寫到一條 meta 內(nèi),代碼如下:

<meta name="format-detection" content="telephone=no,email=no" />

關閉iOS鍵盤首字母自動大寫

在iOS中,默認情況下鍵盤是開啟首字母大寫的功能的毛甲,如果業(yè)務不想出現(xiàn)首字母大寫年叮,可以這樣:

<input type="text" autocapitalize="off" />

關閉iOS輸入自動修正

在iOS中,默認輸入法會開啟自動修正輸入內(nèi)容的功能玻募,如果不需要的話只损,可以這樣:

<input type="text" autocorrect="off" />

禁止文本縮放

當移動設備橫豎屏切換時,文本的大小會重新計算七咧,進行相應的縮放跃惫,當我們不需要這種情況時,可以選擇禁止:

html {
    -webkit-text-size-adjust: 100%;
}

需要注意的是坑雅,PC端的該屬性已經(jīng)被移除辈挂,該屬性在移動端要生效衬横,必須設置 `meta viewport'

待續(xù)啊待續(xù)裹粤。。蜂林。

強制豎屏

<!-- 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">

不對網(wǎng)站進行緩存

<meta http-equiv="Pragma" content="no-cache">

優(yōu)先使用IE和chrome

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />

待續(xù)啊待續(xù)...

var ua = navigator.userAgent.toLowerCase();

<a name="userAgent"></a>
1.判斷是否是微信

function isWeixinBrowser() {
return (/micromessenger/.test(ua)) ? true : false;
}

2.判斷是否是android

var isAndroid = ua.indexOf('android') > -1 || ua.indexOf('linux') > -1;

3.具體過程

scheme是客戶端定義的url-scheme

$("a[href^='scheme://']").on('click',function(e){
e.preventDefault();//阻止默認行為
if(isWeixinBrowser()){
$('.layer').show();//遮罩層(使用外部瀏覽器打開遥诉,此處樣式自行設定)
}else{
if(isAndroid){
//android
$('body').append("<iframe src="" style='display:none' target='' ></iframe>");//target為空防止在當前頁面刷新
setTimeout(function(){window.location = 'http://www.510wifi.com/weixin_download_client.html'},600);
}else{
//ios
window.location = 'scheme://openapp';
setTimeout(function(){window.location = 'itms-apps://itunes.apple.com/app/id123456789'},25);
}
}
})

附:判斷手機端各種瀏覽器

if (ua.match(/WeiBo/i) == "weibo") {
//在新浪微博客戶端打開
}
if (ua.match(/QQ/i) == "qq") {
//在QQ空間打開
}
if (browser.versions.ios) {
//是否在IOS瀏覽器打開
}
if(browser.versions.android){
//是否在安卓瀏覽器打開
}

var u = navigator.userAgent, app = navigator.appVersion;
trident: u.indexOf('Trident') > -1, //IE內(nèi)核
presto: u.indexOf('Presto') > -1, //opera內(nèi)核
webKit: u.indexOf('AppleWebKit') > -1, //蘋果、谷歌內(nèi)核
gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐內(nèi)核
mobile: !!u.match(/AppleWebKit.Mobile./), //是否為移動終端
ios: !!u.match(/(i[^;]+;( U;)? CPU.+Mac OS X/), //ios終端
android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android終端或uc瀏覽器
iPhone: u.indexOf('iPhone') > -1, //是否為iPhone或者QQHD瀏覽器
iPad: u.indexOf('iPad') > -1, //是否iPad
webApp: u.indexOf('Safari') == -1 //是否web應該程序噪叙,沒有頭部與底部

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矮锈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子睁蕾,更是在濱河造成了極大的恐慌苞笨,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件子眶,死亡現(xiàn)場離奇詭異瀑凝,居然都是意外死亡,警方通過查閱死者的電腦和手機臭杰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門粤咪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渴杆,你說我怎么就攤上這事寥枝。” “怎么了磁奖?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵囊拜,是天一觀的道長。 經(jīng)常有香客問我比搭,道長艾疟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蔽莱,結果婚禮上弟疆,老公的妹妹穿的比我還像新娘。我一直安慰自己盗冷,他們只是感情好怠苔,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仪糖,像睡著了一般柑司。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锅劝,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天攒驰,我揣著相機與錄音,去河邊找鬼故爵。 笑死玻粪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的诬垂。 我是一名探鬼主播劲室,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼结窘!你這毒婦竟也來了很洋?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤隧枫,失蹤者是張志新(化名)和其女友劉穎喉磁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體官脓,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡协怒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了确买。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斤讥。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖湾趾,靈堂內(nèi)的尸體忽然破棺而出芭商,到底是詐尸還是另有隱情,我是刑警寧澤搀缠,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布铛楣,位于F島的核電站,受9級特大地震影響艺普,放射性物質發(fā)生泄漏簸州。R本人自食惡果不足惜鉴竭,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岸浑。 院中可真熱鬧搏存,春花似錦、人聲如沸矢洲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽读虏。三九已至责静,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盖桥,已是汗流浹背灾螃。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揩徊,地道東北人腰鬼。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像靴拱,于是被迫代替她去往敵國和親垃喊。 傳聞我的和親對象是個殘疾皇子猾普,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354