当前位置: 首页 > news >正文

JavaScript 判断 iPhone X Series 机型

原文链接:JavaScript 判断 iPhone X Series 机型

写在前面

如果有更优雅的方式,一定要告诉我!

现状

iPhone X 底部是需要预留 34px 的安全距离,需要在代码中进行兼容。

现状对于 iPhone X 的判断基本是这样的:

// h5
export const isIphonex = () => /iphone/gi.test(navigator.userAgent) && window.screen && (window.screen.height === 812 && window.screen.width === 375);
复制代码

这在之前是没问题的,新的 iPhone X Series 设备发布之后,这个就会兼容就有问题。

iPhone X Series 参数

机型倍率分辨率pt
iPhone X32436 × 1125812 × 375
iPhone XS32436 × 1125812 × 375
iPhone XS Max32688 × 1242896 × 414
iPhone XR21792 × 828896 × 414

width === 375 && height === 812 只能识别出 iPhone X 和 iPhone XS,对于 iPhone XS Max 和 iPhone XR 就无能为力了。

解决方法

对每个机型进行判断

const isIphonex = () => {
  // X XS, XS Max, XR
  const xSeriesConfig = [
    {
      devicePixelRatio: 3,
      width: 375,
      height: 812,
    },
    {
      devicePixelRatio: 3,
      width: 414,
      height: 896,
    },
    {
      devicePixelRatio: 2,
      width: 414,
      height: 896,
    },
  ];
  // h5
  if (typeof window !== 'undefined' && window) {
    const isIOS = /iphone/gi.test(window.navigator.userAgent);
    if (!isIOS) return false;
    const { devicePixelRatio, screen } = window;
    const { width, height } = screen;
    return xSeriesConfig.some(item => item.devicePixelRatio === devicePixelRatio && item.width === width && item.height === height);
  }
  return false;
}
复制代码

统一处理方法

因为现在 iPhone 在 iPhone X 之后的机型都需要适配,所以可以对 X 以后的机型统一处理,我们可以认为这系列手机的特征是 ios + 长脸

在 H5 上可以简单处理。

const isIphonex = () => {
  if (typeof window !== 'undefined' && window) {
    return /iphone/gi.test(window.navigator.userAgent) && window.screen.height >= 812;
  }
  return false;
};
复制代码

媒体查询

@media only screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) {
}
@media only screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) {
}
@media only screen and (device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) {
}
复制代码

媒体查询无法识别是不是 iOS,还得加一层 JS 判断,否则可能会误判一些安卓机。

相关文章:

  • 学习HTTP相关知识笔记
  • 报错 could not find php_pdo或者driver
  • 智慧出行加持广西春运 科技让回家变得简单从容
  • 计算性能提升100倍,Uber推出机器学习可视化调试工具
  • 用垃圾回收机制解释JavaScript中的闭包
  • 阿里云Kubernetes容器服务上体验Knative
  • 用编码器-解码器-重构器框架实现英语-日语的神经机器翻译
  • netty-客户端.channel()方法 源码分析.md
  • Java 多线程编程之:notify 和 wait 用法
  • django之配置静态文件
  • 区块链多币种测试网络钱包(开源)
  • 滴滴出行基于RocketMQ构建企业级消息队列服务的实践
  • TypeScript实现数据结构(一)栈,队列,链表
  • 阿里云移动端播放器高级功能介绍
  • CentOS 7 防火墙操作
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • @jsonView过滤属性
  • Angular6错误 Service: No provider for Renderer2
  • HomeBrew常规使用教程
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • v-if和v-for连用出现的问题
  • 读懂package.json -- 依赖管理
  • 马上搞懂 GeoJSON
  • 漂亮刷新控件-iOS
  • 思考 CSS 架构
  • 小而合理的前端理论:rscss和rsjs
  • #100天计划# 2013年9月29日
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (六)Hibernate的二级缓存
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • .NET Core 项目指定SDK版本
  • .Net Web项目创建比较不错的参考文章
  • .NetCore部署微服务(二)
  • .NET连接数据库方式
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @Async注解的坑,小心
  • [ NOI 2001 ] 食物链
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • []C/C++读取串口接收到的数据程序
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [Android] Upload package to device fails #2720
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [C++]18:set和map的使用
  • [codevs 1288] 埃及分数 [IDdfs 迭代加深搜索 ]
  • [CSS]CSS 的背景
  • [Docker]五.Docker中Dockerfile详解
  • [HNOI2008]玩具装箱toy
  • [IDF]啥?
  • [javaSE] 看知乎学习工厂模式
  • [Linux] 一文理解HTTPS协议:什么是HTTPS协议、HTTPS协议如何加密数据、什么是CA证书(数字证书)...
  • [Lucas定理]【学习笔记】