移動(dòng)端頁面開發(fā)過程中經(jīng)常碰到的一些問題
時(shí)間:2022-05-28 09:21:01 | 來源:網(wǎng)絡(luò)營銷
時(shí)間:2022-05-28 09:21:01 來源:網(wǎng)絡(luò)營銷
對(duì)于前端開發(fā)者來說移動(dòng)端存在著很多的挑戰(zhàn),移動(dòng)端頁面開發(fā)過程中會(huì)碰到各種各樣千奇百怪的問題,那么今天我為大家分享移動(dòng)端頁面開發(fā)過程中的一些問題和解決問題的方法技巧。
移動(dòng)端頁面在不同設(shè)備、不同操作系統(tǒng)、不同運(yùn)行環(huán)境下都可能造成各種各樣的沒有碰到過的的坑,相比曾經(jīng)的IE6來說,現(xiàn)在的問題要多了很多。
現(xiàn)在的前端開發(fā)者基本都要同時(shí)著手PC端頁面和手機(jī)頁面的開發(fā)工作,就目前的狀況來看,手機(jī)頁面的兼容性要比PC端更為復(fù)雜(當(dāng)然主要是只在android端,大家懂的),而且有些樣式在PC端頁面上可能沒什么,但是一旦到了手機(jī)頁面,那就有可能是“大坑”,下面是本人自己開發(fā)手機(jī)頁面過程中總結(jié)的一些問題,在此借助億企邦的平臺(tái)跟大家分享一下,避免以后再次去犯。
1、外觀 訪問者對(duì)網(wǎng)站的第一印象就是網(wǎng)頁的外觀,一個(gè)好的網(wǎng)頁外觀能帶給人絕妙的視覺效果,視覺效果好的頁面背景,可以為網(wǎng)站起到錦上添花的作用,還可能讓訪問者對(duì)網(wǎng)站留下深刻的印象(具體可查看億企邦《移動(dòng)端界面設(shè)計(jì)的8個(gè)優(yōu)化要點(diǎn)》的相關(guān)介紹)。
A、頁面高度渲染錯(cuò)誤 在各移動(dòng)端瀏覽器中經(jīng)常會(huì)出現(xiàn)這種頁面高度100%的渲染錯(cuò)誤,頁面低端和系統(tǒng)自帶的導(dǎo)航條重合了,高度的不正確我們需要重置修正它,通過javascript代碼重置掉:
document.documentElement.style.height = window.innerHeight + 'px';
B、疊加區(qū)高亮 在部分android機(jī)型中點(diǎn)擊頁面某一塊區(qū)域可能會(huì)出現(xiàn)如圖所示的黃色框秒閃,這是部分機(jī)型系統(tǒng)自身的默認(rèn)定制樣式,給該元素一個(gè)CSS樣式重置掉:
-webkit-tap-highlight-color:rgba(0,0,0,0);
2、行為 關(guān)于行為方面,我這里主要跟大家分享一下事件無法被觸發(fā)和active效果不兼容的問題:
A、事件無法被觸發(fā) 在部分android機(jī)型的微信環(huán)境中會(huì)出現(xiàn)事件無法觸發(fā)、表單無法輸入的情況,我們針對(duì)需要輸入或者觸發(fā)事件的元素設(shè)置樣式:-webkit-transform: translate3d(0,0,0) ,不過新版本的微信已經(jīng)直接修復(fù)了該問題。
B、:active 效果不兼容 在android 4.0版本以下CSS :active偽狀態(tài)效果無法兼容,我們給該元素的touch系列的事件(touchstart/touchend/touchmove)綁定一個(gè)空匿名方法:
var element=document.getElementsById(”btnShare”);
element.addEventListener(‘touchstart’,function(){},false);
3、應(yīng)用 在開發(fā)面向現(xiàn)代智能手機(jī)的移動(dòng)Web應(yīng)用的時(shí)候,無法避免一個(gè)事實(shí),就是需要開發(fā)頁面應(yīng)用,對(duì)于不同的系統(tǒng)需求,頁面應(yīng)用的粒度會(huì)不同,可能是整個(gè)系統(tǒng)都使用一個(gè)頁面裝載,也可能是按模塊分為獨(dú)立頁面裝載,對(duì)此,我們也不妨來看一下在應(yīng)用過程中經(jīng)常遇到的一些問題及解決方法:
A、瀏覽器崩潰 var act = function(){
window.removeEventListener('devicemotion',act);
};
window.addEventListener('devicemotion',act,false);
解綁函數(shù)寫在了事件處理中導(dǎo)致小米手機(jī)中的微信崩潰,那么我們不要將解綁時(shí)間寫在事件處理中即可。
B、預(yù)加載、自動(dòng)播放無效 如上表所示,經(jīng)過簡單的測(cè)試發(fā)現(xiàn)預(yù)加載、自動(dòng)播放的有效性受操作系統(tǒng)、瀏覽器(webview)、版本等的影響,蘋果官方規(guī)定必須由用戶手動(dòng)觸發(fā)才會(huì)載入音頻,那么我們捕捉一次用戶輸入后,讓音頻加載實(shí)現(xiàn)預(yù)加載:
//play and pause it once
document.addEventListener('touchstart', function () {
document.getElementsByTagName('audio')[0].play();
document.getElementsByTagName('audio')[0].pause();
});
C、無法同時(shí)播放多音頻 在android設(shè)備中,播放后一音頻會(huì)打斷前一音頻,而不會(huì)同步播放,這個(gè)是目前系統(tǒng)資深決定的,我們只有采取優(yōu)雅降權(quán)的方法讓android選擇不一樣風(fēng)格的音頻前后切換播放而不是同時(shí)播放,達(dá)到與預(yù)期接近的音頻效果。
D、不支持局部滾動(dòng) 在android 4.0版本以下在body(html)元素之外的元素 overflow:scroll 樣式設(shè)置滾動(dòng)條無效,這里有兩種解決方案:
①、巧用布局直接設(shè)置樣式滾動(dòng)條在body(html)上,其他元素“錯(cuò)覺滾動(dòng)”。
②、利用iscroll、自寫js控制translate、scrollTop模擬。
4、系統(tǒng)/硬件 關(guān)于系統(tǒng)或硬件方面,我主要碰到以下幾個(gè)問題,在此,也簡單的跟大家描述一下,并提供一下解決方法:
A、怪異懸浮的表單 在部分android 機(jī)型中的輸入框可能會(huì)出現(xiàn)如圖怪異的多余的浮出表單,經(jīng)過觀察與測(cè)試發(fā)現(xiàn)只有input:password類型的輸入框存在,那么我們只要使用input:text類型的輸入框并通過樣式-webkit-text-security: disc;隱藏輸入密碼從而解決。
B、錯(cuò)誤出現(xiàn)滾動(dòng)條 在游戲內(nèi)嵌頁中出現(xiàn)了不應(yīng)該出現(xiàn)的滾動(dòng)條,而且內(nèi)容并沒有超出內(nèi)容區(qū)寬度,經(jīng)過測(cè)試overflow:hidden無效,通過一系列嘗試使用古老的 <body scroll=”no”> 寫法解決,多嘗試一下不同的寫法和屬性會(huì)有不一樣的驚喜哦!
C、鏈接打開系統(tǒng)瀏覽器 在游戲內(nèi)webview的部分android機(jī)型中可能會(huì)出現(xiàn)點(diǎn)擊鏈接調(diào)用系統(tǒng)瀏覽器的情況,這是一個(gè)非常不好的體驗(yàn),那么我們嘗試給這個(gè)元素添加 target=”_blank” 屬性有可能解決,如果還不能解決那么需要修改IOS或android原生系統(tǒng)函數(shù)了。
D、Flex box 不兼容 在游戲內(nèi)嵌webview中碰到Flex box布局不兼容的情況,圖中所示下面部分的導(dǎo)航錯(cuò)位了,雖然之前有仔細(xì)查看過Flex box的兼容性,但是在游戲內(nèi)嵌頁中無法確定其調(diào)用的系統(tǒng)瀏覽器版本及兼容,導(dǎo)致錯(cuò)誤,所以我們寫完整歷史版本的3種Flex box解決,那么我們思考在寫頁面過程中還是本著保守穩(wěn)定的方式書寫樣式可以減少一些不必要的麻煩。
5、代碼屬性的問題 在移動(dòng)端頁面開發(fā)過程中,由于技術(shù)還不夠完善和穩(wěn)定,我們也經(jīng)常會(huì)因?yàn)榇a屬性的問題導(dǎo)致頁面出現(xiàn)很多千奇百怪的問題,這也是開發(fā)人員最為煩惱的問題,在此,億企邦也分享幾個(gè)常見的問題:
(1)、overflow-x 這真的是一個(gè)大坑,一旦你在body或者h(yuǎn)tml上用了這個(gè)屬性,對(duì)不起,如果你的頁面出現(xiàn)滾動(dòng)條的話,那就會(huì)出現(xiàn)莫名其妙的bug,滑動(dòng)頁面的時(shí)候fix在頂部或者底部的會(huì)擋住,不知道有人遇到這樣的情況沒有,我是遇到了,坑死了。
解決辦法:html跟body不要使用這個(gè)屬性,如果不想讓橫向出現(xiàn)滾動(dòng),就用overflow:hidden;overflow-y:auto;
(2)、calc() 這個(gè)本就是css3中的新方法,用起來其實(shí)是很爽的,無奈android不支持,大家最好別用,除非你不考慮android用戶。
(3)、display:fix 這個(gè)是css3的新屬性,用來做彈性布局的,ios上是十分OK的,然而android不支持,為了不被坑,別用。
(4)、-webkit-overflow-scrolling:touch 這個(gè)屬性不是坑,他是用來讓ios上的滾動(dòng)條更加順滑流暢的,親測(cè)android上沒有啥大的變化,但是ios有,不算坑,為了增強(qiáng)用戶體驗(yàn),大家可以用上,給出現(xiàn)滾動(dòng)條的標(biāo)簽加上這個(gè)樣式。
(5)、jquery中的html()方法 如果input的type為tel類型,然后你用html()方法取出某個(gè)值填入這個(gè)input,這個(gè)input在android手機(jī)上會(huì)顯示諸如”<a href="faketel:****"></a>“類似的字符竄。
解決辦法就是用text()方法去取這個(gè)值然后填入這個(gè)input中,說白了還是html()跟text()方法的用法不一樣,html()方法取的是html的內(nèi)容,并非是純文本,而text()方法取出的是純文本,不會(huì)被瀏覽器解析,算是一個(gè)教訓(xùn)!
(6)、keyup和keydown在IOS設(shè)備上失效 如果你在IOS設(shè)備上用第三方輸入法是無法用keyup事件來監(jiān)聽的,因?yàn)閕os系統(tǒng)做了屏蔽機(jī)制,第三方輸入法的事件系統(tǒng)是不管的,那么我們可以換種思路,去監(jiān)聽input的值變化事件,替換方案如下:
$('#input').bind('input propertychange', function() {
alert("....")
});
(7)、給body加position:relative 比如給移動(dòng)頁面做個(gè)彈幕的效果,在body里面會(huì)有個(gè)div一直滾動(dòng),從右向左,然后這個(gè)div是absolulte的,那一定要給body加relative,否則ios的手機(jī)會(huì)出現(xiàn)橫向滾動(dòng)條。
7、學(xué)會(huì)如何去解決問題 面對(duì)這么多坑,還有各種各樣已經(jīng)的和未知的坑,時(shí)間上也不可能一一講完,更不可能都已經(jīng)有解決方案,我們需要學(xué)會(huì)如何去解決這些問題。
解決坑首先自己需要有個(gè)強(qiáng)有力的執(zhí)行力,通過不斷去嘗試來探索未知的問題,那么一般我們會(huì)通過哪些方式哪些步驟和技巧來嘗試呢?
(1)、定位問題 首先我們需要定位問題,我們可以使用下列方法:
A、DOM隔離定位法
不斷由大范圍到小范圍隔離出DOM,從而找出、觸發(fā)問題的DOM元素。
B、樣式、JS剔除法
不斷剔除一些JS、CSS觀察調(diào)試檢查是否是由部分JS、CSS屬性引起問題。
C、多運(yùn)行環(huán)境測(cè)試法
在多環(huán)境中測(cè)試,排查是否是由于特定環(huán)境引起(具體可查看億企邦《移動(dòng)端設(shè)備前端開發(fā)調(diào)試的方法技巧》的相關(guān)介紹)。
D、PC與手機(jī)聯(lián)合調(diào)試法
聯(lián)合PC與手機(jī)進(jìn)行定位,如:通過Mac遠(yuǎn)程調(diào)試iPhone/iPad。
(2)、解決問題的方式 我們解決問題可以嘗試如下的方式:
* 嘗試、轉(zhuǎn)思維、繞解決
* 優(yōu)雅降權(quán)、區(qū)分處理、溝通
* 搜索與提問……
和以下的思維:
* 替代
* 繞道
* 分割……
(3)、學(xué)會(huì)解決問題 在解決問題的過程中我們需要學(xué)會(huì)利用搜索和溝通資源解決問題:
A、google、百度
B、行業(yè)博客及社區(qū)
C、同事、朋友、QQ群、論壇等。
搜索引擎和行業(yè)博客及社區(qū)讓你更容易更精確的快速搜索出問題相關(guān)的資料,同時(shí)、朋友QQ群、論壇等讓你可以直接的跟人溝通出別人所遇到的問題及解決方案。
(4)、學(xué)會(huì)如何總結(jié)問題 在發(fā)現(xiàn)、解決問題后,更重要的是要學(xué)會(huì)如何總結(jié)問題:
A、總結(jié)記錄問題產(chǎn)生條件、解決方法和解決過程。
B、盡可能分析原理、產(chǎn)生的條件,避免重蹈覆轍。
C、分享給更多的人。
無窮無盡的坑,走的人多了,總結(jié)分享的多了,坑也就越來越平了。
我在總結(jié)記錄問題的同時(shí),整理了一個(gè)移動(dòng)端小貼士,記錄問題與一些坑,雖然目前還不完善但是希望能分享給更多的人也希望更多的人能參與完善。
億企邦點(diǎn)評(píng): 對(duì)于移動(dòng)端網(wǎng)頁,用戶體驗(yàn)始終是大問題,交互式使用好的客戶端可以在很多方面給用戶帶來不同的感覺和享受,因此,重視移動(dòng)端的用戶體驗(yàn),就可以給客戶端增加很多意想不到的功能,這樣賦予這種軟件其他的不同凡響,漸漸的就能讓用戶越積越多,這樣才是交互功能一種好的體現(xiàn)。
關(guān)鍵詞:經(jīng)常,過程,移動(dòng)