vue项目适配大屏端的方法示例

众所周知在vue移动端h5页面当中,适配是经常会遇到的问题,这篇文章主要给大家介绍了关于vue项目适配大屏端的相关资料,需要的朋友可以参考下

vue项目适配大屏端的方法示例,久久派带你了解更多相关信息。

浅析rem

首先rem是css单位,相比于px固定的像素单位,rem更加的灵活,还有现在也比较好的vm。如果从未了解过,可以先过过眼

rem自适应。CSS3的REM设置字体大小

font size of the root element.

简单来说,rem就是根据html元素的字体大小来计算单位的。我们的需求就是说,根据不同的分辨率,我们元素的大小能够有所对应的变化,在视觉上能够做到很舒服的效果。想想我们在做pc端的时候,一般都是中间固定比如1200px像素,然后最小1200px,两边留白,这样我们无论放大缩小都不会影响效果。但是现在移动端各种屏幕的出现,适应性就更加的强烈。根据分辨率的不同让html的字体大小变化,我们在页面中写rem,由于rem是相对于根元素字体大小来计算的,那么就可以实现自适应的效果。

1.适配方式

适配方案采用rem布局, 根据屏幕分辨率大小不同,调整根元素html的font-size, 从而达到每个元素宽高自动变化,适配不同屏幕

2.使用 postcss-px2rem-exclude 插件

安装 npm install postcss-px2rem-exclude –save-dev

在项目根目录创建 postcss.config.js 文件

module.exports = {  plugins: {    autoprefixer: {},    \'postcss-px2rem-exclude\': {      remUnit: 192      // exclude: /node_modules|folder_name/i,    }  }}

3.安装 flexible.js (建议放到本地)

安装命令 npm install lib-flexible

(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\')      // eslint-disable-next-line no-useless-escape      .match(/initial\\-scale=([\\d\\.]+)/)    if (match) {      scale = parseFloat(match[1])      dpr = parseInt(1 / scale)    }  } else if (flexibleEl) {    var content = flexibleEl.getAttribute(\'content\')    if (content) {      // eslint-disable-next-line no-useless-escape      var initialDpr = content.match(/initial\\-dpr=([\\d\\.]+)/)      // eslint-disable-next-line no-useless-escape      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 = width * 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() {        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\'] = {}))

上面的代码与安装的flexible.js不同

修改了

  function refreshRem() {    var width = docEl.getBoundingClientRect().width    if (width / dpr > 540) {      width = width * dpr    }    var rem = width / 10    docEl.style.fontSize = rem + \'px\'    flexible.rem = win.rem = rem  }

在main.js中引入

import \’路径/flexible.js\’

总结

到此这篇关于vue项目适配大屏端的文章就介绍到这了,更多相关vue适配大屏端内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/9164.html

(0)
上一篇 2021-08-02 21:38:29
下一篇 2021-08-02 21:38:32

相关推荐

发表回复

登录后才能评论