IOS 移动端兼容

MuYan2022-01-25web

alert\confirm

在用 alert\confirm 时,弹窗都会被添加当前 URL 地址。

重写 alert 跟 confirm 解决:

// 重写 alert
window.alert = function (name) {
  var iframe = document.createElement("IFRAME");
  iframe.style.display = "none";
  iframe.setAttribute("src", "data:text/plain,");
  document.documentElement.appendChild(iframe);
  window.frames[0].window.alert(name);
  iframe.parentNode.removeChild(iframe);
};
// 重写 confirm
window.confirm = function (message) {
  var iframe = document.createElement("IFRAME");
  iframe.style.display = "none";
  iframe.setAttribute("src", "data:text/plain,");
  document.documentElement.appendChild(iframe);
  var alertFrame = window.frames[0];
  var result = alertFrame.window.confirm(message);
  iframe.parentNode.removeChild(iframe);
  return result;
};
  • 相关知识点:html 中 data 类型的 url 有以下几种形式
data:,<文本数据>
data:text/plain,<文本数据>
data:text/html,<HTML代码>
data:text/html;base64,<base64编码的HTML代码>
data:text/css,<CSS代码>
data:text/css;base64,<base64编码的CSS代码>
data:text/javascript,<Javascript代码>
data:text/javascript;base64,<base64编码的Javascript代码>
data:image/gif;base64,base64编码的gif图片数据
data:image/png;base64,base64编码的png图片数据
data:image/jpeg;base64,base64编码的jpeg图片数据
data:image/x-icon;base64,base64编码的icon图片数据

安全区域

  • 安全区域指的是一个可视窗口范围,处于安全区域的内容不受圆角(corners)、齐刘海(sensor housing)、小黑条(Home Indicator)影响。

  • iOS11 新增特性,苹果公司为了适配 iPhoneX 对现有 viewport meta 标签的一个扩展,用于设置网页在可视窗口的布局方式,可设置三个值:

contain: 可视窗口完全包含网页内容
cover:网页内容完全覆盖可视窗口
auto:默认值,跟 contain 表现一致
  • iOS11 新增特性,Webkit 的一个 CSS 函数,用于设定安全区域与边界的距离,有四个预定义的变量:
safe-area-inset-left:安全区域距离左边边界距离
safe-area-inset-right:安全区域距离右边边界距离
safe-area-inset-top:安全区域距离顶部边界距离
safe-area-inset-bottom:安全区域距离底部边界距离

我们主要用到 safe-area-inset-bottom 这个变量,因为它对应的就是底部小黑条的高度(横竖屏时值不一样)。

适配的几种方法

根据项目自行选择。

  1. 设置网页在可视窗口的布局方式,新增 viweport-fit 属性,使得页面内容完全覆盖整个窗口。

只有设置了 viewport-fit=cover,才能使用 constant 函数

<script>
  var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' &&
  (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
  document.write( '
  <meta
    name="viewport"
    content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
				(coverSupport ? ', viewport-fit=cover' : '') + '"
  />
  ')
</script>
  1. 页面主体内容限定在安全区域内

根据实际项目页面场景选择,如果不设置,可能存在小黑条遮挡页面最底部内容的情况。

body {
  padding-bottom: env(safe-area-inset-bottom);
}
  • fixed 吸底元素的适配
.class {
  padding-bottom: env(safe-area-inset-bottom);
  /* 如果吸底元素设置了高度,则需要重新设置 height*/
  height: calc(原有高度 + env(safe-area-inset-bottom));
}
  1. @supports 判断浏览器是否支持

@supports 按照浏览器是否支持一个或多个特定的 CSS 特性应用一组样式声明;

如果只希望 iPhoneX 才需要新增适配样式,我们可以配合 @supports 来隔离兼容样式。

/* @supports 判断浏览器是否支持 bottom: env(safe-area-inset-bottom),执行下面的样式 safe-area-inset-bottom: iphone安全区域距离底部边界距离 */
@supports (bottom: env(safe-area-inset-bottom)) {
  body::after {
    content: "";
    display: block;
    height: constant(safe-area-inset-buttom);
    background-color: white;
  }
}

注:只有设置了 viewport-fit=cover,才能使用 constant 函数

上传照片问题

使用 exif.js 解决 ios 手机上传竖拍照片旋转 90 度问题open in new window

...不定时更新

上次更新 2026/6/23 11:49:15
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8