無線web開發(fā)經(jīng)驗(yàn)(5)—— 開發(fā)技巧(Tips)

點(diǎn)擊與click事件

  • 對于a標(biāo)記的點(diǎn)擊導(dǎo)航寒亥,默認(rèn)是在onclick事件中處理的跺讯。而移動(dòng)客戶端對onclick的響應(yīng)相比PC瀏覽器有著明顯的幾百毫秒延遲震庭。
    在移動(dòng)瀏覽器中對觸摸事件的響應(yīng)順序應(yīng)當(dāng)是:

ontouchstart -> ontouchmove -> ontouchend -> onclick

因此鼻由,如果確實(shí)要加快對點(diǎn)擊事件的響應(yīng)担钮,就應(yīng)當(dāng)綁定ontouchend事件橱赠。

  • 使用click會(huì)出現(xiàn)綁定點(diǎn)擊區(qū)域閃一下的情況,解決:給該元素一個(gè)樣式如下

    -webkit-tap-highlight-color: rgba(0,0,0,0);

    如果不使用click箫津,也不能簡單的用touchstart或touchend替代狭姨,需要用touchstart的模擬一個(gè)click事件,并且不能發(fā)生touchmove事件苏遥,或者用zepto中的tap(輕擊)事件饼拍。

  • body{ -webkit-overflow-scrolling: touch;}

用iphone或ipad瀏覽很長的網(wǎng)頁滾動(dòng)時(shí)的滑動(dòng)效果很不錯(cuò)吧?不過如果是一個(gè)div暖眼,然后設(shè)置 height:200px;overflow:auto;
的話惕耕,可以滾動(dòng)但是完全沒有那滑動(dòng)效果,很郁悶吧诫肠?

我看到很多網(wǎng)站為了實(shí)現(xiàn)這一效果司澎,用了第三方類庫欺缘,最常用的是iscroll(包括新浪手機(jī)頁,百度等) 我一開始也使用挤安,不過自從用了-webkit-overflow-scrolling: touch;
樣式后谚殊,就完全可以拋棄第三方類庫了,把它加在body{}區(qū)域蛤铜,所有的overflow需要滾動(dòng)的都可以生效了嫩絮。

鎖定 viewport

ontouchmove="event.preventDefault()" //鎖定viewport,任何屏幕操作不移動(dòng)用戶界面(彈出鍵盤除外)围肥。

利用 Media Query監(jiān)聽

Media Query 相信大部分人已經(jīng)使用過了剿干。其實(shí) JavaScript可以配合 Media Query這么用:

var mql = window.matchMedia("(orientation: portrait)");
mql.addListener(handleOrientationChange);
handleOrientationChange(mql);
function handleOrientationChange(mql) { 
    if (mql.matches) { 
        alert('The device is currently in portrait orientation ') 
    } else { 
        alert('The device is currently in landscape orientation')
    }
}

借助了 Media Query 接口做的事件監(jiān)聽,所以很強(qiáng)大穆刻!
也可以通過獲取 CSS 值來使用 Media Query 判斷設(shè)備情況置尔,詳情請看:JavaScript 依據(jù) CSS Media Queries 判斷設(shè)備的方法

rem最佳實(shí)踐

rem是非常好用的一個(gè)屬性氢伟,可以根據(jù)html來設(shè)定基準(zhǔn)值榜轿,而且兼容性也很不錯(cuò)。不過有的時(shí)候還是需要對一些莫名其妙的瀏覽器優(yōu)雅降級朵锣。以下是兩個(gè)實(shí)踐

  • http://jsbin.com/vaqexuge/4/edit 這有個(gè)demo谬盐,發(fā)現(xiàn)chrome當(dāng)font-size小于12時(shí),rem會(huì)按照12來計(jì)算诚些。因此設(shè)置基準(zhǔn)值要考慮這一點(diǎn)

  • 可以用以下的代碼片段保證在低端瀏覽器下也不會(huì)出問題

      html { font-size: 62.5%; }
      body { font-size: 14px; font-size: 1.4rem; } /* =14px */
      h1 { font-size: 24px; font-size: 2.4rem; } /* =24px */
    

當(dāng)前點(diǎn)擊元素樣式:

-webkit-tap-highlight-color: 顏色

檢測判斷 訪問終端

  var browser={
      versions:function(){
          var u = navigator.userAgent, app = navigator.appVersion;
          return {
              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.*/), //是否為移動(dòng)終端
              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應(yīng)該程序,沒有頭部與底部
              weixin: u.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增)
              qq: u.match(/\sQQ/i) == " qq" //是否QQ
          };
      }(),
      language:(navigator.browserLanguage || navigator.language).toLowerCase()
  }
  //根據(jù)實(shí)際需求判斷終端及瀏覽器泣刹,進(jìn)行個(gè)性化適配和操作
  if(browser.versions.mobile){
    window.location.href="mobile.html"
  }

阻止屏幕旋轉(zhuǎn)時(shí)字體自動(dòng)調(diào)整

