ChatGPT解决这个技术问题 Extra ChatGPT

在 HTML5 中检测 iPad Mini

Apple 的 iPad Mini 是 iPad 2 的一个较小的克隆版本,其方式比我们想要的要多。在 JavaScript 中,window.navigator 对象为 Mini 和 iPad 2 公开相同的值。到目前为止,我检测差异的测试并未成功。

为什么这很重要?

由于 iPad Mini 和 iPad 2 屏幕的像素相同,但实际尺寸(英寸/厘米)不同,因此它们的 PPI(每英寸像素)有所不同。

对于提供友好用户界面的 Web 应用程序和游戏,某些元素的大小会根据用户的拇指或手指位置进行调整,因此,我们可能希望缩放某些图像或按钮以提供更好的用户体验。

到目前为止我尝试过的事情(包括一些非常明显的方法):

window.devicepixelratio

以厘米为单位的 CSS 元素宽度

CSS 媒体查询(例如分辨率和 -webkit-device-pixel-ratio)

类似单位的 SVG 绘图

在设定的时间内进行各种 CSS webkit 转换并使用 requestAnimFrame 计算渲染帧(我希望检测到可测量的差异)

我的想法很新鲜。你呢?

更新感谢到目前为止的回复。我想评论一下人们投票反对检测 iPad mini 与 2,因为 Apple 有 uhm,一个统治他们的指导方针。好的,这就是为什么我觉得知道一个人使用的是 iPad mini 还是 iPad 2 真的很有意义的原因。按照我的推理去做你喜欢的事。

iPad mini 不仅是一个小得多的设备(9.7 英寸对 7.9 英寸),而且它的外形尺寸允许不同的用途。除非您是 Chuck Norris,否则在玩游戏时通常用两只手握住 iPad 2。迷你更小,但它也更轻,允许你用一只手握住它并用另一只手滑动或点击或诸如此类的游戏。作为一名游戏设计师和开发人员,我只想知道它是否是迷你版,以便我可以根据需要选择为玩家提供不同的控制方案(例如在 A/B 测试之后一群玩家)。

为什么?好吧,事实证明,大多数用户倾向于使用默认设置,因此当玩家加载第一次玩游戏是我,可能还有其他游戏设计师,希望能够做到的事情。

因此,恕我直言,这超出了粗略的手指/指南讨论,这只是 Apple 和所有其他供应商应该做的事情:允许我们唯一地识别您的设备并以不同的方式思考,而不是遵循指南。

好问题..即使我在寻找解决方案。在网上找不到任何东西
最好的办法是向苹果提交错误bugreporter.apple.com如果有足够多的人这样做,他们就有希望听到我们的声音。目前的情况相当令人沮丧。
你不能使用 -webkit-min-device-pixel-ratio: 吗?至于 iPhone 4 mobilexweb.com/blog/…
嗯,跟随HIG而不是尝试这样做怎么样?这是浪费时间和精力,并且真诚地让我读到这里感到恶心。为什么人们不能以正确的方式做事?

A
Avi Marcus

当右声道和左声道的音量很高时播放立体声音频文件并比较加速度计响应 - iPad2 有单声道扬声器,而 iPad Mini 有内置立体声扬声器。

需要您的帮助来收集数据,请访问 this page 并帮助我为这个疯狂的想法收集数据。我没有 iPad mini,所以我真的需要你的帮助


您不认为访问网站时设备发出声音是个坏主意吗?更不用说人们可能会让他们的设备处于静音状态。没有声音可以阻止这一切。
对此稍作修改:播放立体声音频文件,其中右声道是左声道的反转版本。对于单个扬声器,它们应该取消并且不影响加速度计。但无论哪种方式,依靠扬声器+加速度计是超级不可靠的。
确实需要有人实施此解决方案并显示结果。
沿着这些思路,在 iPad2 上,new webkitAudioContext().destination.numberOfChannels 返回什么?
@flexd您不认为进行设备检测是个坏主意吗?
K
Kaspars

