Css样式表里面有cm,mm,in,pt,pc被称之为绝对单位,理论上绝对单位对任何设备上的渲染出的尺寸都是一致的,但实际上做不到这一点,偏差20-30%十分普遍,因为如今屏幕不只是局限于电脑屏幕,手机屏幕分辨率ppi越来越高,就连css委员会都已经在2011年放弃了绝对单位在不同的显示器上显示一致的要求。
而打印机上打印显示效果和原有的一致很容易做到,打印机多数是300dpi的精度,通过精度可以直接换算。
所以直接用css里面的单位尺寸无法在不同的设备上准确得到绝对尺寸。
那么既然通过打印精度dpi(Dots Per Inch,每英寸点数,是衡量打印机打印精度的主要参数之一)可以换算到实际尺寸,那么我们首先要获得每台设备的ppi(Pixels Per Inch也叫像素密度,所表示的是每英寸所拥有的像素数量)。
获取PPI:
function js_getDPI() {
var arrDPI = new Array;
if (window.screen.deviceXDPI) {
arrDPI[0] = window.screen.deviceXDPI;
arrDPI[1] = window.screen.deviceYDPI;
}
else {
var tmpNode = document.createElement("DIV");
tmpNode.style.cssText = "width:1in;height:1in;position:absolute;left:0px;top:0px;z-index:99;visibility:hidden";
document.body.appendChild(tmpNode);
arrDPI[0] = parseInt(tmpNode.offsetWidth);
arrDPI[1] = parseInt(tmpNode.offsetHeight);
tmpNode.parentNode.removeChild(tmpNode);
}
return arrDPI;
}
window.onload=function(){
alert("当前屏幕PPI "+js_getDPI());
}
拿到当前屏幕的ppi后,如果当前屏幕的ppi为400,那么当前屏幕每平方英寸有400个像素点的正方形,400是面积,那么该正方形单边像素是20px,1英寸等于2.54cm,我们需要一个10cm长的单位,需要显示多少像素,公式计算为20*10/2.54=79px
所以我们获得不同屏幕的ppi,可以计算不同屏幕10cm长度的像素点,进行动态显示像素点。