如何使用 javascript 获得真正的 PPI(每英寸像素)设备分辨率?
预期设备和值的一些示例:
- iMac 27 英寸:109ppi
- iPad:132ppi
- 19 英寸 1440x900 屏幕:89ppi
- ...
如何使用 javascript 获得真正的 PPI(每英寸像素)设备分辨率?
预期设备和值的一些示例:
直接在操作系统之上运行本机应用程序是获取存储在 EDID 中的客户端监视器的物理特征的唯一可靠方法。目前没有主流浏览器引擎通过任何 Web API 提供此信息,并且在可预见的将来可能不会。然而,有几种方法可以将密度近似为不同的精度水平。
所有现代浏览器都通过 devicePixelRatio、deviceXDPI 等属性提示像素密度,这些属性基本上告诉您客户端正在进行多少缩放(相对于 1.0x 操作系统默认缩放)。如果您只针对 Apple 系列等少数设备,那么您可能能够分辨出哪个是哪个,尽管 Apple 并没有留下一点线索来区分 iPad mini 和普通 iPad。
另一种选择是使用设备数据库或专有软件分析客户端的“用户代理字符串”来实现对设备的命中或未命中猜测,然后查找与该设备关联的 DPI(如果它存在于他们的大数据库中)。通过利用复杂的数据挖掘算法,昂贵的专有系统可能具有更高的准确性,但无论如何,像这样的任何系统都需要不断手动更新,并且仍然对客户端操作保持开放,因为它们可以更改其用户代理字符串(“以桌面模式查看此网站” )
没有这些信息真的很不幸。我花了无数个小时研究任何可能的方式来制作一个 PPI 感知 Web 应用程序。
也许有一天,有人能够说服 WebKit、Mozilla 或 Microsoft 的人们允许人们为增强现实等创建可感知 PPI 的 Web 应用程序……叹息
在纯 JS 中:
function calcScreenDPI() {
const el = document.createElement('div');
el.style = 'width: 1in;'
document.body.appendChild(el);
const dpi = el.offsetWidth;
document.body.removeChild(el);
return dpi;
}
您可以创建一个1in
固定高度的元素,然后以像素为单位查看其高度
createDpiTestElements()
var dpi = getDpi()
因为
[dpi] = [px/in]
所以让
p
是以像素为单位的对象长度 [px]i
以英寸为单位的物体长度 [in]d
成为该对象的搜索 DPI/PPI,以每英寸像素 [dpi] 为单位我们得到
d = p/i
所以如果我们选择
i = 1
我们得到
d = p
/**
* @function
* @inner
*/
function createDpiTestElements () {
var getDpiHtmlStyle = 'data-dpi-test { height: 1in; left: -100%; position: absolute; top: -100%; width: 1in; }'
var head = document.getElementsByTagName('head')[0]
var getDPIElement = document.createElement('style')
getDPIElement.setAttribute('type', 'text/css')
getDPIElement.setAttribute('rel', 'stylesheet')
getDPIElement.innerHTML = getDpiHtmlStyle
head.appendChild(getDPIElement)
var body = document.getElementsByTagName('body')[0]
var dpiTestElement = document.createElement('data-dpi-test')
dpiTestElement.setAttribute('id', 'dpi-test')
body.appendChild(dpiTestElement)
}
/**
* Evaluate the DPI of the device's screen (pixels per inche).
* It creates and inpect a dedicated and hidden `data-dpi-test` DOM element to
* deduct the screen DPI.
* @method
* @static
* @returns {number} - The current screen DPI, so in pixels per inch.
*/
function getDpi () {
return document.getElementById('dpi-test').offsetHeight
}
这对我有用(但没有在手机上测试过):
然后我把.js: screenPPI = document.getElementById('ppitest').offsetWidth;
这让我得到了 96,这对应于我系统的 ppi。