记录移动端页面开发中遇到的一些iOS兼容性问题。
禁用虚拟键盘上下箭头
问题描述:虚拟键盘左侧出现上下箭头,点击会导致页面布局错乱
解决方法:设置input
的tabindex
属性为-1
,将上下箭头禁用
微信/企业微信下键盘收起页面不会回到原位置
问题描述:微信下打开网页键盘弹起后页面上滑,键盘收起后页面不会回到原位置,且页面触摸响应错位。
解决方法:focus
键盘弹起时保存element
的scrollTop
,blur
键盘收起时回到原位置
1 | focus = () => { |
Flex布局设置height: 100%
无效(iOS 10.3.2)
问题描述:企业微信内置浏览器下,flex-item
设置为flex: 1
,flex-item-inner
为flex-item
的子元素,flex-item-inner
设置height: 100%
无效,没有高度(因设备有限,目前只发现iOS 10.3.2会出现该问题)。
示例:
1 | <div class="flex-parent"> |
1 | .flex-parent { |
解决方法:参考问题Chrome / Safari not filling 100% height of flex parent下这个回答,flex-item
添加display: flex
,flex-item-inner
移除height: 100%
。
1 | .flex-parent { |
更多方法参考这个投票最多的回答。上述解决方法对应第四个方法Nested Flex Containers
,大致翻译如下:
摆脱百分比高度。 摆脱table属性。 摆脱vertical-align
。 避免绝对定位。 坚持使用flexbox。
将display: flex
应用于flex项目(.flex-item
),使其成为flex容器。这会自动设置align-items:stretch
,它告诉子元素(.flex-item-inner
)扩展父元素的整个高度。
注意:从弹性项目中删除指定的高度,此方法才能起作用。 如果子元素设置了height
(例如height: 100%
),那么它将忽略来自父元素的align-items: stretch
。 为了使默认拉伸有效,子元素的height必须计算为auto
(完整说明)。
时间转换Invalid Date
1 | let time = new Date('2018-01-01 00:00:00') |
原因:iOS系统不识别YYYY-MM-DD
、YYYY.MM.DD
格式,能识别YYYY/MM/DD
格式
解决方法:将时间字符串中的-
替换成/
1 | let timeStr = '2018-01-01 00:00:00' |
iPhone X适配
参考文章:https://aotu.io/notes/2017/11/27/iphonex/
1 | <!--viweport-fit 属性,使得页面内容完全覆盖整个窗口--> |
1 | /*页面主体内容限定在安全区域内*/ |
iOS input输入框光标及字体不居中
原因:使用line-height垂直居中
解决方法:可直接定义height,然后高度由上下padding值撑开
iOS 输入框设置readOnly仍会聚焦
- 方案一
改为设置input的disabled
属性
缺点:会使input的点击事件失效
- 方案二
在input聚焦时失去焦点:
1 | $('input[readonly]').on('focus', function() { |
引入fastclick导致输入框难以聚焦
issue: can not bring up keyboard instantly in ios 11.3
解决方法:修改源码或改写fastclick
1 | FastClick.prototype.focus = function (targetElement) { |