更新:It looks like这些值在标签创建时报告视口宽度和高度,并且它们不会在旋转时改变,因此此方法不能用于设备检测

您可以使用 screen.availWidthscreen.availHeight,因为它们对于 iPad Mini 和 iPad 2 似乎有所不同。

小型平板电脑

screen.availWidth = 768
screen.availHeight = 1004

平板电脑 2

screen.availWidth = 748
screen.availHeight = 1024

来源:http://konstruktors.com/blog/web-design/4396-detect-ipad-mini-javascript/


到目前为止,看起来像是最好的不妥协的解决方案。
我想知道这个区别。我认为两者都使用相同的分辨率?这两种设备上的 Safari 浏览器是否不同?
这是打开了多少标签的检测器。在我的 iPad 3 上,当我打开多个水龙头时,它会报告不同的值,与屏幕截图上的报告相匹配。 iPad mini 屏幕截图打开了两个选项卡,而 iPad 2 截图只有一个。当我打开一个或两个选项卡时,我的 iPad 3 会报告匹配值。
不,这不是一个检测器打开了多少标签:这是一个检测器,当第一次“使用”用于加载此页面的标签时,设备打开的方向。我不确定这是否是因为在您旋转选项卡后,视口的大小实际上现在实际上固定在该值,或者它只是在某处被错误地缓存,但是如果您坐在那里玩多个选项卡以各种旋转配置你可以看到它是如何关联的。有趣的是,如果您切换选项卡、旋转,然后返回上一个选项卡并重新加载,它会更新。
是的,杰伊,我确实犯了类似的错误,将结果错误地归因于错误的原因。但我的隐含观点认为,这不是 iPad mini 的检测器,因为它会在其他 iPad 上给出假阳性结果。
f
flexd

我知道这可能是一个技术含量低的解决方案,但是因为我们似乎还没有想出其他任何东西..

我假设您已经检查了大多数其他设备,所以我看到了以下可能的情况。

您可以检查所有可能需要特殊 CSS/尺寸的最受欢迎的设备,如果它不匹配这些设备,要么假设它是 iPad mini,要么只是询问用户?

// Device checks here
...
else {
  // it would probably be better to make this a nicer popup-thing
  var mini = prompt("Are you using a iPad mini? Press yes for a better user experience");
  // Store the result for future visits somehow.
}

我知道现在这似乎是一种愚蠢的方法,但如果我们目前无法确定该设备是 iPad mini 还是 iPad 2,至少该网站可以用于 iPad mini 设备执行类似操作。

你甚至可以用这样的东西:

“为了给您最好的浏览体验,我们尝试检测您的设备类型以根据您的设备自定义网站。不幸的是,由于限制,这并不总是可行的,我们目前无法确定您使用的是 iPad 2 还是 iPad mini 通过使用这些方法。

为获得最佳浏览体验,请在下方选择您使用的设备。

此选择将被存储以供将来在此设备上访问该网站。

[] iPad 2 
[*] iPad mini
[] Ancient blackberry device

"

我并不完全熟悉在 Javascript 中可以和不能在客户端执行的操作。我知道你可以获取用户的IP,但是可以获取用户的mac地址吗? iPad2 和 iPad mini 的范围是否不同?


我非常同意这个解决方案。允许用户选择(并可能更改)他们的设备比将他们锁定在你认为他们想要的东西上要好。如果您可以相当准确地确定设备;将其用作默认设置,但我认为您应该始终提供选择 - 即使它隐藏在设置菜单中。
@LiamNewmarch 我也是猜测和提示用户的忠实粉丝,而不是假设用户偏好并将其锁定。有时我想在我的 iPad 上使用桌面网站。通常我想使用英文版的网站,不管该死的 IP-to-Geo 数据库显示我目前的地理位置!先生,您有我的赞成票。
但是,建议不要使用弹出问题。当它自动登录时做一个像 SO 那样的横幅。所以用户可以在他们不想回答时阅读页面,而不是被迫离开他们的思维方式来回答问题。
通过向用户询问问题,您会降低用户体验,足以让 Apple 做出改变,因为这是人们非常关心的事情。
-1:我讨厌在我访问它们时问我问题的页面。我的回答是:“谁在乎,只给我看内容!”。 iPad2 和 iPad mini 之间的差异还不够大(恕我直言),不能保证这种方法。 JS 是的,没有问题。
D
Dave L.

