1.点透

Q:元素A上定位另外一个元素B,点击元素B,如果元素A有事件或链接,会触发元素A上的事件或链接,即点透

A:在元素B的touchend中增加ev.preventDefault();阻止默认事件即可,请注意:此时元素内容如果过长,其原生滑动也同时阻止

elmB.addEventListener('touchend', function (ev) {

ev.preventDefault();

}, false);

2.区分点击与滑动

Q:元素A添加touchstart或touchend事件后,如果在元素A上滑动也会触发点击事件

A:区分是否是点击事件,有2种方法

方法一:

在touchend时判断touchmove事件是否触发即可

function tap(elm, callback) {

elm.addEventListener('touchstart', start, false);


function start(ev) {

var b = false;


this.addEventListener('touchmove', move, false);

this.addEventListener('touchend', end, false);


function move() {

b = true;

}


function end(ev) {

var touch = ev.changedTouches[0];

var x = touch.pageX;

var y = touch.pageY;


if (!b) {

if (callback) {

callback.call(this, ev, x, y);

ev.preventDefault();

}

}

this.removeEventListener('touchmove', move, false);

this.removeEventListener('touchend', end, false);

}

}

}


方法二:

touchstart时记录坐标(x1、y1),touchend时判断当前坐标(x2、y2)是否等于x1、y1


function tap(elm, callback) {

elm.addEventListener('touchstart', start, false);


function start(ev) {

var touch = ev.targetTouches[0];

var intX = touch.pageX;

var intY = touch.pageY;


this.addEventListener('touchend', end, false);


function end(ev) {

var touch = ev.changedTouches[0];

var curX = touch.pageX;

var curY = touch.pageY;


if (curX == intX && curY == intY) {

if (callback) {

callback.call(this, ev, curX, curY);

ev.preventDefault();

}

}

this.removeEventListener('touchend', end, false);

}

}

}


调用:


<div>点击此处</div>

window.onload = {

var elm = document.querySelector('div');


tap(elm, function (ev, x, y) {

alert('坐标:x=' + x + ', y=' + y);

});

};


3.点击元素时加触发效果

Q:长按一个元素时如何给元素加上效果

A:首先尝试在css中给元素定义:active伪类,如果没效果则在html中给元素加上ontouchstart=""触发:active,如果还是不行,则考虑用js

动态添加样式

4.用translateX或translateY时产生抖动

Q:在给一个元素A用translate时,其后面的元素B有时会产生文字抖动或背景、边框抖动

A:给元素的父级添加translateZ即可解决

5.弹性布局宽度的问题

Q:给一行元素添加弹性布局,flex都为1,每个元素中内容长度不一致,导致不等分

A:给内部元素固定宽度即可

6.在safari浏览器中不识别日期

Q:safari浏览器中

alert(new Date('2013-11-12'));

2013-11-12这种日期格式不识别

A:在safari浏览器中设置日期需要将格式转成2013/11/12即可

7.图标模糊

Q:按照320分辨率切的图标,在iphone中图标模糊

A:iphone等手机分辨率是640的,所以图片应该按照640分辨率切,然后用background-size:50%;缩放,或写固定宽度,如在640宽度下的一

个图标宽为64px高为48px,则用backgroun-size缩放后在320分辨率下的background-size:32px 24px

8.用px切的页面在小米等手机中网页被放大

Q:用px切的页面在小米等手机的浏览器中比别的手机页面大

A:px在浏览器中表现不一致,任何浏览器默认字体大小为16px,而10px是16px的62.5%,此时设置html字号为62.5%,再用css3提供的rem(

根字号大小,即html的字号大小)将px除10进行换算即可解决

例:

html { font-size:62.5%; }

.header { font-size:1.6rem; /* 16px */ }

.footer { height:5em; /* 50px */ }

9.按照设计图切出的页面很大

Q:设计图给的是640px宽的,放到手机里看很大,用viewport缩放0.52倍在别的手机都正常,但是在小米中用自带浏览器,字号设为中,缩

放不管用

A:首先应禁止缩放,会带来别的问题,如从数据库中读出的字体带着单位如12px,字会显得非常的小

即viewport应写为

<meta name="viewport" content="width=device-width; initial-scale=1; maximum-scale=1; user-scalable=0;" />

其次用

width=device-width后,任何页面在手机里都会被解析成320宽度,所以640px的设计图中量出的单位应除2即可

10.1px的问题

Q:宽度小于1px的线有时显示不出来,等于1px的线有的细有的粗

A:网页中最小单位为1px,小于1px的线不显示出来也是正常的,应避免设置小于1px的单位。线时细时粗暂无太好的办法,一是用图片代替

,二是用很淡的颜色

11.用background-size后背景定位失效

Q:用background-size后,合并的背景图定位不准确

A:首先用了background-size后原来的单位也应该缩放,如果background-size:50%;那么量出的单位都应*0.5