移动端的兼容问题汇总及解决方案

339 阅读9分钟

安卓浏览器看背景图片,有些设备会模糊。 用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢?经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显示网页,这样字会非常小,所以苹果当初就把iPhone 4的960640分辨率,在网页里只显示了480320,这样devicePixelRatio=2。现在android比较乱,有1.5的,有2的也有3的。

想让图片在手机里显示更为清晰,必须使用2x的背景图来代替img标签(一般情况都是用2倍)。例如一个div的宽高是100 * 100,背景图必须得200*200,然后background-size:contain;,这样显示出来的图片就比较清晰了。\

防止手机中网页放大和缩小。

这点是最基本的,最为手机网站开发者来说应该都知道的,就是设置meta中的viewport
设置了DTD的方式是XHTML的写法,假如我们页面运用的是html5,可以不用设置DTD,直接声明。 使用viewport使页面禁止缩放。 通常把user-scalable设置为0来关闭用户对页面视图缩放的行为。 但是为了更好的兼容,我们会使用完整的viewport设置。 代码如下:
当然,user-scalable=0,有的人也写成user-scalable=no,都可以的。

ios和android下触摸元素时出现半透明灰色遮罩

         Element {
        -webkit-tap-highlight-color:rgba(255,255,255,0)
        }
        

设置alpha值为0就可以去除半透明灰色遮罩,备注:transparent的属性值在android下无效。

ctive兼容处理 即 伪类 :active 失效

方法一:body添加ontouchstart
方法二:js给 document 绑定 touchstart 或 touchend 事件

a {
color:#000;
}
a:active {
color:#fff;
}
[bar]()
document.addEventListener('touchstart',function(){},false);
复制代码

手机上的多行省略

  .overflow-hidden{

  display: box !important;

  display: -webkit-box !important;

  overflow: hidden;

  text-overflow: ellipsis;

  -webkit-box-orient: vertical;

  -webkit-line-clamp: 4;/*第几行出现省略号*/

  /*text-align:justify;不能和溢出隐藏的代码一起写,会有bug*/

  }

某些安卓手机的自带浏览器不识别onkeydown onkeypress onkeyup事件,这些事件会导致不能输入汉字

IOS手机中如果出现一个元素的层级非常高可还是被别的元素遮盖的,那么就将该元素与别的元素同级苹果手机固定定位有bug 检查html和body是不是设置了overflow-x:hidden;

button /button元素一定要写上type属性不然会默认提交表单,出现想不到的bug

html5调用安卓或者ios的拨号功能

html5提供了自动调用拨号的标签,只要在a标签的href中添加tel:就可以了。如下:400-810-69991034拨打手机直接如下:点击拨打15677776767

上下拉动滚动条时卡顿、慢

body {-webkit-overflow-scrolling:

touch;overflow-scrolling: touch;}

Android3+和iOS5+支持CSS3的新属性为overflow-scrolling

禁止复制、选中文本

Element {-webkit-user-select:none;
-moz-user-select:none;
-khtml-user-select:none;
user-select:none;
}
解决移动设备可选中页面文本(视产品需要而定)


iphone及ipad下输入框默认内阴影

Element{

-webkit-appearance:none;

}

1、ios下input为type=button属性disabled设置true,会出现样式文字和背景异常问题。

解决方案:使用opacity=1来解决

对非可点击元素如(label,span)监听click事件,部分ios版本下不会触发。

解决方案:css增加cursor:pointer就搞定了

3、移动端1px边框

解决方案:比如按钮的box的class为btn

.btn:before{
  content:'';
  position: absolute;
  top: 0;
  left: 0;
  border: 1px solid #ccc;
  width: 200%;
  height: 200%;
  box-sizing:border-box;
  -webkit-box-sizing:border-box;
  -webkit-transform: scale(0.5);
  transform: scale(0.5);
  -webkit-transform-origin: left top;
  transform-origin: left top;
}

4、input为fixed定位,在ios下input固定定位在顶部或者底部,在页面滚动一些距离后,点击input(弹出键盘),input位置会出现在中间位置。

解决方案:内容列表框也是fixed定位,这样不会出现fixed错位的问题

5、移动端字体小于12px使用四周边框或者背景色块,部分安卓文字偏上bug问题。

解决方案:可以使用整体放大1倍(width、height、font-size等等)再使用transform缩放,使用canvas在移动端会模糊也需要这样的解决方案

6、在移动端图片上传图片兼容低端机的问题。

解决方案:

input 加入属性 accept="image/*" multiple

7、在h5嵌入app中,ios如果出现垂直滚动条时,手指滑动页面滚动之后,滚动很快停下来,好像踩着刹车在开车,有“滚动很吃力”的感觉。

解决方案:

self.webView.scrollView.decelerationRate = UIScrollViewDecelerationRateNormal;对webview设置了更低的“减速率”

8、移动端click 300ms 延时响应

解决方案:使用 Fastclick

zepto的touch模块,tap事件也是为了解决click的延迟问题

触摸事件的响应顺序为 touchstart --> touchmove --> touchend --> click,也可以通过绑定ontouchstart事件,加快对事件的响应,解决300ms延迟问题

window.addEventListener( "load", function() {
  FastClick.attach( document.body );
}, false );
**这个300ms的延时会引发另外一个问题---点击穿透**

点击穿透的原因:
1.浏览器有300ms的延时为了区别是double click还是缩放
2.移动端事件的响应顺序 touchstart -> touchmove -> touchend -> tap -> click
在300ms时间范围内,上层元素隐藏了或移开了,下层相同位置的元素触发了click事件(普通元素是click事件回调函数效果,input,select是focus事件,超链接是页面跳转)
解决方案是:

