相關(guān)知識(shí)點(diǎn)
移動(dòng)端、 適配(兼容)、 ios點(diǎn)擊事件300ms延遲、 點(diǎn)擊穿透、 定位失效......
問(wèn)題&解決方案
- 手機(jī)瀏覽器獨(dú)有的三個(gè)事件?
onTouchmove,ontouchend,ontouchstart,ontouchcancel
- 為什么要用Zepto?
jquery適用于PC端桌面環(huán)境,桌面環(huán)境更加復(fù)雜,jquery需要考慮的因素非常多,尤其表現(xiàn)在兼容性上面,相對(duì)于PC端,移動(dòng)端的發(fā)雜都遠(yuǎn)不及PC端,手機(jī)上的帶寬永遠(yuǎn)比不上pc端。pc端下載jquery到本地只需要1~3秒(90+K),但是移動(dòng)端就慢了很多,2G網(wǎng)絡(luò)下你會(huì)看到一大片空白網(wǎng)頁(yè)在加載,相信用戶第二次就沒(méi)打開(kāi)的欲望了。zepto解決了這個(gè)問(wèn)題,只有不到10K的大小,2G網(wǎng)絡(luò)環(huán)境下也毫無(wú)壓力,表現(xiàn)不遜色于jquery。所以移動(dòng)端開(kāi)發(fā)首選框架,個(gè)人推薦zepto.js。
- IOS移動(dòng)端click事件300ms的延遲響應(yīng)
移動(dòng)設(shè)備上的web網(wǎng)頁(yè)是有300ms延遲的,玩玩會(huì)造成按鈕點(diǎn)擊延遲甚至是點(diǎn)擊失效。這是由于區(qū)分單擊事件和雙擊屏幕縮放的歷史原因造成的,
2007年蘋果發(fā)布首款iphone上IOS系統(tǒng)搭載的safari為了將適用于PC端上大屏幕的網(wǎng)頁(yè)能比較好的展示在手機(jī)端上,使用了雙擊縮放(double tap to zoom)的方案,比如你在手機(jī)上用瀏覽器打開(kāi)一個(gè)PC上的網(wǎng)頁(yè),你可能在看到頁(yè)面內(nèi)容雖然可以撐滿整個(gè)屏幕,但是字體、圖片都很小看不清,此時(shí)可以快速雙擊屏幕上的某一部分,你就能看清該部分放大后的內(nèi)容,再次雙擊后能回到原始狀態(tài)。
雙擊縮放是指用手指在屏幕上快速點(diǎn)擊兩次,iOS 自帶的 Safari 瀏覽器會(huì)將網(wǎng)頁(yè)縮放至原始比例。
原因就出在瀏覽器需要如何判斷快速點(diǎn)擊上,當(dāng)用戶在屏幕上單擊某一個(gè)元素時(shí)候,例如跳轉(zhuǎn)鏈接<a href="#"></a>,此處瀏覽器會(huì)先捕獲該次單擊,但瀏覽器不能決定用戶是單純要點(diǎn)擊鏈接還是要雙擊該部分區(qū)域進(jìn)行縮放操作,所以,捕獲第一次單擊后,瀏覽器會(huì)先Hold一段時(shí)間t,如果在t時(shí)間區(qū)間里用戶未進(jìn)行下一次點(diǎn)擊,則瀏覽器會(huì)做單擊跳轉(zhuǎn)鏈接的處理,如果t時(shí)間里用戶進(jìn)行了第二次單擊操作,則瀏覽器會(huì)禁止跳轉(zhuǎn),轉(zhuǎn)而進(jìn)行對(duì)該部分區(qū)域頁(yè)面的縮放操作。那么這個(gè)時(shí)間區(qū)間t有多少呢?在IOS safari下,大概為300毫秒。這就是延遲的由來(lái)。造成的后果用戶純粹單擊頁(yè)面,頁(yè)面需要過(guò)一段時(shí)間才響應(yīng),給用戶慢體驗(yàn)感覺(jué),對(duì)于web開(kāi)發(fā)者來(lái)說(shuō)是,頁(yè)面js捕獲click事件的回調(diào)函數(shù)處理,需要300ms后才生效,也就間接導(dǎo)致影響其他業(yè)務(wù)邏輯的處理。
解決方案:
fastclick可以解決在手機(jī)上點(diǎn)擊事件的300ms延遲
zepto的touch模塊,tap事件也是為了解決在click的延遲問(wèn)題
觸摸事件的響應(yīng)順序?yàn)?touchstart --> touchmove --> touchend --> click,也可以通過(guò)綁定ontouchstart事件,加快對(duì)事件的響應(yīng),解決300ms延遲問(wèn)題
- 一些情況下對(duì)非可點(diǎn)擊元素如(label,span)監(jiān)聽(tīng)click事件,ios下不會(huì)觸發(fā)
解決方案:css增加cursor:pointer;
- 三星手機(jī)遮罩層下的input、select、a等元素可以被點(diǎn)擊和focus(點(diǎn)擊穿透)
問(wèn)題發(fā)現(xiàn)于三星手機(jī),這個(gè)在特定需求下才會(huì)有,因此如果沒(méi)有類似問(wèn)題的可以不看。首先需求是浮層操作,在三星上被遮罩的元素依然可以獲取focus、click、change),有兩種解決方案:
1.是通過(guò)層顯示以后加入對(duì)應(yīng)的class名控制,截?cái)囡@示層下方可獲取焦點(diǎn)元素的事件獲取
2.是通過(guò)將可獲取焦點(diǎn)元素加入的disabled屬性,也可以利用屬性加dom鎖定的方式(disabled的一種變換方式)
- 安卓瀏覽器看背景圖片,有些設(shè)備會(huì)模糊。
//用同等比例的圖片在PC機(jī)上很清楚,但是手機(jī)上很模糊,原因是什么呢?
經(jīng)過(guò)研究,是devicePixelRatio作怪,因?yàn)槭謾C(jī)分辨率太小,如果按照分辨率來(lái)顯示網(wǎng)頁(yè),這樣字會(huì)非常小,所以蘋果當(dāng)初就把iPhone 4的960*640分辨率,在網(wǎng)頁(yè)里只顯示了480*320,這樣devicePixelRatio=2。現(xiàn)在android比較亂,有1.5的,有2的也有3的。
想讓圖片在手機(jī)里顯示更為清晰,必須使用2x的背景圖來(lái)代替img標(biāo)簽(一般情況都是用2倍)。例如一個(gè)div的寬高是100*100,背景圖必須得200*200,然后background-size:contain;,這樣顯示出來(lái)的圖片就比較清晰了。
//代碼可以如下:
background:url(../images/icon/all.png) no-repeat center center;
-webkit-background-size:50px 50px;
background-size: 50px 50px;
display:inline-block;
width:100%;
height:50px;
- h5頁(yè)面有個(gè)很蛋疼的問(wèn)題就是,當(dāng)輸入框在最底部,點(diǎn)擊軟鍵盤后輸入框會(huì)被遮擋。
//可采用如下方式解決
var oHeight = $(document).height(); //瀏覽器當(dāng)前的高度
$(window).resize(function(){
if($(document).height() < oHeight){
$("#footer").css("position","static");
}else{
$("#footer").css("position","absolute");
}
});
關(guān)于Web移動(dòng)端Fixed布局的解決方案,這篇文章也不錯(cuò) http://efe.baidu.com/blog/mobile-fixed-layout/
- 不讓 Android 手機(jī)識(shí)別郵箱
<meta content="email=no" name="format-detection" />
- 禁止 iOS 識(shí)別長(zhǎng)串?dāng)?shù)字為電話
<meta content="telephone=no" name="format-detection" />
- 禁止 iOS 彈出各種操作窗口
-webkit-touch-callout:none
- 消除 transition 閃屏
-webkit-transform-style: preserve-3d; /*設(shè)置內(nèi)嵌的元素在 3D 空間如何呈現(xiàn):保留 3D*/
-webkit-backface-visibility: hidden; /*(設(shè)置進(jìn)行轉(zhuǎn)換的元素的背面在面對(duì)用戶時(shí)是否可見(jiàn):隱藏)*/
- iOS 系統(tǒng)中文輸入法輸入英文時(shí),字母之間可能會(huì)出現(xiàn)一個(gè)六分之一空格
可以通過(guò)正則去掉
this.value = this.value.replace(/\u2006/g, '');
- 禁止ios和android用戶選中文字
-webkit-user-select:none
- 在ios和andriod中,audio元素和video元素?zé)o法自動(dòng)播放
//解決方案:觸屏即播
$('html').one('touchstart',function(){ audio.play()})
- ios下取消input在輸入的時(shí)候英文首字母的默認(rèn)大寫
<input autocapitalize="off" autocorrect="off" />
- android下取消輸入語(yǔ)音按鈕
input::-webkit-input-speech-button {display: none}
- CSS動(dòng)畫頁(yè)面閃白,動(dòng)畫卡頓
//解決方法:
1.盡可能地使用合成屬性transform和opacity來(lái)設(shè)計(jì)CSS3動(dòng)畫,不使用position的left和top來(lái)定位
2.開(kāi)啟硬件加速
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
- fixed定位缺陷
ios下fixed元素容易定位出錯(cuò),軟鍵盤彈出時(shí),影響fixed元素定位
android下fixed表現(xiàn)要比iOS更好,軟鍵盤彈出時(shí),不會(huì)影響fixed元素定位
ios4下不支持position:fixed
解決方案: 可用iScroll插件解決這個(gè)問(wèn)題
- 阻止旋轉(zhuǎn)屏幕時(shí)自動(dòng)調(diào)整字體大小
html, body, form, fieldset, p, div, h1, h2, h3, h4, h5, h6 {-webkit-text-size-adjust:none;}
- Input 的placeholder會(huì)出現(xiàn)文本位置偏上的情況
input 的placeholder會(huì)出現(xiàn)文本位置偏上的情況:
PC端設(shè)置line-height等于height能夠?qū)R,而移動(dòng)端仍然是偏上,解決是設(shè)置line-height:normal;
- 往返緩存問(wèn)題
點(diǎn)擊瀏覽器的回退,有時(shí)候不會(huì)自動(dòng)執(zhí)行js,特別是在mobile safari中。這與*往返緩存(bfcache)*有關(guān)系。
解決方法 :window.onunload = function(){};
- calc的兼容性處理
CSS3中的calc變量在iOS6瀏覽器中必須加-webkit-前綴,目前的FF瀏覽器已經(jīng)無(wú)需-moz-前綴。
Android瀏覽器目前仍然不支持calc,所以要在之前增加一個(gè)保守尺寸:
div { width: 95%; width: -webkit-calc(100% - 50px); width: calc(100% - 50px); }
- iOS6下偽類:hover
除了<a>之外的元素?zé)o效;
在Android下則有效。類似
div#topFloatBar_l:hover #topFloatBar_menu { display:block; }
這樣的導(dǎo)航顯示在iOS6點(diǎn)擊沒(méi)有點(diǎn)擊效果,只能通過(guò)增加點(diǎn)擊偵聽(tīng)器給元素增減class來(lái)控制子元素。
- 在移動(dòng)端修改難看的點(diǎn)擊的高亮效果,iOS和安卓下都有效:
*{-webkit-tap-highlight-color:rgba(0,0,0,0);}
不過(guò)這個(gè)方法在現(xiàn)在的安卓瀏覽器下,只能去掉那個(gè)橙色的背景色,點(diǎn)擊產(chǎn)生的高亮邊框還是沒(méi)有去掉,有待解決!
- 一個(gè)CSS3的屬性,加上后,所關(guān)聯(lián)的元素的事件監(jiān)聽(tīng)都會(huì)失效,等于讓元素變得“看得見(jiàn),點(diǎn)不著”。IE到11才開(kāi)始支持,其他瀏覽器的當(dāng)前版本基本都支持。
pointer-events: none;
詳細(xì)介紹見(jiàn)這里:https://developer.mozilla.org/zh-CN/docs/Web/CSS/pointer-events
- Zepto點(diǎn)透的解決方案
zepto的tap是通過(guò)兼聽(tīng)綁定在document上的touch事件來(lái)完成tap事件的模擬的,及tap事件是冒泡到document上觸發(fā)的,在點(diǎn)擊完成時(shí)的tap事件(touchstart\touchend)需要冒泡到document上才會(huì)觸發(fā),而在冒泡到document之前,用戶手的接觸屏幕(touchstart)和離開(kāi)屏幕(touchend)是會(huì)觸發(fā)click事件的,因?yàn)閏lick事件有延遲觸發(fā)(這就是為什么移動(dòng)端不用click而用tap的原因)(大概是300ms,為了實(shí)現(xiàn)safari的雙擊事件的設(shè)計(jì)),所以在執(zhí)行完tap事件之后,彈出來(lái)的選擇組件馬上就隱藏了,此時(shí)click事件還在延遲的300ms之中,當(dāng)300ms到來(lái)的時(shí)候,click到的其實(shí)不是完成而是**隱藏之后的下方的元素,如果正下方的元素綁定的有click事件此時(shí)便會(huì)觸發(fā),如果沒(méi)有綁定click事件的話就當(dāng)沒(méi)click,但是正下方的是input輸入框(或者select選擇框或者單選復(fù)選框),點(diǎn)擊默認(rèn)聚焦而彈出輸入鍵盤,也就出現(xiàn)了上面的點(diǎn)透現(xiàn)象。
//(1)引入fastclick.js,在頁(yè)面中加入如下js代碼
window.addEventListener( "load", function() {
FastClick.attach( document.body );
}, false );
//(2)或者有zepto或者jQuery的js里面加上
$(function() {
FastClick.attach(document.body);
});
//(3)當(dāng)然require的話就這樣:
var FastClick = require('fastclick');
FastClick.attach(document.body, options);
//(4)用touchend代替tap事件并阻止掉touchend的默認(rèn)行為preventDefault()
$("#cbFinish").on("touchend", function (event) {
//很多處理比如隱藏什么的
event.preventDefault();
});
//(5)延遲一定的時(shí)間(300ms+)來(lái)處理事件
$("#cbFinish").on("tap", function (event) {
setTimeout(function(){
//很多處理比如隱藏什么的
},320);
});
- 圖片加載
若您遇到圖片加載很慢的問(wèn)題,對(duì)這種情況,手機(jī)開(kāi)發(fā)一般用canvas方法加載:
具體的canvas API 參見(jiàn):http://javascript.ruanyifeng.com/htmlapi/canvas.html
下面舉例說(shuō)明一個(gè)canvas的例子:
<li><canvas></canvas></li>
js動(dòng)態(tài)加載圖片和li 總共舉例17張圖片!
vartotal=17;
varzWin=$(window);
varrender=function(){
varpadding=2;
varwinWidth=zWin.width();
varpicWidth=Math.floor((winWidth-padding*3)/4);
vartmpl ='';
for(vari=1;i<=totla;i++){
varp=padding;
varimgSrc='img/'+i+'.jpg';
if(i%4==1){
p=0;
}
tmpl +='<li style="width:'+picWidth+'px;height:'+picWidth+'px;padding-left:'+p+'px;padding-top:'+padding+'px;"><canvas id="cvs_'+i+'"></canvas></li>';
varimageObj = newImage();
imageObj.index = i;
imageObj.onload = function(){
varcvs =$('#cvs_'+this.index)[0].getContext('2d');
cvs.width = this.width;
cvs.height=this.height;
cvs.drawImage(this,0,0);
}
imageObj.src=imgSrc;
}
}
render();
- 防止手機(jī)中網(wǎng)頁(yè)放大和縮小
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" />
- apple-mobile-web-app-capable
apple-mobile-web-app-capable是設(shè)置Web應(yīng)用是否以全屏模式運(yùn)行。
語(yǔ)法:<meta name="apple-mobile-web-app-capable"content="yes">
說(shuō)明:如果content設(shè)置為yes,Web應(yīng)用會(huì)以全屏模式運(yùn)行,反之,則不會(huì)。
content的默認(rèn)值是no,表示正常顯示。你可以通過(guò)只讀屬性window.navigator.standalone來(lái)確定網(wǎng)頁(yè)是否以全屏模式顯示。
- html5調(diào)用安卓或者ios的撥號(hào)功能
html5提供了自動(dòng)調(diào)用撥號(hào)的標(biāo)簽,只要在a標(biāo)簽的href中添加tel:就可以了。
如下:
<ahref="tel:4008106999,1034">400-810-6999 轉(zhuǎn) 1034</a>
撥打手機(jī)直接如下:
<a href="tel:15677776767">點(diǎn)擊撥打15677776767</a>
- html5GPS定位功能 具體請(qǐng)看:http://www.jb51.net/post/html5_GPS_getCurrentPosition
- 上下拉動(dòng)滾動(dòng)條時(shí)卡頓、慢
body {
-webkit-overflow-scrolling:touch;
overflow-scrolling: touch;
}
Android3+和iOS5+支持CSS3的新屬性為overflow-scrolling
- 禁止復(fù)制、選中文本
Element {-webkit-user-select:none;
-moz-user-select:none;
-khtml-user-select:none;
user-select:none;
}
- iphone及ipad下輸入框默認(rèn)內(nèi)陰影
Element{
-webkit-appearance:none;
}
- 13、ios和android下觸摸元素時(shí)出現(xiàn)半透明灰色遮罩
Element {
-webkit-tap-highlight-color:rgba(255,255,255,0)
}
設(shè)置alpha值為0就可以去除半透明灰色遮罩,備注:transparent的屬性值在android下無(wú)效。
一篇文章有詳細(xì)介紹,地址:http://www.jb51.net/post/phone_web_ysk
- active兼容處理 即 偽類 :active 失效
方法一:body添加ontouchstart
<body ontouchstart="">
方法二:js給 document 綁定 touchstart 或 touchend 事件
<style>
a {
color:#000;
}
a:active {
color:#fff;
}
</style>
<a herf=foo >bar</a>
<script>
document.addEventListener('touchstart',function(){},false);
</script>
- 動(dòng)畫定義3D啟用硬件加速
Element {
-webkit-transform:translate3d(0,0,0)
transform: translate3d(0,0,0);
}
注意:3D變形會(huì)消耗更多的內(nèi)存與功耗
- Retina屏的1px邊框
Element{
border-width:thin;
}
- webkit mask 兼容處理
某些低端手機(jī)不支持css3 mask,可以選擇性的降級(jí)處理。
比如可以使用js判斷來(lái)引用不同class:
if('WebkitMask'indocument.documentElement.style){
alert('支持mask');
}else{
alert('不支持mask');
}
- 圓角bug
某些Android手機(jī)圓角失效
解決方案:background-clip: padding-box;
- 頂部狀態(tài)欄背景色
<meta name="apple-mobile-web-app-status-bar-style"content="black"/>
說(shuō)明:除非你先使用apple-mobile-web-app-capable指定全屏模式,否則這個(gè)meta標(biāo)簽不會(huì)起任何作用。
如果content設(shè)置為default,則狀態(tài)欄正常顯示。
如果設(shè)置為blank,則狀態(tài)欄會(huì)有一個(gè)黑色的背景。
如果設(shè)置為blank-translucent,則狀態(tài)欄顯示為黑色半透明。
如果設(shè)置為default或blank,則頁(yè)面顯示在狀態(tài)欄的下方,即狀態(tài)欄占據(jù)上方部分,頁(yè)面占據(jù)下方部分,二者沒(méi)有遮擋對(duì)方或被遮擋。
如果設(shè)置為blank-translucent,則頁(yè)面會(huì)充滿屏幕,其中頁(yè)面頂部會(huì)被狀態(tài)欄遮蓋住(會(huì)覆蓋頁(yè)面20px高度,而iphone4和itouch4的Retina屏幕為40px)。
默認(rèn)值是default。
- 設(shè)置緩存
<meta http-equiv="Cache-Control"content="no-cache"/>
手機(jī)頁(yè)面通常在第一次加載后會(huì)進(jìn)行緩存,然后每次刷新會(huì)使用緩存而不是去重新向服務(wù)器發(fā)送請(qǐng)求。
如果不希望使用緩存可以設(shè)置no-cache。
- 桌面圖標(biāo)
<link rel="apple-touch-icon"href="touch-icon-iphone.png"/>
<link rel="apple-touch-icon"sizes="76x76"href="touch-icon-ipad.png"/>
<link rel="apple-touch-icon"sizes="120x120"href="touch-icon-iphone-retina.png"/>
<link rel="apple-touch-icon"sizes="152x152"href="touch-icon-ipad-retina.png"/>
iOS下針對(duì)不同設(shè)備定義不同的桌面圖標(biāo)。如果不定義則以當(dāng)前屏幕截圖作為圖標(biāo)。
上面的寫法可能大家會(huì)覺(jué)得會(huì)有默認(rèn)光澤,下面這種設(shè)置方法可以去掉光澤效果,還原設(shè)計(jì)圖的效果!
<link rel="apple-touch-icon-precomposed"href="touch-icon-iphone.png"/>
圖片尺寸可以設(shè)定為5757(px)或者Retina可以定為114114(px),ipad尺寸為72*72(px)
- 啟動(dòng)畫面
<link rel="apple-touch-startup-image"href="start.png"/>
iOS下頁(yè)面啟動(dòng)加載時(shí)顯示的畫面圖片,避免加載時(shí)的白屏。
可以通過(guò)madia來(lái)指定不同的大小:
<!--iPhone-->
<link href="apple-touch-startup-image-320x460.png"media="(device-width: 320px)" rel="apple-touch-startup-image"/>
<!-- iPhone Retina -->
<link href="apple-touch-startup-image-640x920.png"media="(device-width: 320px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image"/>
<!-- iPhone 5-->
<link rel="apple-touch-startup-image"media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" href="apple-touch-startup-image-640x1096.png">
<!-- iPad portrait-->
<link href="apple-touch-startup-image-768x1004.png"media="(device-width: 768px) and (orientation: portrait)" rel="apple-touch-startup-image"/>
<!-- iPad landscape-->
<link href="apple-touch-startup-image-748x1024.png"media="(device-width: 768px) and (orientation: landscape)" rel="apple-touch-startup-image"/>
<!-- iPad Retina portrait-->
<link href="apple-touch-startup-image-1536x2008.png"media="(device-width: 1536px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image"/>
<!-- iPad Retina landscape-->
<link href="apple-touch-startup-image-1496x2048.png"media="(device-width: 1536px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)"rel="apple-touch-startup-image"/>
- 瀏覽器私有及其它meta
以下屬性在項(xiàng)目中沒(méi)有應(yīng)用過(guò),可以寫一個(gè)demo測(cè)試以下!
//QQ瀏覽器私有
全屏模式
<meta name="x5-fullscreen"content="true">
強(qiáng)制豎屏
<meta name="x5-orientation"content="portrait">
強(qiáng)制橫屏
<meta name="x5-orientation"content="landscape">
應(yīng)用模式
<meta name="x5-page-mode"content="app">
//UC瀏覽器私有
全屏模式
<meta name="full-screen"content="yes">
強(qiáng)制豎屏
<meta name="screen-orientation"content="portrait">
強(qiáng)制橫屏
<meta name="screen-orientation"content="landscape">
應(yīng)用模式
<meta name="browsermode"content="application">
//其它
針對(duì)手持設(shè)備優(yōu)化,主要是針對(duì)一些老的不識(shí)別viewport的瀏覽器,比如黑莓
<meta name="HandheldFriendly" content="true">
微軟的老式瀏覽器
<meta name="MobileOptimized" content="320">
windows phone 點(diǎn)擊無(wú)高光
<meta name="msapplication-tap-highlight" content="no">
- IOS中input鍵盤事件keyup、keydown、keypress支持不是很好
問(wèn)題是這樣的,用input search做模糊搜索的時(shí)候,在鍵盤里面輸入關(guān)鍵詞,會(huì)通過(guò)ajax后臺(tái)查詢,然后返回?cái)?shù)據(jù),然后再對(duì)返回的數(shù)據(jù)進(jìn)行關(guān)鍵詞標(biāo)紅。用input監(jiān)聽(tīng)鍵盤keyup事件,在安卓手機(jī)瀏覽器中是可以的,但是在ios手機(jī)瀏覽器中變紅很慢,用輸入法輸入之后,并未立刻相應(yīng)keyup事件,只有在通過(guò)刪除之后才能相應(yīng)!
解決辦法:
可以用html5的oninput事件去代替keyup
<input type="text"id="testInput">
<script type="text/javascript">
document.getElementById('testInput').addEventListener('input',function(e){
varvalue = e.target.value;
});
</script>
然后就達(dá)到類似keyup的效果!
- h5網(wǎng)站input 設(shè)置為type=number的問(wèn)題
- h5網(wǎng)頁(yè)input 的type設(shè)置為number一般會(huì)產(chǎn)生三個(gè)問(wèn)題,一個(gè)問(wèn)題是maxlength屬性不好用了。
另外一個(gè)是form提交的時(shí)候,默認(rèn)給取整了。三是部分安卓手機(jī)出現(xiàn)樣式問(wèn)題。
//問(wèn)題一解決,我目前用的是js。如下
<input type="number"oninput="checkTextLength(this ,10)">
functioncheckTextLength(obj, length) {
if(obj.value.length > length) {
obj.value = obj.value.substr(0, length);
}
}
//問(wèn)題二,是因?yàn)閒orm提交默認(rèn)做了表單驗(yàn)證,step默認(rèn)是1,要設(shè)置step屬性,假如保留2位小數(shù),寫法如下:
<input type="number"step="0.01"/>
關(guān)于step,我在這里做簡(jiǎn)單的介紹,input 中type=number,一般會(huì)自動(dòng)生成一個(gè)上下箭頭,點(diǎn)擊上箭頭默認(rèn)增加一個(gè)step,點(diǎn)擊下箭頭默認(rèn)會(huì)減少一個(gè)step。number中默認(rèn)step是1。也就是step=0.01,可以允許輸入2位小數(shù),并且點(diǎn)擊上下箭頭分別增加0.01和減少0.01。
假如step和min一起使用,那么數(shù)值必須在min和max之間。
看下面的例子:
<input type="number"step="3.1"min="1"/>
輸入框可以輸入哪些數(shù)字?
首先,最小值是1,那么可以輸入1.0,第二個(gè)是可以輸入(1+3.1)那就是4.1,以此類推,每次點(diǎn)擊上下箭頭都會(huì)增加或者減少3.1,輸入其他數(shù)字無(wú)效。這就是step的簡(jiǎn)單介紹。
//問(wèn)題三,去除input默認(rèn)樣式
input[type=number] {
-moz-appearance:textfield;
}
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button {
-webkit-appearance:none;
margin:0;
}
- ios 設(shè)置input 按鈕樣式會(huì)被默認(rèn)樣式覆蓋
解決方式如下:
input,
textarea {
border: 0;
-webkit-appearance: none;
}
設(shè)置默認(rèn)樣式為none
- select 下拉選擇設(shè)置右對(duì)齊
設(shè)置如下:
select option {
direction: rtl;
}
- 通過(guò)transform進(jìn)行skew變形,rotate旋轉(zhuǎn)會(huì)造成出現(xiàn)鋸齒現(xiàn)象
可以設(shè)置如下:
-webkit-transform: rotate(-4deg) skew(10deg) translateZ(0);
transform: rotate(-4deg) skew(10deg) translateZ(0);
outline: 1px solid rgba(255,255,255,0)
- 關(guān)于 iOS 與 OS X 端字體的優(yōu)化(橫豎屏?xí)霈F(xiàn)字體加粗不一致等)
iOS 瀏覽器橫屏?xí)r會(huì)重置字體大小,設(shè)置 text-size-adjust 為 none 可以解決 iOS 上的問(wèn)題,
但桌面版 Safari 的字體縮放功能會(huì)失效,因此最佳方案是將 text-size-adjust 為 100% 。
-webkit-text-size-adjust:100%;
-ms-text-size-adjust:100%;
text-size-adjust:100%;
- 移動(dòng)端 HTML5 audio autoplay 失效問(wèn)題
這個(gè)不是 BUG,由于自動(dòng)播放網(wǎng)頁(yè)中的音頻或視頻,會(huì)給用戶帶來(lái)一些困擾或者不必要的流量消耗,所以蘋果系統(tǒng)和安卓系統(tǒng)通常都會(huì)禁止自動(dòng)播放和使用 JS 的觸發(fā)播放,必須由用戶來(lái)觸發(fā)才可以播放。
解決方法思路:先通過(guò)用戶 touchstart 觸碰,觸發(fā)播放并暫停(音頻開(kāi)始加載,后面用 JS 再操作就沒(méi)問(wèn)題了)。
document.addEventListener('touchstart',function() {
document.getElementsByTagName('audio')[0].play();
document.getElementsByTagName('audio')[0].pause();
});
- 移動(dòng)端 HTML5 input date 不支持 placeholder 問(wèn)題
這個(gè)我感覺(jué)沒(méi)有什么好的解決方案,用如下方法
<input placeholder="Date" class="textbox-n" type="text" onfocus="(this.type='date')" id="date">
- 部分機(jī)型存在type為search的input,自帶close按鈕樣式修改方法
有些機(jī)型的搜索input控件會(huì)自帶close按鈕(一個(gè)偽元素),而通常為了兼容所有瀏覽器,我們會(huì)自己實(shí)現(xiàn)一個(gè),此時(shí)去掉原生close按鈕的方法為:
Search::-webkit-search-cancel-button{
display:none;
}
如果想使用原生close按鈕,又想使其符合設(shè)計(jì)風(fēng)格,可以對(duì)這個(gè)偽元素的樣式進(jìn)行修改。
- 喚起select的option展開(kāi)
//zepto方式:
$(sltElement).trigger("mousedown");
//原生js方式:
functionshowDropdown(sltElement) {
varevent;
event = document.createEvent('MouseEvents');
event.initMouseEvent('mousedown',true,true, window);
sltElement.dispatchEvent(event);
};
> 以上所有資料搜集整理自網(wǎng)絡(luò),如有不對(duì)的地方希望及時(shí)告知,歡迎大家批評(píng)指正,謝謝!