html, body, form, fieldset, p, div, h1, h2, h3, h4, h5, h6 {-webkit-text-size-adjust:none;}

模擬:hover偽類

因?yàn)閕Phone并沒有鼠標(biāo)指針助析,所以沒有hover事件。那么CSS :hover偽類就沒用了椅您。但是iPhone有Touch事件外冀,onTouchStart 類似 onMouseOver,onTouchEnd 類似 onMouseOut掀泳。所以我們可以用它來模擬hover雪隧。使用Javascript:

var myLinks = document.getElementsByTagName('a');
for(var i = 0; i < myLinks.length; i++){
    myLinks[i].addEventListener(’touchstart’, function(){this.className = “hover”;}, false);
    myLinks[i].addEventListener(’touchend’, function(){this.className = “”;}, false);
}

然后用CSS增加hover效果:

a:hover, a.hover { /* 你的hover效果 */ }

這樣設(shè)計(jì)一個(gè)鏈接,感覺可以更像按鈕员舵。并且脑沿,這個(gè)模擬可以用在任何元素上。

引導(dǎo)用戶安裝并打開app(From陽陽)

消除transition閃屏

兩個(gè)方法:使用css3動(dòng)畫的時(shí)盡量利用3D加速马僻,從而使得動(dòng)畫變得流暢庄拇。動(dòng)畫過程中的動(dòng)畫閃白可以通過 backface-visibility 隱藏。

-webkit-transform-style: preserve-3d;
/*設(shè)置內(nèi)嵌的元素在 3D 空間如何呈現(xiàn):保留 3D*/
-webkit-backface-visibility: hidden;
/*(設(shè)置進(jìn)行轉(zhuǎn)換的元素的背面在面對用戶時(shí)是否可見:隱藏)*/

測試是否支持svg圖片

document.implementation.hasFeature("http:// www.w3.org/TR/SVG11/feature#Image", "1.1")

“隱私模式”

參考地址:http://blog.youyo.name/archives/smarty-phones-webapp-deverlop-advance.html

