第一种就是用了好久淘宝团队开发的flexible.js,css
原理经过识别网页宽度,在html上加dpr及字号(源码所设置值/10),在移动端设置rem进行自适应。html
如设置最大宽度640(设计稿),在网页宽度为640时,flexible.js将html字号设置为64px,即1rem=64px,页面缩小,1rem所等于的像素即缩小。(这是dpr=1时,当dpr=2时,网页被缩小二倍,html字号*2,1rem=64*2px,可是所展现的内容不变)
dpr=2时,1设备独立像素长宽各占2物理像素。可是字体需单独进行适配,缘由是flexiblejs 的团队以为从体验上来说,字号不该该由于屏幕大小而变化,并且大多数字体文件都带一些点阵(16或24px),都是偶数,一样不但愿字体出现单数尺寸,因此要用px进行适配。vue
写法以下
.class{
font-size:30px;
}
[data-dpr="2"] .class{
font-size: 60px;
}
[data-dpr="3"] .class{
font-size: 90px;
}
(图片也要切三份呦)vue-router
还有一串js可能你们也见过,原理同上,可是没有考虑字体,都是用rem进行适配,挺简单的就不解释了,代码以下。vue-cli
1 (function (doc, win) { 2 var docEl = doc.documentElement, 3 resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', 4 recalc = function () { 5 var clientWidth = docEl.clientWidth; 6 if (!clientWidth) return; 7 if(clientWidth<=720){ 8 docEl.style.fontSize = 100 * (clientWidth /720) + 'px'; 9 }else{ 10 docEl.style.fontSize = 100+'px' 11 } 12 }; 13 14 if (!doc.addEventListener) return; 15 win.addEventListener(resizeEvt, recalc, false); 16 doc.addEventListener('DOMContentLoaded', recalc, false); 17 })(document, window);
直接放到网页里就ok。npm
第三种也是大漠前辈总结的vw适配,其实rem适配初衷也是为了使用vw,如今flexiblejs是时候退役了,下面开始(vue框架写的,别的自行解决啦)json
1首先vue-cli构建项目框架
2安装PostCSS插件svg
npm i postcss-aspect-ratio-mini postcss-px-to-viewport postcss-write-svg postcss-cssnext postcss-viewport-units cssnano --S
安装成功的话,package.json会看到新安装的信息post
"dependencies": {
"cssnano": "^3.10.0",
"postcss-aspect-ratio-mini": "0.0.2",
"postcss-cssnext": "^3.1.0",
"postcss-px-to-viewport": "0.0.3",
"postcss-viewport-units": "^0.1.3",
"postcss-write-svg": "^3.0.1",
"vue": "^2.5.2",
"vue-router": "^3.0.1"
},
而后配置.postcssrc.js,一般vue-cli构建的就在根目录下。
module.exports = { "plugins": { "postcss-import": {}, "postcss-url": {}, "postcss-aspect-ratio-mini": {}, "postcss-write-svg": { utf8: false }, "postcss-cssnext": {}, "postcss-px-to-viewport": { viewportWidth: 750, // (Number) The width of the viewport. viewportHeight: 1334, // (Number) The height of the viewport. unitPrecision: 3, // (Number) The decimal numbers to allow the REM units to grow to. viewportUnit: 'vw', // (String) Expected units. selectorBlackList: ['.ignore', '.hairlines'], // (Array) The selectors to ignore and leave as px. minPixelValue: 1, // (Number) Set the minimum pixel value to replace. mediaQuery: false // (Boolean) Allow px to be converted in media queries. }, "postcss-viewport-units":{}, "cssnano": { preset: "advanced", autoprefixer: false, "postcss-zindex": false } } }
目前出视觉设计稿,咱们都是使用750px
宽度的,那么100vw = 750px
,即1vw = 7.5px
。那么咱们能够根据设计图上的px
值直接转换成对应的vw
值。在实际撸码过程,不须要进行任何的计算,直接在代码中写px
,好比:
.carimg{ width:370px; height: 280px; }
编译出的css
.carimg, .carimgdiv { width: 49.333vw; height: 37.333vw; content: "viewport-units-buggyfill; width: 49.333vw; height: 37.333vw"; }
大概就是这么多,想详细了解vw适配的话请去下边的连接
https://www.w3cplus.com/mobile/vw-layout-in-vue.html