移動端常見問題@小四

1.querySelectorAll和getELementsByTagName區(qū)別:

var lis = document.querySelectorAll('li');
list.innerHTML +=list.innerHTML;(輪播圖無縫滾動常見解決方案);
如果是querySelectorAll()不會重新獲取lis的length;整個DOM修改完后在用query獲取就可 以了;或使用getELementsByTagName();
而getELementsByTagName()會重新獲取lis.length;

2. 一像素問題

3. 點透

原因:點擊彈出層touch事件首先被觸發(fā)了,彈出層就被隱藏了。touchend后繼續(xù)等待300ms發(fā)現(xiàn)沒有其它行為,則繼續(xù)執(zhí)行click,由于彈出層已經(jīng)消失了,所以當(dāng)前click事件的target就落在了底層元素上,如果是input則會觸發(fā)focus事件,如果是a鏈接則會進(jìn)行頁面跳轉(zhuǎn),或是select,radio,CheckBox都會被觸發(fā),看你起來就像點擊的target“穿透”到底下去了,這就是點透的原理。

解決方案:

1,e.preventDefault()

oPop.addEventListener('touchend', function(e){

      this.style.display='none';

      e.preventDefault();

  });

2,利用css3屬性 pointer-events

取值auto|none

當(dāng)取值為auto 時,效果和沒有定義 pointer-events 屬性相同,鼠標(biāo)不會穿透當(dāng)前層。

當(dāng)取值為none 時,元素不再是鼠標(biāo)事件的目標(biāo),鼠標(biāo)不再監(jiān)聽當(dāng)前層而去監(jiān)聽下面的層中的元素。但是如果它的子元素設(shè)置了pointer-events為其它值,比如auto,鼠標(biāo)還是會監(jiān)聽這個子元素的。

詳細(xì)代碼:

oPop.addEventListener('touchend', function(e){

      this.style.display='none';

      oUn.style.pointerEvents='none';

    setTimeout(function(){

        oUn.style.pointerEvents='auto';

    }, 400);

  });

3,遮擋

由于 click 事件的滯后性,在這段時間內(nèi)原來點擊的元素消失了,于是便“穿透”了。因此我們順著這個思路就想到,可以給元素的消失做一個fade效果,類似jQuery里的fadeOut,并設(shè)置動畫duration大于300ms,這樣當(dāng)延遲的 click 觸發(fā)時,就不會“穿透”到下方的元素了。

同樣的道理,不用延時動畫,我們還可以在觸摸位置放一個透明的元素,這樣當(dāng)上層元素消失而延遲的click來到時,它點擊到的是那個透明的元素,也不會“穿透”到底下。在一定的timeout后再將生成的透明元素隱藏。

4、用fastclick,https://github.com/ftlabs/fastclick

5、實在不行就換成click事件。

4. rem算法

例如:
1,設(shè)計圖是1080;
2,屏幕寬度/16;
計算步驟:
第一步: 1080/16 = 67.5,1rem = 67.5
第二步:比如logo圖片寬度為240px,那么width應(yīng)該寫成3.5555556rem

5. 如果:

1,頁面html標(biāo)簽換行;
2,html對應(yīng)的標(biāo)簽設(shè)置display:inline-block;
結(jié)果就是:
顯示在頁面上會出現(xiàn)空隙
解決方案1:
頁面html標(biāo)簽不要換行
解決方案2:
還行元素的父級添加font-size:0;

6. transtion閃爍 問題:

  解決方案:

transtion3d(50px,0,0.1);(Z軸一定要設(shè)置數(shù)值才能啟用3d加速)

7. touches,targetTouches,changedTouches區(qū)別?

touches當(dāng)前屏幕上手指列表;
targetTouches當(dāng)前元素上的手指列表;
changedTouches觸發(fā)當(dāng)前事件的手指列表

8. 移動端點擊300ms延遲

300ms尚可接受,不過因為300ms產(chǎn)生的問題,我們必須要解決。300ms導(dǎo)致用戶體驗并不 是很好,解決這個問題,我們一般在移動端用tap事件來取代click事件。
推薦兩個js,一個是fastclick,一個是tap.js

9. IOS不兼容position:fixed屬性

移動端開發(fā)仿app頭部底部固定設(shè)置position:fixed,android2.2以上已經(jīng)實現(xiàn)。但是在ios8以下系統(tǒng),當(dāng)小鍵盤激活時,都會出現(xiàn)位置浮動問題。如圖:

fiex.png

解決方案1:使用position:absolute模擬

<script type="text/javascript">

window.onscroll=function(){

$(".fixed").css("top",$(window).scrollTop());

$(".foot").css("top",$(window).scrollTop()+$(window).height());

}

</script>

問題來了:滑動頁面時頭部底部div會有明顯的抖動。

解決方案2:判斷當(dāng)前獲得焦點元素是input則隱藏div改為position:absolute

<body onload=setInterval("a()",500)>

<script type="text/javascript">

function a(){

if(document.activeElement.tagName == 'INPUT'){

$(".fixed").css({'position': 'absolute','top':'0'});

} else {

$(".fixed").css('position', 'fixed');

}

}

</script>

問題來了:不停監(jiān)控dom,消耗資源。如果input個數(shù)較少,可在input里面添加onfocus事件好一些。但是如果是底部固定div此方法好像不太給力

解決方案3:插件iscroll.js個人感覺不是很好用??赡芊椒ú粚Γ琷Query Mobile 沒嘗試,感覺會增負(fù)擔(dān)。

解決方案3:重點來了,只需要在中間部分外層div添加css樣式position:fixed;top:50px; bottom:50px;overflow:scroll;就可以實現(xiàn)效果,無需插件。

http://efe.baidu.com/blog/mobile-fixed-layout/

當(dāng)小鍵盤出現(xiàn)時頭部、底部自動跳到頁面最頂端、最底端。鍵盤隱藏時又會固定在頭部,底部。頓時感覺開朗了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容