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

html
<canvas id="canvas"></canvas>

JavaScript

js
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);

Side-by-side comparison of the effect of different devicePixelRatio values on an image shown in a retina display.

监控屏幕分辨率或缩放级别变化

在此示例中,我们将设置一个媒体查询并观察它,以查看设备分辨率何时发生变化,并记录新的分辨率。

HTML

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

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 实例。

js
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 表格仅在浏览器中加载

另请参阅