大屏适配方案
方案一
drawMixin.js
// 屏幕适配 mixin 函数
// * 默认缩放值
const scale = {
width: "1",
height: "1",
};
// * 设计稿尺寸(px)
const baseWidth = 1920;
const baseHeight = 1080;
// * 需保持的比例(默认1.77778)
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5));
export default {
data() {
return {
// * 定时函数
drawTiming: null,
};
},
computed: {
isScale() {
return this.$store.state.setting.isScale; //是否适配
},
},
mounted() {
if (!this.isScale) {
return;
}
// this.calcRate();
// window.addEventListener("resize", this.resize);
},
beforeDestroy() {
window.removeEventListener("resize", this.resize);
},
methods: {
calcRate() {
const appRef = this.$refs["appRef"];
if (!appRef) return;
// 当前宽高比
const currentRate = parseFloat(
(window.innerWidth / window.innerHeight).toFixed(5)
);
if (appRef) {
if (currentRate > baseProportion) {
// 表示更宽
scale.width = (
(window.innerHeight * baseProportion) /
baseWidth
).toFixed(5);
scale.height = (window.innerHeight / baseHeight).toFixed(5);
appRef.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`;
} else {
// 表示更高
scale.height = (
window.innerWidth /
baseProportion /
baseHeight
).toFixed(5);
scale.width = (window.innerWidth / baseWidth).toFixed(5);
appRef.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`;
}
}
},
resize() {
if (!this.isScale) {
return;
}
clearTimeout(this.drawTiming);
this.drawTiming = setTimeout(() => {
this.calcRate();
}, 200);
},
},
};
方案二
v-scale-screen
大屏自适应容器组件,可用于大屏项目开发,实现屏幕自适应,可根据宽度自适应,高度自适应,和宽高等比例自适应,全屏自适应(会存在拉伸问题)
在 2.2.0 以上的版本中,我们同时支持 Vue>=v3或 Vue >=2.7,如果你的项目是vue2.6版本以下,那么使用1.x版本
- 预览:https://zh1d2k.csb.app/
- 仓库地址:github
- 国内地址:gitee
图例
安装
npm install v-scale-screen
# or
yarn add v-scale-screen
vue2.6 版本
在 vue2 中我们使用插件方式导出,故而需要 Vue.use() 进行注册
// main.js
import Vue from 'vue'
import VScaleScreen from 'v-scale-screen'
Vue.use(VScaleScreen)
<template>
<v-scale-screen width="1920" height="1080">
<div>
<v-chart>....</v-chart>
<v-chart>....</v-chart>
<v-chart>....</v-chart>
<v-chart>....</v-chart>
<v-chart>....</v-chart>
</div>
</v-scale-screen>
</template>
Vue3 or Vue2.7 版本
// body 默认样式 overflow: hidden;
我们在 vue3 中以组件方式导出
<template>
<v-scale-screen width="1920" height="1080">
<div>
<v-chart>....</v-chart>
<v-chart>....</v-chart>
<v-chart>....</v-chart>
<v-chart>....</v-chart>
<v-chart>....</v-chart>
</div>
</v-scale-screen>
</template>
<script>
import { defineComponent } from 'vue'
import VScaleScreen from 'v-scale-screen'
export default defineComponent({
name: 'Demo',
components: {
VScaleScreen
}
})
</script>
注:使用时请将
body
样式设置为overflow: hidden;
注:使用时请将body
样式设置为overflow: hidden;
注:使用时请将body
样式设置为overflow: hidden;
API
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
width | 大屏宽度 | Number or String |
1920 |
height | 大屏高度 | Number or String |
1080 |
autoScale | 自适应配置,配置为 boolean 类型时,为启动或者关闭自适应,配置为对象时,若 x 为 true,x 轴产生边距,y 为 true 时,y 轴产生边距,启用 fullScreen 时此配置失效 | Boolean or | true |
delay | 窗口变化防抖延迟时间 | Number | 500 |
fullScreen | 全屏自适应,启用此配置项时会存在拉伸效果,同时 autoScale 失效,非必要情况下不建议开启 | Boolean | false |
boxStyle | 修改容器样式,如居中展示时侧边背景色,符合 Vue 双向绑定 style 标准格式 | Object | null |
wrapperStyle | 修改自适应区域样式,符合 Vue 双向绑定 style 标准格式 | Object | null |
bodyOverflowHidden | 启用后body的样式会自动设置为 overflow: hidden |
Boolean | true |