1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- <template>
- <div class="ScaleBox" ref="ScaleBox" :style="{
- width: width + 'px',
- height: height + 'px',
- }">
- <slot :scale="scale"></slot>
- </div>
- </template>
- <script>
- export default {
- name: "ScaleBox",
- props: {},
- data() {
- return {
- scale: 0,
- width: 1920,
- height: 1080,
- };
- },
- mounted() {
- this.setScale();
- window.addEventListener("resize", this.debounce(this.setScale));
- },
- methods: {
- getScale() {
- // 固定好16:9的宽高比,计算出最合适的缩放比
- const {
- width,
- height
- } = this;
- const wh = window.innerHeight / height;
- const ww = window.innerWidth / width;
- // console.log(ww < wh ? ww : wh);
- return ww < wh ? ww : wh;
- },
- setScale() {
- // 获取到缩放比例,设置它
- this.scale = this.getScale();
- if (this.$refs.ScaleBox) {
- this.$refs.ScaleBox.style.setProperty("--scale", this.scale);
- }
- },
- debounce(fn, delay) {
- const delays = delay || 500;
- let timer;
- return function() {
- const th = this;
- const args = arguments;
- if (timer) {
- clearTimeout(timer);
- }
- timer = setTimeout(function() {
- timer = null;
- fn.apply(th, args);
- }, delays);
- };
- },
- },
- };
- </script>
- <style>
- #ScaleBox {
- --scale: 1;
- }
- .ScaleBox {
- position: absolute;
- transform: scale(var(--scale)) translate(-50%, -50%);
- display: flex;
- flex-direction: column;
- transform-origin: 0 0;
- left: 50%;
- top: 50%;
- transition: 0.3s;
- z-index: 999;
- /* // background: rgba(255, 0, 0, 0.3); */
- }
- </style>
|