移動端Vue-cli3使用px2rem 按照和問題解決方法

這篇文章主要介紹了Vue-cli3.X使用px2rem遇到的問題及解決方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下


把項目腳手架升級為cli3.X了以后,模板簡潔了很多,運行起來也更加快速。但是也隨之而來是某些兼容問題铜异。比如我們要在項目鐘使用px2rem來計算設計稿的時候,我們不能像以前老的腳手架那樣操作了秸架。那我們應該來如何設置呢揍庄?

首先,我們應該用NPM來安裝postcss-px2rem

npm i postcss-plugin-px2rem? --save -dev

然后我們需要在vue.config.js中創(chuàng)建一個配置东抹。由于在vue-cli3.X中蚂子。去掉了build和config文件夾。所有的配置都放到了vue.config.js缭黔,然而這個文件腳手架并沒有生成食茎,所以需要手動在項目的根目錄創(chuàng)建一個文件


在vue.config.js里配置

module.exports = {

? lintOnSave: true,

? css: {

? ? loaderOptions: {

? ? ? postcss: {

? ? ? ? plugins: [

? ? ? ? ? require('postcss-plugin-px2rem')({

? ? ? ? ? ? rootValue:75,? ? ? // 新版本的是這個值

? ? ? ? ? ? mediaQuery: false, //(布爾值)允許在媒體查詢中轉換px。

? ? ? ? ? ? minPixelValue: 3 //設置要替換的最小像素值(3px會被轉rem)馏谨。 默認 0

? ? ? ? ? }),

? ? ? ? ]

? ? ? }

? ? }

? },

}


要說明一點别渔。網(wǎng)上搜的一堆教程都強調應該增加remUnit來設置rem的計算標準。但是其實在新版后惧互,這個值換成了rootValue這個哎媚。例如你設計稿為750的寬度標準,那么這里的值設置為75則可喊儡。

接下來還有一個工作拨与。由于rem是根據(jù)根字體的大小來作為基準值的,然而我們的移動設備屏幕大小以及有些屏幕為視網(wǎng)膜屏的艾猜,會是普通屏幕的2倍截珍,所以這個基準值我們需要根據(jù)不同設備來進行計算攀甚。這里我們在src/plugins下新建一個rem.js文件(代碼如下)。


(function(win, lib) {

??vardoc = win.document;

??vardocEl = doc.documentElement;

??varmetaEl = doc.querySelector('meta[name="viewport"]');

??varflexibleEl = doc.querySelector('meta[name="flexible"]');

??vardpr = 0;

??varscale = 0;

??vartid;

??varflexible = lib.flexible || (lib.flexible = {});

??if(metaEl) {

????//console.warn('將根據(jù)已有的meta標簽來設置縮放比例');

????varmatch = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);

????if(match) {

??????scale = parseFloat(match[1]);

??????dpr = parseInt(1 / scale);

????}

??} elseif(flexibleEl) {

????varcontent = flexibleEl.getAttribute('content');

????if(content) {

??????varinitialDpr = content.match(/initial\-dpr=([\d\.]+)/);

??????varmaximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);

??????if(initialDpr) {

????????dpr = parseFloat(initialDpr[1]);

????????scale = parseFloat((1 / dpr).toFixed(2));

??????}

??????if(maximumDpr) {

????????dpr = parseFloat(maximumDpr[1]);

????????scale = parseFloat((1 / dpr).toFixed(2));

??????}

????}

??}