我知道这是一个可怕的解决方案,但目前区分 iPad Mini 和 iPad 2 的唯一方法是检查其内部版本号并将每个内部版本号与相关设备映射。

让我举个例子:iPad mini 6.0 版公开“10A406”作为内部版本号,而 iPad 2 公开“10A5376e”。

该值可以通过用户代理 (window.navigator.userAgent) 上的正则表达式轻松获得;该号码以“Mobile/”为前缀。

不幸的是,这是检测 iPad Mini 的唯一明确方法。我建议采用与 viewport 相关的方法(在支持的情况下,使用 vh / vw 单位)在不同的屏幕尺寸上正确显示内容。


内部版本号似乎是关键,但我注意到内部版本号可能会因购买设备的国家/地区而异。例如,在希腊,iPad 2 内部版本号似乎是 10A403 而不是 10A5376e,我也看到了来自美国 iPad 2。我猜mini的内部版本号也可能不同。
这个解决方案是不正确的。在某些情况下:“内部版本号”描述的是操作系统,而不是硬件。现在,如果不同的设备总是有不同的操作系统版本,那很好,但在过去,每个新设备附带的第一个操作系统版本才如此。在这种情况下,10A406 是 iPad Mini 6.0 的内部版本号,10A403 是 iPad 2 6.0 的内部版本号(不是 10A5376e,它是 6.0 beta 4)。但是,两者的 6.0.1 版本号已经是 10A523,因此当前版本已经相同,未来的版本将继续。
我担心杰伊是正确的,检查了我的数据(例如):内部版本号反映了操作系统。
你试过这个 PPI hack 吗? stackoverflow.com/questions/279749/… - 基本上创建一个宽度为 1 英寸的隐藏元素,然后以像素为单位获取宽度。那应该可以解决您的根本问题。
@JohnLBevan:这可以解决渲染问题,但是日志分析等呢?根本问题在于我们在库比蒂诺的朋友以及对“原生”应用程序的推动。
M
Mr. Berna

tl;dr 不要补偿 iPad mini 和 iPad 2 之间的差异,除非您还可以补偿胖手指和瘦手指之间的差异。

苹果似乎故意不让你分辨出区别。 Apple 似乎不希望我们为不同尺寸的 iPad 编写不同的代码。我自己不是Apple的一部分,我不确定,我只是说这就是它的样子。也许,如果开发者社区为 iPad mini 设计了一款精美的检测器,Apple 可能会在未来的 iOS 版本中故意破坏该检测器。 Apple 希望您将最小目标尺寸设置为 44 iOS 点,iOS 将以两种尺寸显示,较大的 iPad 尺寸和较小的 iPhone/iPad mini 尺寸。 44 分已经够大了,你的用户肯定会知道他们是否在使用较小的 iPad,因此可以自行补偿。

我建议回到您要求检测器的陈述的原因:调整目标大小以使最终用户感到舒适。通过决定在大 iPad 上设计一种尺寸,在小 iPad 上设计另一种尺寸,您就是在决定所有人的手指尺寸都相同。如果你的设计足够紧凑,iPad 2 和 iPad mini 的尺寸差异会产生影响,那么我和我妻子之间手指的大小会产生更大的差异。所以补偿用户手指大小,而不是 iPad 型号。

我有一个关于如何测量手指大小的建议。我是本地 iOS 开发人员,所以我不知道这是否可以在 HTML5 中完成,但这是我在本地应用程序中测量手指大小的方法。我会让用户将两个物体捏在一起,然后测量它们靠得有多近。较小的手指会使物体靠得更近,您可以使用此测量值推导出比例因子。这会根据 iPad 尺寸自动调整。与 iPad 2 相比,同一个人在 iPad mini 上的屏幕点测量值更大。对于游戏,您可以将其称为校准步骤,甚至不说出来。把它作为一个开始的步骤。例如,在射击游戏中,让玩家通过捏合动作将弹药放入枪中。


