Echart 大屏自适应

公共方法注入

(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('div')
      wrap.appendChild(metaEl)
      doc.write(wrap.innerHTML)
    }
  }

  function refreshRem() {
    var width = 1920
    if (width / dpr > 1920) {
      // 这个位置划重点 1920是设计稿的大小 如果你的设计稿是750 那么就需要将1920替换成750
      width = (docEl.clientWidth / 1920) * 1920
    }
    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 = {}))

全局注册  import '@/utils/flexible'---->main.js

使用方式

ref="dataRef" 作用的区域

<div class="content">
    <div class="login-container">
      <div ref="dataRef" class="data-container">
        <div class="top-content">
          <div class="top-img">
            <img src="../../../assets/images/managentHome/logo.png"/>
          </div>
          <div class="amount-banner">
            <div class="center-bg" v-for="(item,index) in amountList" :key="index">
              <div class="title">{{item.title}}(万元)
                <el-tooltip class="item" effect="dark" :content="item.text" placement="top">
                  <svg-icon icon-class="sf-zhuyi1" class="tooltip-icon"/>
                </el-tooltip>
              </div>
              <div class="num">{{info[item.key] || 0}}</div>
            </div>
          </div>
        </div>
        <div class="content">
          <div class="left-content">
            <LeftLayout />
          </div>
          <div class="center-content">
            <chinaMap />
          </div>
          <div class="right-content" v-if="isCollapse">
            <rightData />
          </div>
          <div class="right-content right-collapse-content" v-else>
            <rightData />
          </div>
        </div>
      </div>
    </div>
  </div>

方法

mounted() {
    this.getScale()
    window.addEventListener('resize', () => {
      this.getScale()
    })
 }
getScale(width = 1920, height = 1080) {
     // 设计稿的高度,默认是 929 ,如果项目以全屏展示,则可以设置为1080
     const ww = document.documentElement.clientWidth / width || 1
     const wh = document.documentElement.clientHeight / height
     const scale = ww < wh ? ww : ww
     console.log(scale)
     this.$refs.dataRef.style.width = '1920px'
     this.$refs.dataRef.style.height = `${929 * ww}px`
     this.$refs.dataRef.style.transform = `scale(${ww})`
 }

重点样式  缩放起点

.data-container{
  position: relative;
  top: 0;
  z-index: 999;
  display: flex;
  flex-direction: column;
  transition: transform 0.3s;
  transform-origin: left top;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值