问题:
开发移动端时,通常要适配不同的屏幕,由于每个手机的屏幕大小和ppi不一样。会导致显示不一致的问题。
如何做到按一份设计稿,自动适配其他手机屏最佳方案:
解决办法:
根据devicePixelRatio 动态计算viewport。保证永远都是与设计稿1:1的比例,而且可以很好的解决1像素问题
font-size,并且采用统一使用rem单位来布局,就可以解决了。1
2
3var pixelRatio = 1 / window.devicePixelRatio;
//通过js动态设置视口(viewport)
document.write('<meta name="viewport" content="width=device-width,initial-scale='+pixelRatio+',minimum-scale='+pixelRatio+',maximum-scale='+pixelRatio+'" />');设置html的font-size,然后使用rem单位
1
2
3
4
5
6
7var innerWidth = document.documentElement.getBoundingClientRect().width || window.innerWidth;
//这里的20也就是默认的html字体大小(这个20只是一个参考值),如果你的设计稿是640,那么字体大小就会是40px
document.documentElement.style.fontSize = 20 * ( innerWidth/320 ) + 'px'
//原理:
比如一个div的宽度在640的屏幕上是75px,然后移到`720(window.innerWidth)`的屏幕上是多少呢?
640 / 75px = 720 / ?
因为我们设置了viewport永远都是1:1所以,网页会放大或缩小,那么我们动态调节html的
使用现有的库,适应更多情况:
继续优化(使用 webpack 和 px2rem-loader):
在写css代码时,使用px2rem方法
在写css代码时,可以省略调用hotcss中的px2rem方法,直接使用px单位,然后让 px2rem-loader 去帮你转换
将hotcss加入webpack
在github中找到hotcss.js,放入项目中1
entry: ['./app/js/hotcss.js','./app/js/main.js'],
配置loader1
2
3
4css: 'vue-style-loader!css-loader!px2rem-loader?remUnit=40&remPrecision=8',
remUnit就是上面html的font-size:40px
// 150px / remUnit:75px = 2rem;
具体webpack配置:
1 | const path = require('path'); |