Window: devicePixelRatio 属性
devicePixelRatio
of Window
interface 返回当前显示设备上物理像素分辨率与CSS 像素分辨率的比率。
此值也可以解释为像素大小的比率:一个CSS 像素的大小与一个物理像素的大小之比。简单来说,它告诉浏览器应该使用多少个屏幕的实际像素来绘制一个 CSS 像素。
这在处理标准显示器和 HiDPI 或视网膜显示器之间的渲染差异时很有用,后者使用更多屏幕像素来绘制相同的对象,从而获得更清晰的图像。
可以使用 window.matchMedia()
检查 devicePixelRatio
的值是否发生变化(例如,如果用户将窗口拖动到具有不同像素密度的显示器上)。请参阅 下面的示例。
值
一个双精度浮点值,指示显示器物理像素分辨率与 CSS 像素分辨率的比率。值为 1 表示经典的 96 DPI 显示器,而值为 2 表示 HiDPI/视网膜显示器。
在分辨率异常低的显示器情况下或更常见的情况下,当屏幕的像素密度超过 96 DPI 标准分辨率的两倍时,可能会返回其他值。现代移动设备屏幕(在较小的物理尺寸上提供高显示分辨率)通常会产生大于 2 的 devicePixelRatio
值。
示例
在 <canvas>
中校正分辨率
在视网膜屏幕上,<canvas>
可能会显得过于模糊。使用 window.devicePixelRatio
来确定应该添加多少额外的像素密度,以获得更清晰的图像。
HTML
<canvas id="canvas"></canvas>
JavaScript
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
// Set display size (css pixels).
const size = 200;
canvas.style.width = `${size}px`;
canvas.style.height = `${size}px`;
// Set actual size in memory (scaled to account for extra pixel density).
const scale = window.devicePixelRatio; // Change to 1 on retina screens to see blurry canvas.
canvas.width = Math.floor(size * scale);
canvas.height = Math.floor(size * scale);
// Normalize coordinate system to use CSS pixels.
ctx.scale(scale, scale);
ctx.fillStyle = "#bada55";
ctx.fillRect(10, 10, 300, 300);
ctx.fillStyle = "#ffffff";
ctx.font = "18px Arial";
ctx.textAlign = "center";
ctx.textBaseline = "middle";
const x = size / 2;
const y = size / 2;
const textString = "I love MDN";
ctx.fillText(textString, x, y);
监控屏幕分辨率或缩放级别变化
在此示例中,我们将设置一个媒体查询并观察它,以查看设备分辨率何时发生变化,并记录新的分辨率。
HTML
<div id="container">
<p>
This example demonstrates the effect of zooming the page in and out
(or moving it to a screen with a different scaling factor) on the
value of the <code>devicePixelRatio</code> property.</p>
<p>Try it and watch what happens!</p>
</p>
</div>
<div id="output"></div>
CSS
body {
font:
22px arial,
sans-serif;
}
#container {
border: 2px solid #22d;
margin: 1rem auto;
padding: 1rem;
background-color: #a9f;
}
JavaScript
字符串 mqString
设置为一个媒体查询,该查询检查当前显示分辨率是否与特定数量的设备点/px
匹配。
media
变量是一个 MediaQueryList
对象,它使用媒体查询字符串初始化。当在文档上运行 mqString
的结果发生变化时,media
对象的 change
事件将被触发,并且代码将记录新的分辨率。
请注意,每次分辨率发生变化时,示例都必须根据新的分辨率创建一个新的媒体查询和一个新的 MediaQueryList
实例。
let remove = null;
const output = document.querySelector("#output");
const updatePixelRatio = () => {
if (remove != null) {
remove();
}
const mqString = `(resolution: ${window.devicePixelRatio}dppx)`;
const media = matchMedia(mqString);
media.addEventListener("change", updatePixelRatio);
remove = () => {
media.removeEventListener("change", updatePixelRatio);
};
output.textContent = `devicePixelRatio: ${window.devicePixelRatio}`;
};
updatePixelRatio();
结果
要测试此示例,请尝试放大和缩小页面,并注意 devicePixelRatio
记录值的变化。
规范
规范 |
---|
CSSOM 视图模块 # dom-window-devicepixelratio |
浏览器兼容性
BCD 表格仅在浏览器中加载