资讯专栏INFORMATION COLUMN

总结移动开发实践中遇到的坑

rockswang / 1311人阅读

摘要:博主之前已经推荐了一款神器下面,就总结一下移动端遇见的坑。解决原理虚拟键盘弹出时将元素设置为,虚拟键盘消失时候设置回来。解决方案由于虚拟键盘出现并未抛出事件,而检测或者事件,皆会有一定延迟,会出现闪烁现象。

做过很多移动端的项目,在开发调试过程中,一款好的调试工具会让效率大大提高。博主之前已经推荐了一款神器:http://web.jobbole.com/87587/

下面,就总结一下移动端遇见的坑。

1.input   placeholder问题

在chrome 模拟移动端调试时[上图],显示的非常正常,但是在真机上[下图],placeholder里面的内容明显靠上,非常的不美观

    

在国外网站,对这个属性的兼容性处理,那就是不要设计input的line-height或者设置line-height为normal即可,

试了一下,虽然在谷歌模拟调试里稍微偏上,但是在“真机上”正常垂直居中~

2.line-height

line-height经常用于文字居中,不同手机显示效果不一样。什么鬼~

在chrome模拟器上又是显示得非常完美,但是!Android和IOS又各自‘偏移’了。如果把line-height加1px,iPhone文字就会稍微‘正常显示’,由于我们app的ios用户居多,并且android机型太多,不同机型也会显示不同,所以只能退而求其次了。line-height的兼容问题不太好解决,容器高度越小,显示效果的差距越明显。

解决方案:稍微大一点的高度,最好把line-height设置为高度+1px,两个平台显示都不会太‘奇怪’。

3.使用rem  (兼容性:ie9+)

原理:浏览器的默认字体高都是16px,未经调整的浏览器在显示1em=16px。

rem则是只相对于根元素的font-size,即只需要设置根元素的font-size,其它元素使用rem单位设置成相应的百分比即可;

一般使用:

设置html的font-size为62.5%

html {    
    font-size: 62.5%;
}
body {    
    font-size: 12px;    
    font-size: 1.2rem;
}
p {    
    font-size: 14px;    
    font-size: 1.4rem;
}
4.实现自定义原生控件的样式

由于select移动端原生样式很丑,但是原生弹出样式是符合我们设计的原则

解决方法:将原本select 设置为透明,z-index设置高~再用一个比较好看的样式‘假装’在表面

5.移动端使用innerHtml绘制

使用innerHTML绘制大段,之后想获取HTML的ID节点,事实上是获取不到的,这种问题在动态创建DOM会经常发生

这也是一个神器的问题,博主自己写了一个移动端轮播插件,在chrome上浏览非常正常,但到了真机上却显示空白,各种百度,最后才发现这么坑的地方…

解决方案:尝试了很多方法之后,老老实实在页面直接用html结构,如果有更好的方法,也请告诉我。

6.300ms延迟

方案一:禁用缩放

在HTML文档头部包含如下meta标签时:


缺点——就是必须通过完全禁用缩放来达到去掉点击延迟的目的,然而完全禁用缩放并不是我们的初衷,我们只是想禁掉默认的双击缩放行为,这样就不用等待300ms来判断当前操作是否是双击。

方案二:更改默认的视口宽度

如果设置了上述meta标签,那浏览器就可以认为该网站已经对移动端做过了适配和优化,就无需双击缩放操作了。
这个方案相比方案一的好处在于,它没有完全禁用缩放,而只是禁用了浏览器默认的双击缩放行为,但用户仍然可以通过双指缩放操作来缩放页面。

兼容性问题:

对于方案一和方案二,Chrome是率先支持的,Firefox紧随其后,然而令Safari头疼的是,它除了双击缩放还有双击滚动操作,如果采用这种两种方案,那势必连双击滚动也要一起禁用。

7.点击穿透

问题常见发生场景: 假如页面上有两个元素A和B。B元素在A元素之上。我们在B元素的touchstart事件上注册了一个回调函数,该回调函数的作用是隐藏B元素。我们发现,当我们点击B元素,B元素被隐藏了,随后,A元素触发了click事件。