第一段是正确答案。推荐的 44 点目标大小非常合适。
伙计,要是我再多投一千票就好了。第一段确实是它,你赢了互联网。
P
Peter Mortensen

要求用户将他们的 iPad 从离地数千英尺的地方放下。然后使用内部加速度计测量 iPad 达到终端速度所需的时间。较大的 iPad 具有较大的阻力系数,并且应该在比 iPad Mini 更短的时间内达到终端速度。

这是一些示例代码,可帮助您入门。

function isIPadMini( var timeToReachTerminalVelocity )
{
    return (timeToReachTerminalVelocity > IPAD_MINI_THRESHOLD);
}

当 Apple 不可避免地以不同的形式发布下一代 iPad 时,你几乎肯定需要重新审视这段代码。但我相信你会保持领先地位,并为每个新版本的 iPad 维护这个 hack。


那不应该是“比 iPad mini 更多的时间”吗?
很好的伽利略式思路适用于现代问题……我想知道下一步是什么……
为了使这一点更可靠,iPad 保护套应在掉落前取下。
B
BenM

不幸的是,目前这似乎是不可能的:http://www.mobilexweb.com/blog/ipad-mini-detection-for-html5-user-agent

两天前,我在推特上发布了第一个检测到的问题:“已确认 iPad Mini 用户代理与 iPad 2 相同”。我收到了数百个回答,说用户代理嗅探是一种不好的做法,我们应该检测功能而不是设备等。好吧,伙计们,你是对的,但它与问题没有直接关系。我需要补充第二个坏消息:也没有客户端技术可以进行“特征检测”。


@net.uk.sweet - 那你为什么不编辑答案并修正错误呢?顺便说一句,引用文本中的英语似乎并没有那么糟糕。
@shi 你怎么知道引用文字的作者是意大利人?我也不是以英语为母语的人。哈哈
“没有客户端技术可以进行'特征检测'”是完全错误的。特征检测!=设备检测
@Mytic Moon 我刚刚查看了上述帖子中链接的原始文章,其中包含有关作者的信息。
A
Assaf Lavie

这是一个狂野的镜头,但 iPad 2 和 iPad mini 的区别之一是前者没有 3 轴陀螺仪。也许可以使用 WebKit 设备方向 API 来查看您可以从中获得哪些信息。

例如,this page 似乎表明您只能在设备有陀螺仪的情况下获得 rotationRate 值。

抱歉,我无法提供有效的 POC - 我无法使用 iPad mini。也许对这些方向 API 有更多了解的人可以在这里加入。


因此,Apple 的网站并没有将 iPad 2 上的陀螺仪描述为“3 轴”陀螺仪;但是,当他们说“陀螺仪”时,它们指的是一种特定类型的部件(这样,开发需要陀螺仪功能的游戏的应用程序开发人员可以放心,它在那里并且可以为他们工作)。如果您在 Google 上搜索“3 轴陀螺仪”“iPad 2”,您会发现 2010 年末和 2011 年初的许多文章都在谈论 iPad 2 预计将如何配备相同的 3 轴陀螺仪部件iPhone 4 已经有了:当它问世时,我们并没有失望;P。
这是我提出建议的依据:apple.com/ipad/ipad-2/specs.html 它没有提到任何陀螺仪。只有“加速度计”。鉴于此,以及他们的文档似乎暗示某些设备仅支持运动 API 的子集这一事实,值得一试。我会的,如果我有一个 iPad mini...
不,说真的:它在与“加速度计”相同的小部分中显示“陀螺仪”。我想我可以发布您刚刚链接的网页的屏幕截图,突出显示“陀螺仪”一词,但您应该可以使用 ctrl-F 找到它。 (编辑:好的,出于幽默价值,我这样做了:i.imgur.com/8BZhx.png <- 现在看到了吗?;P)无论如何,如果你去较低的位置,让“3 轴陀螺仪”的差异更加平息 -苹果为这种东西保留的水平页面供历史支持参考,你可以看到它甚至专门写着“3轴陀螺仪”。 support.apple.com/kb/SP622
好吧,真的没有必要推测 iPad mini 和 iPad 2 中的运动 API 功能之间是否真的存在差异。这只是尝试和观察的问题。那么,这里谁有 iPad mini?无论如何,我是通过查看这两种设备的技术规格并寻找可能在 HTML/JS 中感知到的差异来产生这个想法的。可能还有其他差异。
D
Douglas

