css常见单位
绝对单位
绝对单位常用于实物或打印中
相对单位
像素与分辨率
- 物理像素
显示器等硬件的真实像素,出厂前固定。设备分辨率一般指物理像素。 - 逻辑像素
开发者面向逻辑像素开发。操作系统将不同分辨率的设备统一抽象为1920x1080,此时1px相对于逻辑像素1920x1080。
例如2K、4K的显示器都将逻辑分辨率设置为1920x1080。但是4K显示画面更加细腻。因为1逻辑像素包含更多的物理像素。 - CSS像素
默认情况为逻辑像素。
DPR、PPI
DPR(device pixel ratio)设备像素比=物理像素/逻辑像素
PPI(pixels per in) 每英寸物理像素
视口
-
PC端:布局视口和视觉视口是同一个
-
移动端视口:
布局视口(layout viewport)
- PC端网页在移动端显示时,默认相对于布局视口。为了完整显示网页,会缩小网页。
- 布局视口默认宽度980px
视觉视口(visual viewport)
理想视口(ideal viewport)
- 当视觉视口 = 视觉视口时,称为理想视口
修改布局视口大小
<!--
width=device-width 设置布局视口宽度=设备宽度
-->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
移动端适配
100px在300px屏幕下占1/3,在400px屏幕下占1/4。若想在400px屏幕下相应的放大盒子,则不能使用绝对单位px,使用相对单位。
- 百分比布局
不同属性有不同的参照物,不好统一。 - rem
rem单位+动态html的font-size
lib-flexibl库
(function flexible (window, document) {
var docEl = document.documentElement
var dpr = window.devicePixelRatio || 1
// adjust body font size
function setBodyFontSize () {
if (document.body) {
document.body.style.fontSize = (12 * dpr) + 'px'
}
else {
document.addEventListener('DOMContentLoaded', setBodyFontSize)
}
}
setBodyFontSize();
// set 1rem = viewWidth / 10
function setRemUnit () {
var rem = docEl.clientWidth / 10
docEl.style.fontSize = rem + 'px'
}
setRemUnit()
// reset rem unit on page resize
window.addEventListener('resize', setRemUnit)
window.addEventListener('pageshow', function (e) {
if (e.persisted) {
setRemUnit()
}
})
// detect 0.5px supports
if (dpr >= 2) {
var fakeBody = document.createElement('body')
var testElement = document.createElement('div')
testElement.style.border = '.5px solid transparent'
fakeBody.appendChild(testElement)
docEl.appendChild(fakeBody)
if (testElement.offsetHeight === 1) {
docEl.classList.add('hairlines')
}
docEl.removeChild(fakeBody)
}
}(window, document))
设计稿测量的px转换为rem
方式1:手动计算
在375px的设计稿上测量100px的盒子,计算出100px对应的rem
根据lib-flexibl库,1rem = 1/10视口宽度,即在375px设计稿中,1rem = 37.5px
故100px = 100/37.5 = 2.6667rem
方式2:less/scss
方式3:postcss-pxtorem插件
开发时使用px单位。通过webpack的插件自动完成转换
方式4:vscode插件 px to rem
- vw/vh单位
vw相对于视口宽度的1%
vh相对于视口高度的1%
设计稿测量的px转换为vw
方式1:手动计算
在375px的设计稿上测量100px的盒子,计算出100px对应的vw
因为,1vw = 3.75px
故100px = 100/3.75 = 26.667rem
方式2:less/scss
方式3:postcss-px-to-viewport-8-plugin插件
通过webpack的插件自动完成转换
方式4:vscode插件