ios侧适配的坑
前言
最近在修ios端页面的一些bug 只能说safari是现代ie名不虚传
坑
drop-shadow配上滚动元素不渲染
当一个父盒子里的子元素超宽,并且设置成是scroll模式下 有一部分子元素一开始是隐藏着的,只有滚动了才会显示
这时候如果父元素设置了drop-shadow,那么这部分子元素会有一个渲染延迟甚至压根不渲染
.parent {
/* ... */
overflow-y: scroll;
}
.child {
/* ... */
filter: drop-shadow(0 0 10px rgba(0, 0, 0, 0.5));
}解决方案
1. 使用box-shadow代替drop-shadow
.child {
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
}2. 使用transform: translateZ(0)
.child {
transform: translateZ(0);
}safari单标签模式渲染问题
safari当前有两种模式 多标签模式和单标签模式 前者导航栏在底部,可以迅速切换 后者导航栏在顶部,底部是一些操作按钮
多标签模式下比较正常 单标签模式下会存在一些问题
问题
- 100vh会算上导航栏的高度
- 会给浏览器加上橡皮条的操作
- 下拉快了会把底部操作栏隐藏掉
解决方案
- 使用-webkit-fill-available,它可以正常获取到真正的vh
@supports (-webkit-touch-callout: none) {
body {
min-height: -webkit-fill-available;
}
}- 禁用ios的touchStart事件
加passive是因为ios的touchStart事件会默认阻止默认行为,导致无法触发touchmove事件
document.body.addEventListener('touchstart', (e) => {
e.preventDefault();
}, { passive: false });3的禁止和2一致,上面这个也会阻止底部操作栏被隐藏的操作
video元素
这个也是大众很清楚的坑了 我接触到的主要是
- 视频播放时,ios会默认全屏播放
- ios视频不自动播放
- ios视频会显示操作按钮
解决方案
我是使用muted来解决自动播放的问题
以及利用playinline来视频蜜汁放大的问题 playinline真的是个很重要的元素,它可以防止视频全屏播放,保持页面上下文,让用户可以不离开当前页面观看视频
<video
autoplay
loop
muted
webkit-playsinline
playsinline
src="https://example.com/video.mp4"
>