好吧,iPad 2 和 iPad Mini 有不同尺寸的电池。

如果 iOS 6 支持,您可以使用 window.navigator.webkitBattery.level0.0..1.0 获取当前电池电量。在硬件或软件的某个级别上,这可能计算为 CurrentLevel / TotalLevel,其中两者都是整数。如果是这样,那将产生一个浮点数,它是 1 / TotalLevel 的倍数。如果您从两个设备上获取大量电池电量读数,并计算 battery.level * n,您可能会找到一个 n 值,其中所有结果都开始接近整数,这将为您提供 iPad2TotalLeveliPadMiniTotalLevel

如果这两个数字不同且互质,那么在生产中您可以计算 battery.level * iPad2TotalLevelbattery.level * iPadMiniTotalLevel。哪个更接近整数将指示正在使用哪个设备。

对不起,这个答案中的 if 数量!希望会有更好的东西出现。


m
martin's

编辑1:下面我的原始答案是“不要这样做”。为了积极起见:

我认为,真正的问题与 iPad X 与 iPad mini 无关。我认为这是关于优化 UI 元素尺寸和放置到用户的人体工程学。您需要确定用户手指的大小,以驱动您的 UI 元素大小,也许还有定位。再一次,这可能是并且应该可以在不需要真正知道您正在运行的设备上的情况下实现。让我们夸大一下:您的应用程序在 40 英寸对角线屏幕上运行。不知道品牌和型号或 DPI。你如何调整控件的大小?

您需要在站点/游戏中显示一个作为门控元素的按钮。我将由您决定在何处或如何进行此操作。

虽然用户会将其视为单个按钮,但实际上它将由紧凑的小按钮矩阵组成,这些按钮在视觉上被覆盖以显示为单个按钮图像。想象一个由 400 个按钮组成的 100 x 100 像素按钮,每个按钮 5 x 5 像素。您需要进行试验以了解此处的意义以及您的采样需要多小。

按钮数组的可能 CSS:

.sense_row {
  width:100px;
  height:5px;
  margin:0;
  padding:0;
}

.sense_button {
  float:left;
  width:3px;
  height:3px;
  padding:0px;
  margin:0px;
  background-color:#FF0;
  border:1px solid #000;
} 

结果数组:

https://i.stack.imgur.com/azVsS.png

当用户触摸按钮阵列时,您将有效地获取用户手指接触区域的图像。然后,您可以使用您想要的任何标准(可能是根据经验得出的)以获得一组数字,您可以使用这些数字来根据您的要求缩放和定位各种 UI 元素。

这种方法的美妙之处在于您不再关心您可能正在处理的设备名称或型号。您只关心用户手指相对于设备的大小。

我想这个 sense_array 按钮可以作为进入应用程序的过程的一部分被隐藏。例如,如果它是一个游戏,可能有一个“播放”按钮或带有用户名的各种按钮,或者选择他们将玩什么级别的方法等。你明白了。 sense_array 按钮可以位于用户必须触摸才能进入游戏的任何位置。

编辑 2: 只是注意到您可能不需要那么多感应按钮。一组同心圆或按钮排列成一个巨大的星号 * 可能就可以了。你必须进行实验。

用我的旧答案,下面,我给你硬币的两面。

旧答案:

