이 글은 주로 vue2.0의 다양한 화면 적응과 px-rem 변환 문제에 대한 자세한 설명을 소개하고 있습니다.
프로젝트 요구로 인해 Vue 개발 프로젝트에서는 px로 작성된 부분을 rem으로 변환해야 합니다. 모두 변환한다면 이 엄청난 양의 계산량은 sublime Text의 cssrem 플러그인에도 엄청난 작업 부하가 될 것입니다. 따라서 플러그인을 직접 사용하는 것에 대한 논의는 없습니다.
1단계: rem은 새 요소를 기반으로 크기를 계산하므로 현재 화면의 크기를 캡처하여 html에 할당하는 것이 1단계입니다.
2단계: px2rem 플러그인을 사용하여 현재 프로젝트의 모든 px를 캡처합니다. 해당 값을 직접 계산합니다.
이렇게 하면 나중에 인터페이스를 작성할 때 직접 계산할 필요 없이 px를 직접 사용하여 인터페이스를 구축할 수 있습니다!
1. 플러그인을 설치합니다(타오바오 이미지를 설치했으니 cnpm입니다. 타오바오 이미지가 설치되어 있지 않다면 npm을 사용하세요)
$ cnpm i postcss-px2rem --save $ cnpm install px2rem-loader --save
2. vue-loader.conf.js에서 px2rem을 구성하세요. 빌드 디렉터리에서 다음 수정을 수행합니다.
module.exports = { loaders: utils.cssLoaders({ sourceMap: isProduction ? config.build.productionSourceMap : config.dev.cssSourceMap, extract: isProduction }), transformToRequire: { video: 'src', source: 'src', img: 'src', image: 'xlink:href' }, postcss:[require('postcss-px2rem')({'remUnit':37.5,'baseDpr':2})] /*因为我是以750px(iphone6)宽度为基准,所以remUnit为37.5*/ }
3 정적 디렉터리에서 js 폴더를 만들고 flex.js를 넣습니다.
(function(win, lib) { var doc = win.document; var docEl = doc.documentElement; var metaEl = doc.querySelector('meta[name="viewport"]'); var flexibleEl = doc.querySelector('meta[name="flexible"]'); var dpr = 0; var scale = 0; var tid; var flexible = lib.flexible || (lib.flexible = {}); if (metaEl) { //console.warn('将根据已有的meta标签来设置缩放比例'); var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/); if (match) { scale = parseFloat(match[1]); dpr = parseInt(1 / scale); } } else if (flexibleEl) { var content = flexibleEl.getAttribute('content'); if (content) { var initialDpr = content.match(/initial\-dpr=([\d\.]+)/); var maximumDpr = 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) { var isAndroid = win.navigator.appVersion.match(/android/gi); var isIPhone = win.navigator.appVersion.match(/iphone/gi); var devicePixelRatio = win.devicePixelRatio; if (isIPhone) { // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案 if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) { dpr = 3; } else if (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 { var wrap = doc.createElement('p'); wrap.appendChild(metaEl); doc.write(wrap.innerHTML); } } 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; } 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) { var val = parseFloat(d) * this.rem; if (typeof d === 'string' && d.match(/rem$/)) { val += 'px'; } return val; } flexible.px2rem = function(d) { var val = parseFloat(d) / this.rem; if (typeof d === 'string' && d.match(/px$/)) { val += 'rem'; } return val; } })(window, window['lib'] || (window['lib'] = {}));
4 index.html에 flex.js
<script type="text/javascript" src="static/js/flex.js"></script>
5를 추가합니다. 프로젝트
끝났습니다! !
이제 브라우저에서 px가 rem으로 변환된 것을 볼 수 있습니다!
위 내용은 모든 사람을 위해 정리한 내용입니다. 앞으로 모든 사람에게 도움이 되기를 바랍니다.
관련 기사:
Vue에서 대화 상자를 구현하는 방법vue에서 echarts3.0을 사용하는 적응형 방법은 무엇입니까? 스와이프에서 동적 로딩 데이터 슬라이딩 오류 문제를 해결하는 방법은 무엇입니까?위 내용은 vue2.0의 다른 화면에 적응할 때 px 및 rem 변환 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!