<meta name="viewport" content="width=device-width,initial-scale=1.0,viewport-fit=cover">
body {
padding-bottom: 50px;
padding-top: constant(safe-area-inset-top);
padding-left: constant(safe-area-inset-left);
padding-right: constant(safe-area-inset-right);
padding-bottom: calc(constant(safe-area-inset-bottom) + 50px);
padding-top: env(safe-area-inset-top);
padding-right: env(safe-area-inset-right);
padding-left: env(safe-area-inset-left);
padding-bottom: calc(env(safe-area-inset-bottom) + 50px);
}
// 额外50px留给底部通用按钮导航
.bottom-action{
position: fixed;
box-sizing: content-box;
height: 50px;
left: 0;
right: 0;
bottom: 0;
background-color: #fff;
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
}
-webkit-overflow-scrolling: touch
启用了硬件加速特性,当手指从触摸屏上移开,会保持一段时间的滚动,保持滑动惯性,但是可能会导致使用position: fixed
固定定位的元素,随着页面一起滚动- 设置外部 overflow 为 hidden,设置内容元素 overflow 为 auto。内部元素超出 body 即产生滚动,超出的部分 body 隐藏
document.body.addEventListener('touchmove', function(e) {
if(e._isScroller) return;
// 阻止默认事件
e.preventDefault();
}, { passive: false});
移动端提供双击缩放功能,需要等待一段时间来判断是不是双击动作,而不是立即响应单击,等待的这段时间大约是300ms,解决方式是通过 touchstart
替换 click
在发生点击约300ms之后,移动端会在之前坐标点上模拟产生 click
动作,所以在上层元素监听触摸事件,触摸之后该层消失,并且下层元素具有点击特性(监听click事件或者a,input,button),则下层元素也会响应点击事件。解决方案:
- 阻止上层元素默认行为
ele.addEventListener('touched', function(e){
e.preventDefault();
})
- 让上层元素不立即消失,等到模拟click动作约300ms之后再消失
- fixed在某些情况下可能导致容器内的子元素的1px边框线消失,即使使用z-index也无法解决。 解决方法:可以使用translateZ属性来解决
- fixed定位的容器内不能带有input,这是常见的bug。解决方法:在input聚焦的时候去掉fixed定位状态,改为absolute。
- fixed +可滚动的容器内会导致fixed定位的子元素在滚动时定位失效,滚动完成后才正常回到fixed的位置。解决方法:尽量不要在可滚动的容器内包含fixed定位的子元素。
-webkit-font-smoothing: antialiased
防止高清屏字体模糊,使用iOS系统-webkit-appearance: none
清除iOS中预置的样式,如input,bottonimg,a { -webkit-touch-callout: none }
禁用长按弹出菜单tap-highlight-color: transparent
清除点击高亮,如a
- backdrop-filter
- mix-blend-mode
- -webkit-box-reflect