正确答案是:不要这样做。这是个坏主意。

如果您的按钮太小以至于无法在 mini 上使用,则您需要将按钮变大。

如果我在开发原生 iOS 应用程序中学到了什么,那就是试图超越 Apple 是一种过度痛苦和恶化的公式。如果他们选择不允许您识别设备,那是因为,在他们的沙箱中,您不应该这样做。

我想知道,您是否正在调整纵向与横向的大小/位置?


等等,你读过这个问题吗? “某些元素的大小相对于用户的拇指或手指位置进行了调整”
我的问题是关于 OP 是否正在根据纵向/横向方向调整元素。 Web 浏览器将自动调整为横向的额外宽度并呈现大于纵向的所有内容。我只是想指出——除非你把所有东西都锁定了——除非你正在编写一个原生 iOS 应用程序,否则几乎没有办法针对每一种可能的设备、方向和用户进行优化。即使这样,您也可能要小心您所做的选择。这可以通过网络应用程序和 javascript 完成吗?大概。我只是不认为这是一个好主意。
啊,我明白了。也很有趣的编辑,很想在实践中看到类似的东西。
像这样的“感觉阵列”会起作用吗?我会假设 iOS 会选择最接近用户触摸位置的单元格,并且只“单击”该单元格,而不是用户手指下方的每个单元格。不过,如果它确实有效,那将非常酷。
没有理由不工作。它是一组响应触摸事件并发送消息的对象。
L
Les

微基准测试怎么样,在 iPad 2 上计算大约需要 X 微秒,在 iPad mini 上大约需要 Y 秒。

它可能不够准确,但 iPad mini 的芯片可能更有效地执行某些指令。


C
Cœur

是的,检查陀螺仪是个好方法。你可以很容易地做到这一点

https://developer.apple.com/documentation/webkitjs/devicemotionevent

或类似的东西

window.ondevicemotion = function(event) {
    if (navigator.platform.indexOf("iPad") != -1 && window.devicePixelRatio == 1) {
        var version = "";
        if (event.acceleration) version = "iPad2";
        else version="iPad Mini";

        alert(version);
    }
    window.ondevicemotion = null;
}​

没有任何 iPad 来测试它。


此解决方案不起作用(在 iPad Mini 和 iPad 2 上测试:两者都被检测为“iPad2”)为 1)如果设备具有花哨的陀螺仪或较旧的加速度计,则 event.acceleration 功能旨在工作,并且2) 根据 Apple 的网站,iPad Mini 和 iPad 2 都有花哨的陀螺仪部分,所以这个检查的概念一开始就不可能奏效。
V
Vlad Magdalin

要求所有使用 iPad2 用户代理的用户提供照片 using the built in camera 并使用 HTML File API 检测分辨率。由于相机的改进,iPad Mini 照片的分辨率将更高。

您还可以尝试创建一个不可见的画布元素,并使用 Canvas API 将其转换为 PNG/JPG。我没有任何方法对其进行测试,但由于底层压缩算法和设备的像素密度,结果位可能会有所不同。


T
TK.

你总是可以问用户?!

如果用户看不到按钮或内容,则为他们提供一种自行管理缩放的方法。您始终可以在网站上构建一些缩放按钮,以使内容(文本/按钮)更大/更小。这将(几乎)保证适用于任何当前的 iPad 分辨率,并且可能适用于苹果决定他们想要制作的任何未来分辨率。


S
Stephen Canon

这不是您提出的问题的答案,但我希望它比说“不要那样做”更有用:

与其检测 iPad Mini,为什么不检测用户在点击控件时遇到困难(或者:一直在点击控件的子区域),然后增大/缩小控件的大小以适应它们?

无论硬件如何,需要更大控制的用户都能获得它们;不需要更大控件并希望查看更多内容的用户也可以使用。这不是仅仅检测硬件那么简单,并且会有一些微妙的事情要做好,但如果仔细完成它可能会非常好。


C
Community

这让我想起了电影《平衡》中的一句话:

