Javascript 如何获得 CSS 像素/设备像素比?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5063489/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can you get the CSS pixel / device pixel ratio?
提问by yonran
I want to find the ratio between CSS pixels and device pixels.
我想找到 CSS 像素和设备像素之间的比率。
Edit: I should have realized that this is just zoom level. I've added an answerto the canonical reference on zoom levels.
编辑:我应该意识到这只是缩放级别。我在缩放级别的规范参考中添加了一个答案。
CSS pixels are the unit we use for almost everything--it's what element.style.width, element.clientWidth, element.offsetWidth etc. mean. Device pixels are the pixels that the browser actually paints to. A few properties are measured in device pixels, e.g. window.screen.width, which is the screen size (e.g. 1024) that doesn't change when the user zooms in.
CSS 像素是我们用于几乎所有事物的单位——这就是 element.style.width、element.clientWidth、element.offsetWidth 等的意思。设备像素是浏览器实际绘制的像素。一些属性以设备像素为单位,例如 window.screen.width,这是用户放大时不会改变的屏幕尺寸(例如 1024)。
Motivation: when the user zooms in, I want to increase a canvas's width and height (while keeping style.width and style.height the same CSS pixel value), scale() the context, and redraw on a crisper upscaled canvas.
动机:当用户放大时,我想增加画布的宽度和高度(同时保持 style.width 和 style.height 相同的 CSS 像素值), scale() 上下文,并在更清晰的放大画布上重绘。
I've read Quirksmode's A Tale of Two Viewportsand High DPI on Surfin' Safari, but neither of them say how to get the ratio. The only ideas I have so far are to collect mousemoves and measure change in event.clientX divided by change in event.screenX, or to programatically create media queries using moz--min-device-pixel-ratio
, use getComputedStyle()
to test whether the rule matched, and narrow it down with a binary search. I hope there's a easier/more reliable way.
我读过Quirksmode 的Surfin' Safari 上的两个视口和高 DPI 的故事,但他们都没有说如何获得比例。到目前为止,我唯一的想法是收集 mousemoves 并测量 event.clientX 中的变化除以 event.screenX 中的变化,或者使用编程方式创建媒体查询moz--min-device-pixel-ratio
,用于getComputedStyle()
测试规则是否匹配,并通过二分搜索缩小范围. 我希望有一种更简单/更可靠的方法。
Edit: I've tried using the @media (-webkit-min-device-pixel-ratio:1)
queries with Chrome, Safari, and Firefox 4, and apparently Webkit treats the property as a constant device pixel to screen pixelratio (which doesn't change with zoom), whereas Firefox 4 treats it as device pixel to CSS pixelratio (which increases when you zoom in). So in Firefox 4, I can discover the CSS pixel / device pixel ratio using a binary search, but not with Webkit.
编辑:我尝试在@media (-webkit-min-device-pixel-ratio:1)
Chrome、Safari 和 Firefox 4 中使用查询,显然 Webkit 将该属性视为恒定的设备像素与屏幕像素比(不会随缩放而改变),而 Firefox 4 将其视为设备像素与CSS 像素的比率(放大时会增加)。所以在 Firefox 4 中,我可以使用二进制搜索来发现 CSS 像素/设备像素比,但不能使用 Webkit。
回答by Tanzeel Kazi
You can use window.devicePixelRatio
in Webkit based browsers to get the device pixel ratio directly in JavaScript. I have used this on Google Chrome, Android browsers (2.2+) and Mobile Safari. I have no idea about other browsers though.
您可以window.devicePixelRatio
在基于 Webkit 的浏览器中使用,直接在 JavaScript 中获取设备像素比。我在 Google Chrome、Android 浏览器 (2.2+) 和 Mobile Safari 上使用过它。我不知道其他浏览器虽然。
回答by abhinav sharma
You can always use the following method and it would work in all the browsers
您始终可以使用以下方法,它适用于所有浏览器
window.getDevicePixelRatio = function () {
var ratio = 1;
// To account for zoom, change to use deviceXDPI instead of systemXDPI
if (window.screen.systemXDPI !== undefined && window.screen.logicalXDPI !== undefined && window.screen.systemXDPI > window.screen.logicalXDPI) {
// Only allow for values > 1
ratio = window.screen.systemXDPI / window.screen.logicalXDPI;
}
else if (window.devicePixelRatio !== undefined) {
ratio = window.devicePixelRatio;
}
return ratio;
};
回答by androidavid
There is a much better CSS/JS solution:
有一个更好的 CSS/JS 解决方案:
/** sample media query for pixel-ratio=2" **/
@media
(-webkit-min-device-pixel-ratio: 2),
(min-resolution: 192dpi) {
.pixel-ratio-holder:before {
content: "2";
}
}
function jsPixelRatio(){
return window.getComputedStyle(document.querySelector('.pixel-ratio-holder'), 'before').getPropertyValue('content').replace(/[^a-z]/g,'') * 1;
}
回答by Andrii Verbytskyi
How to get device Pixel Ratio
如何获取设备像素比
This example uses window.devicePixelRatio
as a starting point ANDalso window.matchMedia()
Web API as a fallback calculation.
此示例window.devicePixelRatio
用作起点,也window.matchMedia()
用作 Web API 作为后备计算。
The browser support for both those features is pretty good, so this should work great for most of use cases.
浏览器对这两个功能的支持都非常好,因此这对于大多数用例来说应该很好用。
Here is a function that retrieves this information, originally written by PatrickJS and published as a GitHub Gist:
这是一个检索此信息的函数,最初由 PatrickJS 编写并作为 GitHub Gist 发布:
function getDevicePixelRatio() {
var mediaQuery;
var is_firefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
if (window.devicePixelRatio !== undefined && !is_firefox) {
return window.devicePixelRatio;
} else if (window.matchMedia) {
mediaQuery = "(-webkit-min-device-pixel-ratio: 1.5),\
(min--moz-device-pixel-ratio: 1.5),\
(-o-min-device-pixel-ratio: 3/2),\
(min-resolution: 1.5dppx)";
if (window.matchMedia(mediaQuery).matches) {
return 1.5;
}
mediaQuery = "(-webkit-min-device-pixel-ratio: 2),\
(min--moz-device-pixel-ratio: 2),\
(-o-min-device-pixel-ratio: 2/1),\
(min-resolution: 2dppx)";
if (window.matchMedia(mediaQuery).matches) {
return 2;
}
mediaQuery = "(-webkit-min-device-pixel-ratio: 0.75),\
(min--moz-device-pixel-ratio: 0.75),\
(-o-min-device-pixel-ratio: 3/4),\
(min-resolution: 0.75dppx)";
if (window.matchMedia(mediaQuery).matches) {
return 0.7;
}
} else {
return 1;
}
}
CanIUse: window.devicePixelRatio
, Window.matchMedia()
可以使用: window.devicePixelRatio
,Window.matchMedia()
Useful links: MDN - window.devicePixelRatio
, MDN - Window.matchMedia()
有用的链接:MDN -window.devicePixelRatio
, MDN -Window.matchMedia()