ios的safari提供一種“隱私模式”,如果你的webapp考慮兼容這個(gè)模式措近,那么在使用html5的本地存儲(chǔ)的一種————localStorage時(shí)溶弟,可能因?yàn)椤半[私模式”下沒有權(quán)限讀寫localstorge而使代碼拋出錯(cuò)誤,導(dǎo)致后續(xù)的js代碼都無法運(yùn)行了瞭郑。

既然在safari的“隱私模式”下辜御,沒有調(diào)用localStorage的權(quán)限,首先想到的是先判斷是否支持localStorage屈张,代碼如下:

if('localStorage' in window){ 
    //需要使用localStorage的代碼寫在這
}else{
     //不支持的提示和向下兼容代碼
}

測試發(fā)現(xiàn)擒权,即使在safari的“隱私模式”下,’localStorage’ in window的返回值依然為true阁谆,也就是說碳抄,if代碼塊內(nèi)部的代碼依然會(huì)運(yùn)行,問題沒有得到解決笛厦。 接下來只能相當(dāng)使用try catch了纳鼎,雖然這是一個(gè)不太推薦被使用的方法,使用try catch捕獲錯(cuò)誤裳凸,使后續(xù)的js代碼可以繼續(xù)運(yùn)行,代碼如下:

try{
     if('localStorage' in window){ 
        //需要使用localStorage的代碼寫在這 
    }else{
        //不支持的提示和向下兼容代碼 
    }
}catch(e){
     // 隱私模式相關(guān)提示代碼和不支持的提示和向下兼容代碼
}

所以劝贸,提醒大家注意姨谷,在需要兼容ios的safari的“隱私模式”的情況下,本地存儲(chǔ)相關(guān)的代碼需要使用try catch包裹并降級兼容映九。

localStorage:

var v = localStorage.getItem('n') ? localStorage.getItem('n') : "";   // 如果名稱是  n 的數(shù)據(jù)存在 梦湘,則將其讀出 ,賦予變量  v  件甥。
localStorage.setItem('n', v);     // 寫入名稱為 n捌议、值為  v  的數(shù)據(jù)
localStorage.removeItem('n');        // 刪除名稱為  n  的數(shù)據(jù)

使用特殊鏈接:

如果你關(guān)閉自動(dòng)識(shí)別后 ,又希望某些電話號碼能夠鏈接到 iPhone 的撥號功能 引有,那么可以通過這樣來聲明電話鏈接 ,

<a href="tel:12345654321">打電話給我</a>
<a href="sms:12345654321">發(fā)短信</a>

或用于單元格:

<td onclick="location.href='tel:122'">

自動(dòng)大寫與自動(dòng)修正

要關(guān)閉這兩項(xiàng)功能瓣颅,可以通過autocapitalize 與autocorrect 這兩個(gè)選項(xiàng):

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

不讓 Android 識(shí)別郵箱

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

禁止 iOS 彈出各種操作窗口

-webkit-touch-callout:none

禁止用戶選中文字

-webkit-user-select:none

音頻跟視頻

<audio autoplay ><source src="audio/alarm1.mp3" type="audio/mpeg"></audio>

系統(tǒng)默認(rèn)情況下 audio的autoplay屬性是無法生效的,這也是手機(jī)為節(jié)省用戶流量做的考慮譬正。 如果必須要自動(dòng)播放宫补,有兩種方式可以解決。

1.捕捉一次用戶輸入后曾我,讓音頻加載粉怕,下次即可播放。

//play and pause it once
document.addEventListener('touchstart', function () {
    document.getElementsByTagName('audio')[0].play();
    document.getElementsByTagName('audio')[0].pause();
});

這種方法需要捕獲一次用戶的點(diǎn)擊事件來促使音頻跟視頻加載抒巢。當(dāng)加載后贫贝,你就可以用javascript控制音頻的播放了,如調(diào)用audio.play()

2.利用iframe加載資源

var ifr=document.createElement("iframe");
ifr.setAttribute('src', "http://mysite.com/myvideo.mp4");
ifr.setAttribute('width', '1px');
ifr.setAttribute('height', '1px');
ifr.setAttribute('scrolling', 'no');
ifr.style.border="0px";
document.body.appendChild(ifr);

這種方式其實(shí)跟第一種原理是一樣的蛉谜。當(dāng)資源加載了你就可以控制播放了稚晚,但是這里使用iframe來加載崇堵,相當(dāng)于直接觸發(fā)資源加載。 注意蜈彼,使用創(chuàng)建audio標(biāo)簽并讓其加載的方式是不可行的筑辨。 慎用這種方法,會(huì)對用戶造成很糟糕的影響幸逆。棍辕。

Iphone的媒體查詢

@media (device-height : 480px ) and (-webkit-min-device-pixel-ratio: 2 ){ /* 兼容iphone4/4s */
  body,html {
    font-size:9px !important;
  }
  .panel-center img{
    width:100px !important;
  }
}
@media (device-height : 568px ) and (-webkit-min-device-pixel-ratio: 2 ){ /* 兼容iphone5 */
 body,html {
    font-size:9px !important;
 }
 .panel-center img{
    width:100px !important;
  }
}
@media (device-height : 667px ) and (-webkit-min-device-pixel-ratio: 2 ){ /* 兼容iphone6 */
  body,html {
     font-size:12px !important;
  }
}    
@media (device-height : 736px ) and (-webkit-min-device-pixel-ratio: 2 ){ /* 兼容iphone6 Plus */
 body,html {
    font-size:14px !important;
  }
  .panel-center img{
    width:130px !important;
  }  
}

媒體查詢,響應(yīng)不同啟動(dòng)圖片

<link href="startup-568h.png" rel="apple-touch-startup-image" media="(device-height: 568px)">
<link href="startup.png" rel="apple-touch-startup-image" sizes="640x920" media="(device-height: 480px)">

拍照上傳

<input type="file" accept="image/*" capture="camera">
<input type="file" accept="video/*" capture="camcorder">
<input type="file" accept="audio/*" capture="microphone">

分別調(diào)用手機(jī)拍照还绘、攝像楚昭、錄音功能。
PS:該屬性存在瀏覽器兼容性問題拍顷,不是所有的瀏覽器都支持抚太。親測ios safari可用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昔案,一起剝皮案震驚了整個(gè)濱河市尿贫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踏揣,老刑警劉巖庆亡,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捞稿,居然都是意外死亡又谋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門娱局,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彰亥,“玉大人,你說我怎么就攤上這事衰齐∪握” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵娇斩,是天一觀的道長仁卷。 經(jīng)常有香客問我,道長犬第,這世上最難降的妖魔是什么锦积? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮歉嗓,結(jié)果婚禮上丰介,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好哮幢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布带膀。 她就那樣靜靜地躺著,像睡著了一般橙垢。 火紅的嫁衣襯著肌膚如雪垛叨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天柜某,我揣著相機(jī)與錄音嗽元,去河邊找鬼。 笑死喂击,一個(gè)胖子當(dāng)著我的面吹牛剂癌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翰绊,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼佩谷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了监嗜?” 一聲冷哼從身側(cè)響起谐檀,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎裁奇,沒想到半個(gè)月后稚补,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡框喳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厦坛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片五垮。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杜秸,靈堂內(nèi)的尸體忽然破棺而出放仗,到底是詐尸還是另有隱情,我是刑警寧澤撬碟,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布诞挨,位于F島的核電站,受9級特大地震影響呢蛤,放射性物質(zhì)發(fā)生泄漏惶傻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一其障、第九天 我趴在偏房一處隱蔽的房頂上張望银室。 院中可真熱鬧,春花似錦、人聲如沸蜈敢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春踊跟,著一層夾襖步出監(jiān)牢的瞬間潦俺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工铐殃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓季研,卻偏偏與公主長得像,于是被迫代替她去往敵國和親誉察。 傳聞我的和親對象是個(gè)殘疾皇子与涡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容