2013-05-05 42 views

Trả lời

7
window.devicePixelRatio = window.devicePixelRatio || 
Math.round(window.screen.availWidth/document.documentElement.clientWidth) 

Got nó từ http://blogs.windows.com/windows_phone/b/wpdev/archive/2012/11/08/internet-explorer-10-brings-html5-to-windows-phone-8-in-a-big-way.aspx

+1

Dự phòng đó có vẻ ** không chính xác ** vì 'availWith' và' clientWidth' đều nằm trong [dips] (http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html) và bởi vì 'clientWidth' là một giá trị động. Đơn vị CSS cho 'devicePixelRatio' là [dppx] (http://www.w3.org/TR/css3-values/#dppx). – ryanve

+3

'devicePixelRatio' có thể là một giá trị phân số, vì vậy' Math.round' không đúng chỗ, nhưng bất cứ điều gì. Chỉ cần không sử dụng dự phòng nếu bạn không chắc chắn cửa sổ được tối đa hóa (có nghĩa là trên tất cả các máy tính để bàn). Hơn nữa, 'document.documentElement.clientWidth' không bao gồm chiều rộng thanh cuộn trên các trình duyệt máy tính để bàn. – MaxArt

+0

@MaxArt, chỉ cần chỉnh sửa câu trả lời của tôi nếu bạn chắc chắn. – user960567

17

Đối với một fallback IE, cả hai máy tính để bàn và điện thoại di động, sử dụng:

window.devicePixelRatio = window.devicePixelRatio || 
          window.screen.deviceXDPI/window.screen.logicalXDPI; 
+2

Đây phải là câu trả lời đúng .. đó là điểm trên. – tremor

+1

đây là tài liệu tham khảo chính thức: https://msdn.microsoft.com/en-us/library/dn255104(v=vs.85).aspx – user3526

3

tôi thấy rằng trên Nokia Lumia 1230 tài sản window.devicePixelRatio trả 1 thậm chí nếu giá trị rõ ràng là không chính xác. Thử nghiệm cho window.screen.deviceXDPI/window.screen.logicalXDPI trả về 1.52083333. Vì vậy, bằng cách sử dụng window.devicePixelRatio đầu tiên không phải là một ý tưởng tốt.

tôi xin đề nghị như sau:

function getDevicePixelRatio(){ 
    var pixelRatio = 1; // just for safety 
    if('deviceXDPI' in screen){ // IE mobile or IE 
     pixelRatio = screen.deviceXDPI/screen.logicalXDPI; 
    } else if (window.hasOwnProperty('devicePixelRatio')){ // other devices 
     pixelRatio = window.devicePixelRatio; 
    } 
    return pixelRatio ; 
} 

Đối với một số lý do, bằng cách sử dụng cách tốt nhất để kiểm tra sự hiện diện của deviceXDPI trong đối tượng màn hình:

if(screen.hasOwnProperty('deviceXDPI')) {// IE mobile or IE 

không làm việc về vấn đề này điện thoại.

2

Thực ra, không có câu trả lời nào trước đây là chính xác. Tất cả các bài kiểm tra dưới đây được thực hiện trên Lumia 520 điện thoại có một màn hình LCD 480 * 800:

WP8/IE Mobile 10:

  • window.devicePixelRatio = không xác định
  • window.inner/outerWidth/Chiều cao = 320 * 485
  • màn hình. [avail] Width/Height = 330 * 549
  • document.body.clientWidth/Chiều cao = 320 * 486
  • screen.device/logicalXDPI = 140/96 = 1,45833 ..

Dự kiến ​​devicePixelRatio là 480/320 = 1,5 có thể được tính bằng cách:

Math.round(screen.availWidth * screen.deviceXDPI/screen.logicalXDPI/4) * 4/document.body.clientWidth 

(Các làm tròn là cần thiết để có được một kích thước màn hình LCD có hiệu lực)

WP8.1/IE Điện thoại di động 11:

  • window.devicePixelRatio = 1,42177 ...
  • window.outerWidth/Chiều cao = 338 * 512
  • window.innerWidth/Chiều cao = 320 * 485
  • màn hình. [Avail] Width/Height = 338 * 563
  • document.body.clientWidth/Chiều cao = 320 * 486
  • screen.device/logicalXDPI = 136/96 = 1.4166 ..

Thiết bị dự kiếnPixelRatio là (một lần nữa) 480/320 = 1.5 có thể được tính bằng cách:

Math.round(screen.availWidth * window.devicePixelRatio/4) * 4/document.body.clientWidth 

Vì vậy, ngay cả khi window.devicePixelRatio được hiển thị sẽ cung cấp cho bạn tỷ lệ giữa kích thước màn hình DOM và kích thước màn hình LCD, tuy nhiên, kích thước màn hình DOM là lớn hơn so với khung nhìn có sẵn kích thước. Nếu bạn muốn biết tỷ lệ chính xác giữa pixel CSS và pixel của thiết bị thì bạn phải thực hiện các phép tính ở trên. Ngoài ra, các tính toán này là hợp lệ trong chế độ dọc. Ở chế độ ngang, hãy sử dụng screen.availHeight thay vào đó (kích thước màn hình DOM không thay đổi về thay đổi hướng trên IE Mobile).

Các vấn đề liên quan