一些概念
- 屏幕尺寸:用对角来计算。1英寸=2.54厘米
- 像素:硬件和软件所能控制的最小单位。
- 屏幕分辨率:一个屏幕具体由多少个像素点组成
- 物理像素:设备的像素点个数
- 逻辑像素:让n个像素当一个像素使用
- 视觉视口
- 理想视口:所谓理想视口,即页面绘制区域可以完美适配设备宽度的视口大小,不需要出现滚动条即可正常查看网站的所有内容,且文字图片清晰,如所有iphone的理想视口宽度都为320px,安卓设备的理想视口有320px、360px等等。 width=device-width 宽度等于屏幕宽度 initial-scale=1缩放等于1 maximum-scale=2最大缩放等于2 minimum-scale=0.5最小缩放等于0.5 user-scalable=no不允许缩放
<meta name="viewport" content="width=device-width,initial-scale=1" />
移动端适配方案
rem
<head>
<meta name="viewport" content="width=device-width,initial-scale=1.0" user-scalable="no"/>
<style>
.box{
width:10rem;
}
</style>
<script>
function setRootRem(){
const root = document.documentElement;
const scale = root.clientWidth / 10;
root.style.fontSize = scale + 'px'
}
setRootRem()
window.addEventListener('resize', setRootRem)
</script>
</head>
但这样我们会发现在写布局的时候会非常复杂,也就是你需要自己手动去计算一下对应的rem值,比如上面的font-size设计稿上是20px,那我们就要计算一下20px对应的rem是多少,按我们上面的规则,1px = 1/37.5rem,所以20px应该对应20/37.5 = 0.53rem。所以这种方案我们通常搭配着CSS预处理器使用。 rem.less
@device-width:375;
@rem:(@device-width/10rem)
然后将@rem配置成less全局变量
font-size:(24/@rem)
特点
- 适配原理稍复杂
- 需要使用JS
- 设计稿标注的px换算到rem
- 方案灵活,既能实现整体缩放,又能实现局部不缩放
vw、vh适配
rem.less
@device-width:375;
@vw:(100vm/@device-width)
font-size: 16*@vw
特点
- 适配原理简单
- 不需要JS即可适配
- 设计稿标注的px换算到vw
- 方案灵活,既然实现整体缩放,又能实现局部不缩放
px
export function initViewport() {
const width = 375; // 设计稿宽度
const scale = window.innerWidth / width
// console.log('scale', scale)
let meta = document.querySelector('meta[name=viewport]')
let content = `width=${width}, init-scale=${scale}, user-scalable=no`
if(!meta) {
meta = document.createElement('meta')
meta.setAttribute('name', 'viewport')
document.head.appendChild(meta)
}
meta.setAttribute('content', content)
}
- 适配原理简单
- 需要JS
- 无需转换
- 方案死板,只能实现页面级别肢体缩放