移动端适配方案
适配前的问题
- 每个设备的物理像素大小都是固定的,根据设备分辨率而定
- 分辨率越来越大(物理像素越小),难道我们的图片显示就越来越小嘛?
引出逻辑分辨率,设备像素比(dpr)
- 1px边框问题?不同浏览器不同
transform: scale(0.5) 方案
/* 2倍屏 */
@media only screen and (-webkit-min-device-pixel-ratio: 2.0) {
.border-bottom::after {
-webkit-transform: scaleY(0.5);
transform: scaleY(0.5);
}
}
/* 3倍屏 */
@media only screen and (-webkit-min-device-pixel-ratio: 3.0) {
.border-bottom::after {
-webkit-transform: scaleY(0.33);
transform: scaleY(0.33);
}
}
适配
- 移动端Web页面,即常说的H5页面、手机页面、webview页面
- 在不同尺寸的手机设备上,页面“相对性的达到合理的展示(自适应)”或者“保持统一效果的等比缩放
viewport(scale = 1/dpr)
rem
flex
vm/vh
viewport
配置视口, 简单的一个meta标签即可!
<meta name="viewport" content="width=device-width; initial-scale=1; maximum-scale=1; minimum-scale=1; user-scalable=no;">
想要视觉效果好,视口宽度必定无限接近于理想视口。
上述的meta设置,就是我们的理想设置,他规定了我们的视口宽度为屏幕宽度,初始缩放比例为1,就是初始时候我们的视觉视口就是理想视口!
解决适配方法
1.rem适配
rem是CSS3新增的一个相对单位
//假设我给根元素的大小设置为14px
html{
font-size:14px
}
//那么我底下的p标签如果想要也是14像素
p{
font-size:1rem
}
//如此即可
rem 是相对于html节点的font-size来做计算的。所以在页面初始话的时候给根元素设置一个font-size,接下来的元素就根据rem来布局,这样就可以保证在页面大小变化时,布局可以自适应
这是一个过渡方案,本质上,用户使用更大的屏幕,是想看到更多的内容,而不是更大的字。
2.vm,vh布局
vh、vw方案即将视觉视口宽度 window.innerWidth和视觉视口高度 window.innerHeight 等分为 100 份。
转换px不免有误差,工程化的今天,webpack解析css 的时候用postcss-loader 有个postcss-px-to-viewport能自动实现px到vw的转化
{
loader: 'postcss-loader',
options: {
plugins: ()=>[
require('autoprefixer')({
browsers: ['last 5 versions']
}),
require('postcss-px-to-viewport')({
viewportWidth: 375, //视口宽度(数字)
viewportHeight: 1334, //视口高度(数字)
unitPrecision: 3, //设置的保留小数位数(数字)
viewportUnit: 'vw', //设置要转换的单位(字符串)
selectorBlackList: ['.ignore', '.hairlines'], //不需要进行转换的类名(数组)
minPixelValue: 1, //设置要替换的最小像素值(数字)
mediaQuery: false //允许在媒体查询中转换px(true/false)
})
]
}
3、px为主,vx和vxxx(vw/vh/vmax/vmin)为辅,搭配一些flex(推荐)
推荐使用此种方案,是由于我们要去考虑用户的需求,用户之所以去买大屏手机,不是为了看到更大的字,而是为了看到更多的内容,这样直接使用px是最明智的方案
移动端适配流程
在head 设置width=device-width的viewport
在css中使用px
在适当的场景使用flex布局,或者配合vw进行自适应
在跨设备类型的时候(pc <-> 手机 <-> 平板)使用媒体查询
在跨设备类型如果交互差异太大的情况,考虑分开项目开发