You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
3.2 KiB
156 lines
3.2 KiB
<template>
|
|
<div class="Adaptation" :style="transformStyle" ref="AdaptationRef">
|
|
<slot />
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: "Adaptation",
|
|
props: {
|
|
defaultWidth: {
|
|
type: Number,
|
|
default: () => 1920
|
|
},
|
|
defaultHeight: {
|
|
type: Number,
|
|
default: () => 1080
|
|
},
|
|
headerHeight: {
|
|
type: Number,
|
|
default: () => 68
|
|
|
|
}
|
|
},
|
|
provide() {
|
|
return {
|
|
adpScale: this.getScale
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
scale: {
|
|
scaleX: 1,
|
|
scaleY: 1,
|
|
}
|
|
}
|
|
},
|
|
computed: {
|
|
transformStyle() {
|
|
const obj = {};
|
|
obj["transform"] = `scaleX(${this.scale.scaleX}) scaleY(${this.scale.scaleY})`;
|
|
obj["width"] = this.defaultWidth + "px";
|
|
obj["height"] = this.defaultHeight - this.headerHeight + "px";
|
|
obj["top"] = this.headerHeight + "px";
|
|
// obj.top = `calc(50% - ${(this.defaultHeight / 2) * this.scaleY}px)`;
|
|
// obj.left = `calc(50% - ${(this.defaultWidth / 2) * this.scaleX}px)`;
|
|
|
|
return obj;
|
|
},
|
|
getScale() {
|
|
return this.scale
|
|
}
|
|
},
|
|
watch:{
|
|
headerHeight(){
|
|
}
|
|
},
|
|
methods: {
|
|
initScale() {
|
|
let winW = window.innerWidth;
|
|
let winH = window.innerHeight - this.headerHeight;
|
|
|
|
this.setScale(this.scale.scaleX = winW / this.defaultWidth, this.scale.scaleY = winH / (this.defaultHeight - this.headerHeight))
|
|
},
|
|
setScale(scaleX, scaleY) {
|
|
const cssGlobalVariable = [
|
|
[
|
|
'--keep-ratio',
|
|
''
|
|
],
|
|
[
|
|
'--reverse-scale',
|
|
''
|
|
],
|
|
[
|
|
'--middle-scale',
|
|
''
|
|
],
|
|
];
|
|
|
|
if (scaleX > scaleY) {
|
|
cssGlobalVariable[0][1] = `scaleX(${1 / scaleX * scaleY})`;
|
|
// cssGlobalVariable[0][1] = `scaleX(${1 - (scaleX - scaleY)})`;
|
|
cssGlobalVariable[1][1] = `scaleY(${1 / scaleX})`;
|
|
cssGlobalVariable[2][1] = `scaleX(${1 - (scaleX - scaleY) / 2})`;
|
|
} else {
|
|
cssGlobalVariable[0][1] = `scaleY(${1 / scaleY * scaleX})`;
|
|
// cssGlobalVariable[0][1] = `scaleX(${1 - (scaleY - scaleX)})`;
|
|
cssGlobalVariable[1][1] = `scaleX(${1 / scaleY})`;
|
|
cssGlobalVariable[2][1] = `scaleX(${1 - (scaleY - scaleX) / 2})`;
|
|
}
|
|
|
|
const AdaptationDom = this.$refs.AdaptationRef;
|
|
|
|
cssGlobalVariable.forEach((data) => {
|
|
AdaptationDom.style.setProperty(...data);
|
|
});
|
|
|
|
}
|
|
},
|
|
mounted() {
|
|
this.initScale();
|
|
|
|
// window.addEventListener(
|
|
// "resize",
|
|
// _.debounce(this.initScale.bind(this), 360)
|
|
// );
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
body {
|
|
.keep-ratio {
|
|
transform: var(--keep-ratio);
|
|
}
|
|
|
|
.reverse-ratio {
|
|
transform: var(--reverse-scale);
|
|
}
|
|
|
|
.middle-ratio {
|
|
transform: var(--middle-scale);
|
|
}
|
|
|
|
.keep-ratio,
|
|
.reverse-ratio,
|
|
.middle-ratio {
|
|
transition: all .15s linear;
|
|
|
|
&[origin="left"] {
|
|
transform-origin: left;
|
|
}
|
|
|
|
&[origin="right"] {
|
|
transform-origin: right;
|
|
}
|
|
|
|
&[origin="top"] {
|
|
transform-origin: top;
|
|
}
|
|
|
|
&[origin="bottom"] {
|
|
transform-origin: bottom;
|
|
}
|
|
}
|
|
}
|
|
</style>
|
|
|
|
<style lang="scss" scoped>
|
|
.Adaptation {
|
|
transition: all 0.15s linear;
|
|
position: fixed;
|
|
transform-origin: 0 0;
|
|
}
|
|
</style>
|
|
|