Vue +lib-flexible實現大小屏幕,超大屏幕的適配展示。lib-flexible是淘寶項目組開發的插件,屬於開源項目,可以在各種項目(vue,react)中引入並使用,利於其將px轉成rem的單位轉換形式使開發者不用在根據因為分辨率不同書寫更多的適配代碼。
實現步驟:
1、安裝lib-flexible
npm install lib-flexible --save-dev
2、 在main.js中引入lib-flexible
3、安裝 px2rem-loader
npm install px2rem-loader --save-dev
4、配置px2rem-loader
如果使用的是vue2.x的版本,則需要找到build/utils.js文件,找到exports.cssLoaders,修改為
exports.cssLoaders = function(options) { options = options || {} var cssLoader = { loader: 'css-loader', options: { minimize: process.env.NODE_ENV === 'production', sourceMap: options.sourceMap } } // 新增px2remLoader和postcssLoader定義 var px2remLoader = { loader: 'px2rem-loader', options: { remUnit: 192, remPrecision: 8 //1rem=多少像素 這里的設計稿是1920px。 } } var postcssLoader = { loader: 'postcss-loader', options: { sourceMap: options.sourceMap } } function generateLoaders(loader, loaderOptions) { // var loaders = [cssLoader] //注釋或刪除此行變更成下面的方式 var loaders = options.usePostCSS ? [cssLoader,postcssLoader, px2remLoader] : [cssLoader,px2remLoader] if(loader) { loaders.push({ loader: loader + '-loader', options: Object.assign({}, loaderOptions, { sourceMap: options.sourceMap }) }) } if(options.extract) { return ExtractTextPlugin.extract({ use: loaders, fallback: 'vue-style-loader' }) } else { return ['vue-style-loader'].concat(loaders) } } return { css: generateLoaders(), postcss: generateLoaders(), less: generateLoaders('less'), sass: generateLoaders('sass', { indentedSyntax: true }), scss: generateLoaders('sass'), stylus: generateLoaders('stylus'), styl: generateLoaders('stylus') } }
如果使用的是vue3.x的版本,則需要新建文件vue.config.js,並在此文件配置以下代碼
module.exports = { css: { loaderOptions: { css: {}, postcss: { plugins: [ require('postcss-px2rem')({ // 以設計稿1920為例, 1920 / 10 = 192 remUnit: 192 }), ] } } }, };
當然,除了上面的配置外,在插件源碼中refreshRem方法提到當寬度大於540這個特定值時就不再有對應的適配,這里為了使其適配超大屏幕,可以將其刪除或注釋。
打開./node_modules/lib-flexible/flexible.js,找到如下片段源碼:
function refreshRem(){ var width = docEl.getBoundingClientRect().width; //if (width / dpr > 540) { // width = 540 * dpr; //} var rem = width / 10; docEl.style.fontSize = rem + 'px'; flexible.rem = win.rem = rem; }
不過一般是不建議直接更改node_modules的代碼,這時可以將flexible.js復制出來放置到static文件夾中,在該文件做以上的代碼變更,然后在main.js里面將之前的引用更改為當前文件的引用即可。
import '../static/flexible.js';
到這里配置和變更就結束了。我們可以新建test.vue文件,在里面新建div節點,設置其寬高為200px,加入背景色以便查看盒子,然后打開控制台,這是節點樣式關於px的屬性值就會變成rem了。
<div class="box">qqqqqqqqq</div> .box{ width: 200px; height: 200px; background-color: aqua; }