苹果的iPad Mini在很多方面都是iPad 2的小复制品。在JavaScript中,是窗口。navigator对象为Mini和iPad 2暴露相同的值。到目前为止,我为检测差异而进行的测试还没有成功。

为什么这很重要?

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

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

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

window.devicepixelratio CSS元素宽度,单位为cm CSS媒体查询(如分辨率和-webkit-device-pixel-ratio) SVG图形在类似的单位 在设定的时间内进行各种CSS webkit转换,并使用requestAnimFrame计算呈现的帧数(我希望检测到可测量的差异)

我没办法了。你呢?

更新 谢谢你的回复。我想对那些投票反对检测iPad mini和iPad 2的人发表评论,因为苹果有一个规则。好吧,这是我的理由,为什么我觉得知道一个人用的是iPad mini还是iPad 2真的很有意义。随你怎么解释我的推理。

The iPad mini is not only a much smaller device (9.7 inch versus 7.9 inch), but its form factor allows for a different usage. The iPad 2 is usually held with two hands when gaming unless you're Chuck Norris. The mini is smaller, but it is also much lighter and allows for gameplay where you hold it in one hand and use another to swipe or tap or whatnot. As a game designer and developer myself, I'd just like to know if it's a mini so I can choose to provide the player with a different controlscheme if I want (for instance after A/B testing with a group of players).

为什么?事实证明,大多数用户倾向于使用默认设置,所以当玩家第一次加载游戏时,不要使用虚拟拇指杆,而是在屏幕上放置一些基于点击的控制,这是我和其他游戏设计师希望能够做到的。

所以恕我说,这超出了粗手指/指导方针的讨论,这是苹果和所有其他供应商应该做的事情:允许我们唯一地识别你的设备,以不同的方式思考,而不是遵循指导方针。


当前回答

这里的所有解决方案都不是万无一失的(这就是为什么苹果不会发布一款屏幕大小与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。此外,不要忘记删除无用的divs。

还要注意,Kaspars提出的算法不仅在用户全屏运行应用程序时不起作用,而且在苹果修补浏览器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。我修复了测试代码,使其正常工作。你需要的位置:绝对的divs,所以你可以使用高度%。

EDIT3:我做了一些研究,似乎没有办法在任何设备上获得实际的屏幕大小。这不是操作系统能知道的。当你在CSS中使用一个真实的单元时,它实际上只是一个基于屏幕某些属性的估计。不用说,这一点都不准确。

其他回答

这并不是对你提出的问题的回答,但我希望这比说“不要这样做”更有用:

与其检测iPad Mini,为什么不检测用户很难点击控件(或者:总是在控件的子区域中点击),然后增加/缩小控件的大小来适应他们呢?

对于需要更大控件的用户来说,不管使用什么硬件,他们都可以获得这些控件;那些不需要更大的控制和想要看到更多内容的用户也可以得到。这不像检测硬件那么简单,还有一些细微的事情需要做对,但如果做得仔细的话,效果会很好。

我知道这是一个糟糕的解决方案,但目前区分iPad Mini和iPad 2的唯一方法是检查其构建号,并将每个构建号与相关设备映射。

让我给你一个例子:iPad mini,版本6.0,暴露“10A406”作为构建号,而iPad 2暴露“10A5376e”。

这个值可以很容易地通过用户代理(window.navigator.userAgent)上的正则表达式获得;这个号码的前缀是"Mobile/"。

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

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

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

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

(示例按钮CSS,感谢jsfiddle和cssbuttongenerator)

要求所有使用iPad2用户代理的用户使用内置相机提供一张照片,并使用HTML文件API检测分辨率。由于摄像头的改进,iPad Mini照片的分辨率将会更高。

你也可以创建一个不可见的画布元素,并使用canvas API将其转换为PNG/JPG格式。我没有任何方法来测试它,但由于底层的压缩算法和设备的像素密度,产生的比特可能会有所不同。

让用户从离地面几千英尺的高空扔下他们的iPad。然后使用内部加速度计来测量iPad达到终端速度所需的时间。更大的iPad阻力系数更大,达到终端速度的时间应该比iPad Mini更短。

下面是一些示例代码,可以帮助您入门。

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

当苹果不可避免地以不同的形式发布下一代iPad时,你几乎肯定需要重新审视这段代码。但我相信你会继续跟进事情,并为每一个新版本的iPad保持这个hack。