这是因为在移动端浏览器,事件执行的顺序是touchstart > touchend > click。

而click事件有300ms的延迟,当touchstart事件把B元素隐藏之后,隔了300ms,浏览器触发了click事件,但是此时B元素不见了,所以该事件被派发到了A元素身上。

如果A元素是一个链接,那此时页面就会意外地跳转。

解决思路:

1.不要混用touch和click

2.消耗掉touch之后的click

解决方法:

1.只用touch   把页面内所有click全部换成touch事件( touchstart 、’touchend’、’tap’),注意:a标签的href也是click,需要换成js的跳转。

2.改动最小——350ms后再隐藏B元素

8. 虚拟键盘导致 fixed 元素错位

fixed元素一定会伴随虚拟键盘的出现,但是虚拟键盘只是“贴”在了viewport上,表面上不会对dom产生“任何”影响,但是这个时候fixed元素表现却变得怪异起来,会错位。

解决原理:虚拟键盘弹出时将fixed元素设置为static,虚拟键盘消失时候设置回来。

解决方案:由于虚拟键盘出现并未抛出事件,而检测scroll或者resize事件,皆会有一定延迟,会出现闪烁现象。则当前获取焦点元素为文本元素,就将fixed元素设置为static。

9.移动端手势

手指放在屏幕上:ontouchstart     手指在屏幕上滑动:ontouchmove      手指离开屏幕:ontouchend

原理:

1.在touchstart事件触发时,  记录手指按下的时间startTime,本次滑动的初始位置initialPos。

2.在touchmove事件触发时, 记录当前位置nowPosition(实时移动元素),滑动距离movePosition(当前位置nowPosition与初始位置initialPos的差值),判断正负数再决定是左还是右移动。

3.在touchend事件触发时,   记录手指离开屏幕的时间endTime,获得手指在屏幕上停留的时间(endTime-startTime),滑动距离movePosition

判断是否滑动:

如果停留时间少于300ms,则认为是快速滑动,无论滑动距离是多少,都到下一页

滑动距离与‘容器’  大小进行比较,若超过‘容器’大小的1/3,则到下一页

10.iphone动态生成html元素click失效

这个也是神奇的坑,找了很久资料,也没有很原理的解释。

解决方法:  为绑定click的元素增加css样式   cursor:pointer;

转载自:http://web.jobbole.com

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/111534.html

相关文章

  • 分享一些遇到的好文章

    摘要:移动端布局总结移动端全兼容的移动端知识涵盖伪类等全移动端不得不讲的头标签移动端自适应方案移动端适配总结布局新旧混合写法详解兼容微信使用实现手淘页面的终端适配淘宝弹性布局方案实践理解所需的知识产生的小数像素问题高性能动画动画的性能优化处理和动 移动端rem布局总结 移动端全兼容的flexbox 移动端知识(涵盖、css、伪类等)【全】 移动端不得不讲的头标签 移动端自适应方案 移动端适...

    Tikitoo 评论0 收藏0
  • 基于uiwebview富文本编辑器实践

    摘要:背景最近我们微信读书将写想法换成了基于的富文本编辑器,遇到了不少问题,这里我将简单的介绍一下我们在开发过程中踩到的坑。 背景 最近我们微信读书将写想法换成了基于webview的富文本编辑器,遇到了不少问题,这里我将简单的介绍一下我们在开发过程中踩到的坑。 实现富文本编辑器有两个基本思路: 基于native实现:比如coretext或者textkit 基于uiwebview实现 第一...

    luzhuqun 评论0 收藏0
  • 设计架构

    摘要:先来看一张系统前后端架构模型图。一种接口的约定本文用于定义一种统一的接口设计方案,希望具有参考价值。,和都是常见的软件架构设计模式,它通过分离关注点来改进代码的组织方式。 如何无痛降低 if else 面条代码复杂度 相信不少同学在维护老项目时,都遇到过在深深的 if else 之间纠缠的业务逻辑。面对这样的一团乱麻,简单粗暴地继续增量修改常常只会让复杂度越来越高,可读性越来越差,有没...

    graf 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<