??if(!dpr && !scale) {

????varisAndroid = win.navigator.appVersion.match(/android/gi);

????varisIPhone = win.navigator.appVersion.match(/iphone/gi);

????vardevicePixelRatio = win.devicePixelRatio;

????if(isIPhone) {

??????// iOS下岗喉,對于2和3的屏,用2倍的方案炸庞,其余的用1倍方案

??????if(devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {

????????dpr = 3;

??????} elseif(devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {

????????dpr = 2;

??????} else{

????????dpr = 1;

??????}

????} else{

??????// 其他設備下钱床,仍舊使用1倍的方案

??????dpr = 1;

????}

????scale = 1 / dpr;

??}

??docEl.setAttribute('data-dpr', dpr);

??if(!metaEl) {

????metaEl = doc.createElement('meta');

????metaEl.setAttribute('name', 'viewport');

????metaEl.setAttribute('content', 'initial-scale='+ scale + ', maximum-scale='+ scale + ', minimum-scale='+ scale + ', user-scalable=no');

????if(docEl.firstElementChild) {

??????docEl.firstElementChild.appendChild(metaEl);

????} else{

??????varwrap = doc.createElement('div');

??????wrap.appendChild(metaEl);

??????doc.write(wrap.innerHTML);

????}

??}

??functionrefreshRem() {

????varwidth = docEl.getBoundingClientRect().width;

????if(width / dpr > 540) {

??????width = 540 * dpr;

????}

????varrem = width / 10;

????docEl.style.fontSize = rem + 'px';

????flexible.rem = win.rem = rem;

??}

??win.addEventListener('resize', function() {

????clearTimeout(tid);

????tid = setTimeout(refreshRem, 300);

??}, false);

??win.addEventListener('pageshow', function(e) {

????if(e.persisted) {

??????clearTimeout(tid);

??????tid = setTimeout(refreshRem, 300);

????}

??}, false);

??if(doc.readyState === 'complete') {

????doc.body.style.fontSize = 12 * dpr + 'px';

??} else{

????doc.addEventListener('DOMContentLoaded', function(e) {

??????doc.body.style.fontSize = 12 * dpr + 'px';

????}, false);

??}

??refreshRem();

??flexible.dpr = win.dpr = dpr;

??flexible.refreshRem = refreshRem;

??flexible.rem2px = function(d) {

????varval = parseFloat(d) * this.rem;

????if(typeofd === 'string'&& d.match(/rem$/)) {

??????val += 'px';

????}

????returnval;

??}

??flexible.px2rem = function(d) {

????varval = parseFloat(d) / this.rem;

????if(typeofd === 'string'&& d.match(/px$/)) {

??????val += 'rem';

????}

????returnval;

??}

})(window, window['lib'] || (window['lib'] = {}));


然后在main.js里面引入該文件

import './plugins/rem.js'

這樣,我們的工作就完成了埠居〔榕疲可以直接在css里面寫px的絕對值。

總結:? ?以上所述是小編給大家介紹的Vue-cli3.X使用px2 rem遇到的問題及解決方法,希望對大家有所幫助滥壕,如果大家有任何疑問請給我留言纸颜,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持绎橘!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末胁孙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子称鳞,更是在濱河造成了極大的恐慌涮较,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冈止,死亡現(xiàn)場離奇詭異狂票,居然都是意外死亡,警方通過查閱死者的電腦和手機熙暴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門闺属,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人周霉,你說我怎么就攤上這事掂器⊥较” “怎么了然痊?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铅协。 經(jīng)常有香客問我匠楚,道長巍膘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任芋簿,我火速辦了婚禮峡懈,結果婚禮上,老公的妹妹穿的比我還像新娘与斤。我一直安慰自己肪康,他們只是感情好荚恶,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著磷支,像睡著了一般谒撼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雾狈,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天廓潜,我揣著相機與錄音,去河邊找鬼善榛。 笑死辩蛋,一個胖子當著我的面吹牛,可吹牛的內容都是我干的移盆。 我是一名探鬼主播悼院,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咒循!你這毒婦竟也來了据途?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤剑鞍,失蹤者是張志新(化名)和其女友劉穎昨凡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚁署,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡便脊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了光戈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哪痰。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖久妆,靈堂內的尸體忽然破棺而出晌杰,到底是詐尸還是另有隱情,我是刑警寧澤筷弦,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布肋演,位于F島的核電站,受9級特大地震影響烂琴,放射性物質發(fā)生泄漏爹殊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一奸绷、第九天 我趴在偏房一處隱蔽的房頂上張望梗夸。 院中可真熱鬧,春花似錦号醉、人聲如沸反症。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铅碍。三九已至润绵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胞谈,已是汗流浹背授药。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呜魄,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓莱衩,卻偏偏與公主長得像爵嗅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子笨蚁,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內容