方案一: 下层元素本身无click事件,没有input select a标签,统一使用touch事件

方案二:下层元素本身无click事件,在上方元素的touchend事件回调函数中,阻止后续触发默认事件 e.preventDefault();

1 $("#cbFinish").on("touchend", function (event) {
2     //很多处理比如隐藏什么的
3     event.preventDefault();
4 });

方案三:延迟一定的时间(300ms+)来处理事件

1 $("#cbFinish").on("tap", function (event) {
2     setTimeout(function(){
3     //很多处理比如隐藏什么的
4     },320);
5 });    
**方案四:在上层显示以后加入对应的class名控制,截断显示层下方可获取焦点元素的事件获取**

9、在安卓机上placeholder文字设置行高会偏上

解决方案:input有placeholder情况下不要设置行高

10、overflow:scroll,或者auto在iOS上滑动卡顿的问题

解决方案:加入-webkit-overflow-scrolling:touch

11、移动端适配可以使用lib-flexible ,使用rem来布局移动端有一个问题就是px的小数点的问题,不同的手机对于小数点处理方式不一样,有些是四舍五入,有些直接舍去掉,因此在自动生成雪碧图时候图标四周适当留2px的空间,防止图标被裁剪掉

12、iphonex的适配的解决方案

<meta name="viewport" content="...,viewport-fit=cover" />
body{
    padding-top: constant(safe-area-inset-top);
    padding-top: env(safe-area-inset-top);
    padding-bottom: constant(safe-area-inset-bottom);
    padding-bottom: env(safe-area-inset-bottom);
}
<meta name="viewport" content="...,viewport-fit=cover" />
body{
    padding-top: constant(safe-area-inset-top);
    padding-top: env(safe-area-inset-top);
    padding-bottom: constant(safe-area-inset-bottom);
    padding-bottom: env(safe-area-inset-bottom);
}

13.不让 Android 手机识别邮箱

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

14.禁止 iOS 识别长串数字为电话

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

15.禁止 iOS 弹出默认的各种操作窗口, 在iOS上,当你触摸并按住触摸的目标,比如一个链接,Safari浏览器将显示链接有关的系统默认菜单。这个属性可以让你禁用系统默认菜单。适用于链接元素比如新窗口打开,img元素比如保存图像等等

-webkit-touch-callout:none

16.消除 transition 闪屏

-webkit-transform-style: preserve-3d;     /*设置内嵌的元素在 3D 空间如何呈现:保留 3D*/
-webkit-backface-visibility: hidden;      /*(设置进行转换的元素的背面在面对用户时是否可见:隐藏)*/

17.iOS 系统中文输入法输入英文时,字母之间可能会出现一个六分之一空格

// 可以通过正则去掉      
this.value = this.value.replace(/\u2006/g, '');

18.禁止ios和android用户选中文字

-webkit-user-select:none

19.在ios和andriod中,audio元素和video元素在无法自动播放

应对方案:触屏即播

$('html').one('touchstart',function(){
    audio.play()
})

20.ios下取消input在输入的时候英文首字母的默认大写

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

21.android下取消输入语音按钮

input::-webkit-input-speech-button {display: none}

22  CSS动画页面闪白,动画卡顿

解决方法: 1.尽可能地使用合成属性transform和opacity来设计CSS3动画,不使用position的left和top来定位 2.开启硬件加速

  -webkit-transform: translate3d(0, 0, 0);
     -moz-transform: translate3d(0, 0, 0);
      -ms-transform: translate3d(0, 0, 0);
          transform: translate3d(0, 0, 0);

23.阻止旋转屏幕时自动调整字体大小

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

24. Input 的placeholder会出现文本位置偏上的情况

input 的placeholder会出现文本位置偏上的情况:PC端设置line-height等于height能够对齐,而移动端仍然是偏上,解决是设置line-height:normal

25 往返缓存问题

点击浏览器的回退,有时候不会自动执行js,特别是在mobilesafari中。这与往返缓存(bfcache)  有关系。 解决方法 :

window.onunload = function(){};

26 在移动端修改难看的点击的高亮效果,iOS和安卓下都有效:

  • {-webkit-tap-highlight-color:rgba(0,0,0,0);} 不过这个方法在现在的安卓浏览器下,只能去掉那个橙色的背景色,点击产生的高亮边框还是没有去掉,有待解决!

有一个CSS3的属性,加上后,所关联的元素的事件监听都会失效,等于让元素变得“看得见,点不着”。IE到11才开始支持,其他浏览器的当前版本基本都支持。详细介绍见这里,可以解决点击难看的高亮效果。 pointer-events: none;

27. user-select:none;造成iPhone5上输入框的光标不显示,输入时如果不显示光标,那将无法看到输入位置。因此这个属性不能用在input元素上

28. IOS手机,在react框架中,输入框输入内容添加去除空白逻辑,会造成中文拼音输入法,未及时选择中文,输入框出现许多拼音字母。还有maxLength属性,输入时不限制长度,输入结束才会自动截短。

 <input maxLength={20} value={taskName}  onChange={(e) => this.setState({ taskName: e.target.value.replace(/\s*/g'') })}  placeholder="请输入,20个字符以内" />

 29. 华为手机,输入文字弹出键盘,键盘收缩回去之后。页面的高度不会复原成真正的100vh,而仍停留在有键盘弹出时的高度,如果页面设置了全屏背景,就会出现页面有一部分没有背景。解决方法是监听window.onresize事件,手动恢复页面高度

 30. 解决iphone下选中input页面自动放大的问题,viewport的user-scalable要设置成no

  <meta name="viewport"
    content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no,viewport-fit=cove