“你会说,什么是从格拉姆顿牧师那里拿走武器的最简单方法?” “你问他。”

我们已经习惯于为解决方案而战,有时,最好问问。 (我们通常不这样做是有充分理由的,但它始终是一种选择。)这里的所有建议都很棒,但一个简单的解决方案可能是让你的程序在启动时询问他们正在使用哪个 iPad .

我知道这是一个厚颜无耻的回答,但我希望它提醒我们不必为所有事情而战。 (我已经为反对票做好了准备。:P)

一些例子:

操作系统安装期间的键盘检测有时无法检测到特定的键盘,因此安装程序必须询问。

Windows 会询问您连接的网络是家庭网络还是公共网络。

计算机无法检测到即将使用它的人,因此它们需要用户名和密码。

祝你好运 - 我希望你能找到一个很棒的解决方案!但是,如果您不这样做,请不要忘记这一点。


非技术用户可能不会意识到这一点。
P
Peter Mortensen

不是回答问题,而是问题背后的问题:

您的目标是在较小的屏幕上改善用户体验。 UI 控件的外观是其中的一部分。 UX 的另一部分是应用程序的响应方式。

如果您将响应轻击的区域做得足够大以在 iPad Mini 上对用户友好,同时保持 UI 控件的视觉表示足够小以在 iPad 上视觉上令人愉悦,该怎么办?

如果您收集了足够多的不在可视区域中的点击,您可以决定在视觉上缩放 UI 控件。

作为奖励,这也适用于 iPad 上的大手。


P
Peter Mortensen

这里的所有解决方案都不是面向未来的(这会阻止 Apple 发布屏幕尺寸与 iPad 2 相同但分辨率与 iPad Mini 相同的 iPad)。于是我想出了一个主意:

创建一个 1 英寸宽的 div 并将其附加到正文中。然后我创建另一个 100% 宽度的 div 并将其附加到正文:

var div1= $("<div/>").appendTo(document.body).width("1in");
var div2= $("<div/>").appendTo(document.body).width("100%");

jQuery width() 函数总是以像素为单位返回值,因此您可以:

var screenSize= div2.width() / div1.width();

screenSize 现在以英寸为单位保存应用程序可用的大小(但要注意舍入错误)。您可以使用它以您喜欢的方式放置您的 GUI。之后也不要忘记删除无用的 div。

另请注意,Kaspars 提出的算法不仅在用户以全屏方式运行应用程序时不起作用,而且如果 Apple 修补浏览器 UI,它也会中断。

这不会区分设备,但正如您在编辑中解释的那样,您真正想知道的是设备屏幕尺寸。我的想法也不会告诉您确切的屏幕尺寸,但它会为您提供更有用的信息,即您可用于绘制 GUI 的实际尺寸(以英寸为单位)。

编辑:使用此代码检查它是否真的适用于您的设备。我没有任何 iPad 来测试它。

var div1= $("<div/>").appendTo(document.body).width("1in").height("1in").css("position", "absolute");
var div2= $("<div/>").appendTo(document.body).width("100%").height("100%").css("position", "absolute");
var width= div2.width() / div1.width()
var height= div2.height() / div1.height()
alert(Math.sqrt(width*width + height*height));

它应该会弹出一个以英寸为单位的屏幕大小的窗口。它似乎可以在我的笔记本电脑上运行,返回 15.49,而我的笔记本电脑屏幕以 15.4 英寸销售。任何人都可以在 iPad 上对此进行测试并发表评论吗?不要忘记全屏运行它。

EDIT2:事实证明,我测试它的页面有一些冲突的 CSS。我修复了测试代码现在可以正常工作。您需要在 div 上使用 position: absolute,以便您可以使用 % 中的高度。

EDIT3:我做了一些研究,似乎没有办法在任何设备上实际获得屏幕尺寸。这不是操作系统可以知道的。当您在 CSS 中使用真实世界的单位时,它实际上只是基于屏幕某些属性的估计。不用说,这根本不准确。


