ios 兼容问题

4,023 阅读3分钟

之前搞了一个移动端的H5项目,用的是webpack5+react18+react-router-dom(v6)都是比较新的技术,ios 兼容出了很多的问题 ,记录下

底部固定定位问题

底部tabbar 用position:fixed会出现遮挡,iPhone10之后底部会有一条横条,safari底部菜单栏会遮挡,菜单栏占用了高度,导致页面的高度不够,这个时候就要用

 height: calc(100vh - 75px) !important;

通过js 判断是不是safari 如果是就加入上面的代码

弹窗问题

4e97a760-3541-4491-85f0-57f7b1a220e5.jpg 如果使用了固定定位(position:fixed) 弹窗里面如果有输入框,弹窗的的内容就会乱,这个问题 只有ios 会 安卓并不会,只能将外层的固定定位 改成绝对定位(position:absoult)

input type='file' 时动态生成产生的问题

如果input type='file' 动态生成 或者display:'none' 因为权限问题ios 不允许拿到input里面的值(你可以选择相片,但是拿不到值)

网页点击输入框或者textarea会放大

单击 输入框 text area 会放大 可以用meta 标签取消 或者js 取消默认事件

<meta *name*="viewport" *content*="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />

if(/Safari/.**test**(navigator.userAgent) && !/Chrome/.**test**(navigator.userAgent)){

localStorage.**setItem**('isSafari',1)

window.**onload** = function () {

*//e.preventDefault() --- 阻止默认事件*

*//当一个手指放在屏幕上时,会触发touchstart事件。如果另一个手指又放在了屏幕上,则会先触发gesturestart事件,随后触发基于该手指的touchstart事件。*

document.**addEventListener**('gesturestart', function (e) {

e.**preventDefault**();

});

*//在单个元素上单击两次 --- dblclick*

document.**addEventListener**('dblclick', function (e) {

e.**preventDefault**();

});

*//一个手指放在屏幕上时,会触发touchstart事件*

document.**addEventListener**('touchstart', function (event) {

if (event.touches.length > 1) {

event.**preventDefault**();

}

});

*//如果一个或两个手指在屏幕上滑动,将会触发gesturechange事件*

*//但只要有一个手指移开,则会触发gestureend事件,紧接着又会触发toucheend事件。*

var lastTouchEnd = 0;

document.**addEventListener**('touchend', function (event) {

var now = (new **Date**()).**getTime**();

if (now - lastTouchEnd <= 300) {

event.**preventDefault**();

}

lastTouchEnd = now;

}, false);

};

}else{

localStorage.**setItem**('isSafari',0)

}

底部回弹会让底部的tabbar 文字不显示

test.gif

因为 -webkit-overflow-scrolling: touch;ios 滚动流畅度很好,touch值拉动都会回弹,导致底部的tabbar 的文字会消失,我尝试了几个方法 都不行
1.滚动完用异步(setTimeout)重新渲染一次 --不行
2. 滚动完用异步(setTimeout)将定位改成绝对的再改回固定的 --不行
3. 禁用流畅 将所有的-webkit-overflow-scrolling 设置为auto -- 不行 页面太卡顿了 感觉很不舒服
4. 禁止某个页面流畅 --做不到
5. 使用插件禁用流畅滚动 --不行 一卡一卡的

最后查到文档

    position:absolute;
    z-index:1;

给 -webkit-overflow-scrolling: touch那个样式增加绝对定位 跟层 就可以了 底部的文字也会恢复显示,也不会影响到流畅滚动 这个应该是最完美的解决方法了

因为我没有苹果手机,我觉得有安卓模拟器 应该会有苹果模拟器吧,后来还真的找到了 黑雷苹果模拟器,不过 他ios 的版本比较低,iOS 9.2,打开我的项目 是空白的,不兼容 ,查了半天的资料

 "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all",
      "ie > 9"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version",
      "not dead",
      "ie> 9"
    ]
  },
  //index.js
  import 'react-app-polyfill/ie9';
  import 'react-app-polyfill/stable';

重新删除node_modules文件夹,重新安装,然后重启,终于可以看到页面了

但是接口验证码显示不出来,估计是axios 用了一些高级语法不兼容,用vconsole 打印下报错先 发现 vconsole 根本就用不上 没反应 可能是版本比较高 后面让我找到另一个比较好的

 <script src="//cdn.bootcss.com/eruda/1.5.2/eruda.min.js"></script>
  <script>eruda.init();</script>

这个东西比vconsole全

2817a2f09acb3172f517dc1bb03fd2f.png

这个问题 我之前没见过,查了一些文档,有的说是dom 的id 命名不正确,我除了root 是id其他的都是class

image.png 看到一个类似的问题,试了一下果然是这个问题,让我想起了之前弄小程序 因为api 后面有空格导致没请求,排查了一下午,ios 好像很讨厌空格

研究了一天 还是有收获的,加油!