使用autofit.js做PC端页面自适应及elementui下拉框等弹框在缩放后位置偏移问题解决

autofit.js实现页面自适应的原理就是使用transform:scale()样式

1、安装插件autofit.js

npm i autofit.js

2、全局使用autofit(部分页面缩放可以通过判断路由配置autofit.init)

//app.vue
import autofit from 'autofit.js'
//mounted添加缩放监听
mounted:{
  window.addEventListener('resize',()=>{
    //立即执行无法获取最新的缩放比例,所以做个延迟
    setTimeout(()=>{
      this.scaleDeal()
    },100)
  })
},
destoryed(){
  window.removeEventListener('resize',()=>{
    this.scaleDeal()
  })
  autofit.off()
}
//监听$route 直接在mounted里写刷新的时候缩放会失效,el一定选择#app,否则下拉框等浮框的位置会偏移的很夸张
watch:{
  $route:{
    handler{
      autofit.init({
        dh:1920,
        dw:1080,
        el:'#app',
        resize:true
      })
      this.scaleDeal()
    }
  }
}

methods:{
//处理body内下拉框、日期选择器等组件的缩放及缩放后位置偏移问题,类名带[x-placement^=top]、[x-placement^=bottom]后缀的,为了处理下拉框在上/下方时缩放的基点位置(如有其他在body内的dom缩放,可自行添加类名)
 scaleDeal(){
    const appScale=document.getElementById('app').style.transform
    const styleEl = document.createElement('style')
    styleEl= 	`
    	.el-popover,.el-menu--vertical,.el-cascader_dropdown,.el-select-dropdown,.el-tooltip_popper,.el-message-box,.el-loading-spinner,.el-picker-panel{transform:${appScale}}
    	.el-message{transform:${appScale} translateX(-50%)}
    	.el-message-box_wrapper{background-color:rgba(0,0,0,.5)}
    	.el-menu--vertical{transform-origin:left top !important}
    	.poper_arrow{display:none !important}
    	.el-select-dropdown[x-placement^=bottom],.el-cascader_dropdown[x-placement^=bottom],.el-popover[x-placement^=bottom],..el-picker-panel[x-placement^=bottom]{transform-origin:left top !important}
    	.el-select-dropdown[x-placement^=top],.el-cascader_dropdown[x-placement^=top],.el-popover[x-placement^=top],.el-picker-panel[x-placement^=top]{transform-origin:left top !important}
    `
    document.head.appendChild(styleEl)
  }
}

3、main.js全局配置

import {Dialog,MessageBox} from 'element-ui'

//解决dialog遮罩层遮挡弹框内容问题(dialog的append-to-body属性不可以设置为true,否则将会不缩放且存在遮罩层遮盖弹框内容问题)
Dialog.props.modalAppendToBody.default = false
//解决dialog及messageBox的$confirm方法同时使用的情况下confirm遮罩层遮挡dialog内容的问题,messagebox的遮罩层通过设置el-message-box_wrapper的背景色解决
MessageBox.setDefaults({
  modal:false
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值