一、物理分辨率、逻辑分辨率
- 物理分辨率(标准分辨率):显示屏最高可显示的像素点数矩阵(像素行点数乘以列点数),不能调节
- 逻辑分辨率:软件支持的重新分布像素点数矩阵,在一定范围内可调节,但不会超过物理分辨率
二、DP——物理像素、设备像素
Device Pixel。物理分辨率中的像素点即为设备像素,单位为pt(磅),为绝对长度单位。
- 1 pt = 1/72 inch = 1/72 英寸
- 1 英寸 = 2.54 厘米
三、DIP——逻辑像素、设备独立像素
- Device Independent Pixel。CSS像素是Web逻辑像素的一种,单位为px,为相对长度单位。
- iOS和Android平台都定义了各自的逻辑像素单位。iOS的尺寸单位为pt,Android的尺寸单位为dp
四、DPR——设备像素比
- Device Pixel Ratio= 同一方向上的 物理像素 / CSS像素 (缩放比initial-scale为1时)。通常为 PPI/160 整数倍
window.devicePixelRatio
可以直接获取dpr- 高清屏:dpr>1。dpr越大,1 CSS像素表示的物理像素点越多,显示越精细越清晰,故称之为高清
- Android屏幕设备像素比分类:
- hdpi [1.5倍]
- xhdpi [2倍]
- xxhdpi [3倍]
- xxxhdpi [4倍]
- 缩放:缩放比不再为1时,变化的都是CSS像素
- 缩小之后一个设备像素可重叠几个CSS像素
- 放大之后一个CSS像素与多个设备像素重叠
五、PPI/DPI——像素密度
- PPI:Pixels Per Inch。每英寸能容纳多少颗物理像素点,用于描述屏幕的像素密度。屏幕普遍采用RGB色域(红、绿、蓝三个子像素构成)。
- DPI:Dots Per Inch。每英寸能容纳多少墨点,早期用于描述打印机的性能。印刷业普遍使用CMYK色域(青、品红、黄和黑),通常屏幕上的设计DPI设成72,印刷品设计DPI设成300,就能保证屏幕上显示的尺寸和打印尺寸相同。现在也可同PPI一样用法
六、rpx——响应式px,750宽基准
- 微信小程序设计 rpx 解决不同宽度手机宽度变形问题,rpx 是相对于基准宽度的单位,可根据屏幕宽度自适应
uni-app
规定屏幕基准宽度 750rpx。开发者可以通过设计稿基准宽度计算页面元素 rpx 值,设计稿 1px 与框架样式 1rpx 转换公式如下:设计稿 1px / 设计稿基准宽度 = 框架样式 1rpx / 750rpx
七、设计像素
🧐——iPhone 6 Plus 的实际物理像素点个数是1080 1920,逻辑像素是 414 736,但为什么截屏图片宽高是1242 * 2208,window.devicePixelRatio 值也为3呢?
😇:iPhone 6 Plus系统定义的屏幕像素就是1242 2208,系统会自动把这些像素点塞进1080 1920个实际像素点来渲染,对于前端来说,1242 * 2208称为6 Plus的“设计像素”可直接视为6 Plus的“物理像素”
七、1px 边框问题
🧐——画个1px的边框,但屏幕显示为一条宽度为2—3个物理像素的线,怎么显示为1个物理像素?
😇:利用CSS3的transform: scale(0.5);
、transform:scale(0.33);
- 使用CSS的
-webkit-min-device-pixel-ratio
媒体查询可以针对不同的DPR做出处理 ```css //scss mixin定义 $border-poses: top, right, bottom, left; $border-color: #eee; @mixin border-1px($color: $border-color, $poses: $border-poses) { position: relative; &::after {
} }content: '';
display: block;
position: absolute;
width: 100%;
@each $pos in $poses {
border-#{$pos}: 1px solid $color;
#{$pos}: 0;
}
@if $poses == 'top' or $poses == 'bottom' {
left: 0;
right: 0;
transform: scaleY(0.5);
}
@if $poses == 'left' or $poses == 'right' {
top: 0;
bottom: 0;
transform: scaleX(0.5);
}
.need-1px-border { @include border-1px(red, bottom); }
```html
<div class="need-1px-border">需要1px边框线的元素, 红色, 在下方</div>
- 设置
<meta name="viewport" content="width=device-width, initial-scale=0.5">
中的 initial-scale
九、viewport
- layout viewport:浏览器默认的
viewport
,通过document.documentElement.clientWidth
来获取 - visual viewport :浏览器可视区域的大小
viewport
,通过window.innerWidth
来获取 - ideal viewport,移动设备的理想
viewport
。 防止缩小放大网页:
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" />
Vue项目适配vw
npm i cssnano cssnano-preset-advanced postcss-aspect-ratio-mini postcss-preset-env postcss-px-to-viewport postcss-write-svg --S
module.exports = { "plugins": { "postcss-aspect-ratio-mini": {}, "postcss-write-svg": { //移动端1px解决方案 utf8: false }, "postcss-preset-env": {}, "postcss-px-to-viewport": { viewportWidth: 750, // 视窗的宽度,对应的是我们设计稿的宽度,一般是750 viewportHeight: 1334, //视窗的高度,根据750设备的宽度来指定,一般指定1334,也可以不配置 unitPrecision: 3, // 指定`px`转换为视窗单位值的小数位数(很多时候无法整除) viewportUnit: 'vw', // 指定需要转换成的视窗单位,建议使用vw selectorBlackList: ['.ignore'], // 指定不转换为视窗单位的类,可以自定义,可以无限添加,建议定义一至两个通用的类名 minPixelValue: 2, // 小于或等于`2px`不转换为视窗单位,你也可以设置为你想要的值 mediaQuery: false // 允许在媒体查询中转换`px` }, "cssnano": { preset: "advanced", autoprefixer: false, "postcss-zindex": false } } }
十、参考资料
- Using the viewport meta tag to control layout on mobile browsers