scale自适应分辨率 实现缩放自适应(vue3)

组件

<template>
  <div
    class="ScaleBox"
    :style="{
      width: width + 'px',
      height: height + 'px',
    }"
  >
    <slot></slot>
  </div>
</template>

<script setup>
import {
  defineProps,
  onMounted,
  onUnmounted,
  reactive,
  toRef,
  watch,
} from "vue";
import { debounce } from "@/util/scale.ts";
const props = defineProps({
  width: Number,
  height: Number,
});
const width = toRef(props, "width");
const height = toRef(props, "height");
let scale = reactive({
  w: 1,
  h: 1,
});
let getScale = () => {
  // const wh = window.innerHeight / height;
  // const ww = window.innerWidth / width;
  // return [wh,ww];
  const w = window.innerWidth / width.value;
  const h = window.innerHeight / height.value;
  let scale = w < h ? w : h;
  return [scale, scale];
};
let setScale = (e) => {
  // 缩放比
  scale.h = getScale()[0];
  scale.w = getScale()[1];
};
let reCalc = debounce(setScale);
watch(
  () => width.value,
  () => {
    setScale();
  }
);

onMounted(() => {
  setScale();
  window.addEventListener("resize", reCalc);
});
onUnmounted(() => {
  window.removeEventListener("resize", reCalc);
});
</script>
<script>
export default {
  name: "ScaleBox",
};
</script>

<style lang="scss" scoped>
.ScaleBox {
  position: absolute;
  // transform: scale(v-bind('scale.h')) translate(-50%, -50%);
  transform: scale(v-bind("scale.w"), v-bind("scale.h")) translate(-50%, -50%);
  display: flex;
  flex-direction: column;
  transform-origin: top left;
  left: 50%;
  top: 50%;
  transition: 0.2s;
  z-index: 999;
  // background: rgba(255, 0, 0, 0.3);
}
</style>

使用

<script setup lang="ts">
const otherConfig = ref({
  pageWidth: 1920,
  pageHight: 1080,
});
otherConfig.value.pageHight = window.screen.availHeight;
otherConfig.value.pageWidth = window.screen.availWidth;
</script>
<template>
  <ScaleBox
    :width="otherConfig.pageWidth"
    :height="otherConfig.pageHight"
    style="background: #eeeeee"
  >
  //自适应内容
  </ScaleBox>
</template>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值