你测试过吗? Mini 和 iPad 上的 1 英寸真的是物理上的 1 英寸吗? Mini 上的 1 英寸可能仅显示为 1/2 英寸。
在 iPad 2、3 和 Mini 上测试。所有三个都返回 3.8125。
@AlfredNerstu 真的吗?这是一个已知的 Safari 错误吗?你可以在 Safari for mac 上测试它吗?
@AlfredNerstu 抱歉代码错误,我现在修复了它,我最初测试它的页面有一些冲突的 CSS,使它有点工作。事实证明,您需要在 div 上使用 position: absolute 以使用 % 中的高度值。现在,该代码在我的 15.4 英寸笔记本电脑上的“干净”页面上为我提供了 15.49 英寸(除了 div 之外没有 css 和元素)。
我尝试了新代码,现在所有 2、3 和 Mini 都返回 9.5。我在 jsfiddle 中运行代码,不知道这是否会搞砸?更有可能的是,iOS 上的 Safari 是为 9.7 英寸屏幕制作的,并相应地呈现 1 英寸?
g
gb.

未经测试,但不是播放音频文件并检查平衡,它可以收听麦克风,提取背景噪音,并计算其“颜色”(频率图)。如果 iPad Mini 的麦克风型号与 iPad 2 不同,那么它们的背景颜色应该会有明显的不同,一些音频指纹识别技术可能会帮助您分辨正在使用的设备。

我不认为在这种特定情况下这可能是可行的并且值得麻烦,但我认为指纹识别背景噪音可以在某些应用程序中使用,例如当你在建筑物内时告诉你你在哪里。


C
Community

基于关于 iPad 2 上 new webkitAudioContext().destination.numberOfChannelsDouglas 问题,我决定运行一些测试。

检查 numberOfChannels 在 iPad mini 上返回 2,但在 iOS 5 和 2 以及 iOS 6 的 iPad 2 上没有。

然后我尝试检查 webkitAudioContext 是否可用

var hasWebkitAudio = typeof(webkitAudioContext) === "object";
alert(hasWebkitAudio);​

同样在这里 iPad Mini 和 iPad 2 与 iOS 6 返回 true 而 iPad 2 与 iOS 5 返回 false。

(此测试不适用于桌面,用于桌面检查 webkitAudioContext 是否为函数)。

以下是供您试用的代码:http://jsfiddle.net/sqFbc/


S
Scovetta

如果你创建了一堆 1"x1" 宽的 div 并将它们一个接一个地附加到父 div 直到边界框从 1 英寸跳到 2 英寸怎么办? mini 上的一英寸与 iPad 上的一英寸大小相同,对吧?


所以我尝试了这个,但在 mini 上,“英寸”比普通 iPad 上的“英寸”小。所以这种方式行不通。
S
Srg

在 iOS7 中,用户可以调整系统范围的设置:当内容变得太小而无法阅读时,可以更改文本大小设置。

该文本大小可用于形成合理尺寸的 UI,例如按钮(在 iPad Mini Retina 上测试以响应文本大小设置更改):

padding: 0.5em 1em 0.5em 1em;
font: -apple-system-body;    

sample 按钮 CSS,感谢 jsfiddle 和 cssbuttongenerator)


C
Community

我通过创建画布 that is larger an iPad mini can render、填充像素然后读取颜色来检测 iPad mini。 iPad mini 将颜色读取为“000000”。其他一切都将其渲染为填充颜色。

部分代码:

function rgbToHex(r, g, b) {
    if (r > 255 || g > 255 || b > 255)
        throw "Invalid color component";
    return ((r << 16) | (g << 8) | b).toString(16);
}
var test_colour = '8ed6ff';
working_context.fillStyle = '#' + test_colour;
working_context.fillRect(0,0,1,1);
var colour_data = working_context.getImageData(0, 0, 1, 1).data;
var colour_hex = ("000000" + rgbToHex(colour_data[0], colour_data[1], colour_data[2])).slice(-6);

我需要这个来调整画布大小,所以它是我用例中的特征检测。