2024年Web前端最新vue 项目的屏幕自适应方案_vue2-scale-box,2024年最新面试技巧考试

总结

=============================================================

从转行到现在,差不多两年的时间,虽不能和大佬相比,但也是学了很多东西。我个人在学习的过程中,习惯简单做做笔记,方便自己复习的时候能够快速理解,现在将自己的笔记分享出来,和大家共同学习。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

个人将这段时间所学的知识,分为三个阶段:

第一阶段:HTML&CSS&JavaScript基础

第二阶段:移动端开发技术

第三阶段:前端常用框架

  • 推荐学习方式:针对某个知识点,可以先简单过一下我的笔记,如果理解,那是最好,可以帮助快速解决问题;如果因为我的笔记太过简陋不理解,可以关注我以后我还会继续分享。

  • 大厂的面试难在,针对一个基础知识点,比如JS的事件循环机制,不会上来就问概念,而是换个角度,从题目入手,看你是否真正掌握。所以对于概念的理解真的很重要。

或者

yarn add vue3-scale-box

使用方法:

<template>
    <ScaleBox :width="1920" :height="1080" bgc="transparent" :delay="100">
        <router-view />
    </ScaleBox>
</template>

<script>
import ScaleBox from "vue3-scale-box";
</script>

<style lang="scss">
body {
    margin: 0;
    padding: 0;
    background: url("@/assets/bg.jpg");
}
</style>
方案二:设置设备像素比例(设备像素比)

在项目的 utils 下新建 devicePixelRatio.js 文件

class devicePixelRatio {
  /* 获取系统类型 */
  getSystem() {
    const agent = navigator.userAgent.toLowerCase();
    const isMac = /macintosh|mac os x/i.test(navigator.userAgent);
    if (isMac) return false;
    // 目前只针对 win 处理,其它系统暂无该情况,需要则继续在此添加即可
    if (agent.indexOf("windows") >= 0) return true;
  }
  /* 监听方法兼容写法 */
  addHandler(element, type, handler) {
    if (element.addEventListener) {
      element.addEventListener(type, handler, false);
    } else if (element.attachEvent) {
      element.attachEvent("on" + type, handler);
    } else {
      element["on" + type] = handler;
    }
  }
  /* 校正浏览器缩放比例 */
  correct() {
    // 页面devicePixelRatio(设备像素比例)变化后,计算页面body标签zoom修改其大小,来抵消devicePixelRatio带来的变化
    document.getElementsByTagName("body")[0].style.zoom =
      1 / window.devicePixelRatio;
  }
  /* 监听页面缩放 */
  watch() {
    const that = this;
    // 注意: 这个方法是解决全局有两个window.resize
    that.addHandler(window, "resize", function () {
      that.correct(); // 重新校正浏览器缩放比例
    });
  }
  /* 初始化页面比例 */
  init() {
    const that = this;
    // 判断设备,只在 win 系统下校正浏览器缩放比例
    if (that.getSystem()) {
      that.correct(); // 校正浏览器缩放比例
      that.watch(); // 监听页面缩放
    }
  }
}
export default devicePixelRatio;

在 App.vue 中引入并使用即可

<template>
  <div>
    <router-view />
  </div>
</template>

<script>
import devPixelRatio from "@/utils/devicePixelRatio.js";

export default {
  created() {
    new devPixelRatio().init(); // 初始化页面比例
  },
};
</script>

<style lang="scss">
body {
  margin: 0;
  padding: 0;
}
</style>
方案三:通过 JS 设置 zoom 属性调整缩放比例

在项目的 utils 下新建 monitorZoom.js 文件

export const monitorZoom = () => {
  let ratio = 0,
    screen = window.screen,
    ua = navigator.userAgent.toLowerCase();
  if (window.devicePixelRatio !== undefined) {
    ratio = window.devicePixelRatio;
  } else if (~ua.indexOf("msie")) {
    if (screen.deviceXDPI && screen.logicalXDPI) {
      ratio = screen.deviceXDPI / screen.logicalXDPI;
    }
  } else if (
    window.outerWidth !== undefined &&
    window.innerWidth !== undefined
  ) {
    ratio = window.outerWidth / window.innerWidth;
  }
  if (ratio) {
    ratio = Math.round(ratio * 100);
  }
  return ratio;
};

在 main.js 中引入并使用即可

import { monitorZoom } from "@/utils/monitorZoom.js";
const m = monitorZoom();
if (window.screen.width * window.devicePixelRatio >= 3840) {
  document.body.style.zoom = 100 / (Number(m) / 2); // 屏幕为 4k 时
} else {
  document.body.style.zoom = 100 / Number(m);
}

完整代码

import Vue from "vue";
import App from "./App.vue";
import router from "./router";

/* 调整缩放比例 start */
import { monitorZoom } from "@/utils/monitorZoom.js";
const m = monitorZoom();
if (window.screen.width * window.devicePixelRatio >= 3840) {
  document.body.style.zoom = 100 / (Number(m) / 2); // 屏幕为 4k 时
} else {
  document.body.style.zoom = 100 / Number(m);
}
/* 调整缩放比例 end */

Vue.config.productionTip = false;

new Vue({
  router,
  render: (h) => h(App),
}).$mount("#app");

获取屏幕的分辨率

获取屏幕的宽:

最后

其实前端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

这里再分享一个复习的路线:(以下体系的复习资料是我从各路大佬收集整理好的)

《前端开发四大模块核心知识笔记》

最后,说个题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

<think>好的,我现在要解决的问题是如何在弹窗中使用vue2-scale-box组件。用户提到他们参考了React中封装的自适应大屏组件,并希望了解在Vue2环境下,特别是在弹窗中如何实现类似的效果。我需要先理解vue2-scale-box的基本用法,然后思考如何将其集成到弹窗组件中。 首先,根据用户提供的引用[1],vue2-scale-box的调用示例是在父组件中以<ScreenAutoBox>包裹内容,设置宽度、高度等属性。这说明该组件主要是通过包裹子组件来实现自适应缩放。那么,在弹窗中使用的话,可能需要将vue2-scale-box作为弹窗的内容容器。 接下来,需要考虑弹窗组件本身的特性。通常,弹窗如Element UI的el-dialog是动态插入到DOM中的,可能存在于body的子元素下,这可能导致vue2-scale-box的缩放计算受到影响,因为其默认可能基于父容器的尺寸。如果弹窗的尺寸不是全屏的,那么vue2-scale-box需要根据弹窗的实际尺寸来调整缩放比例,而不是整个屏幕的大小。 可能的步骤包括: 1. 在弹窗组件内部引入vue2-scale-box,将弹窗的内容包裹在其中。 2. 调整vue2-scale-box的宽度和高度参数,使其适应弹窗的尺寸而非整个视口。 3. 处理弹窗打开时的动态尺寸计算,可能需要监听弹窗的尺寸变化,或者在弹窗打开后手动触发缩放更新。 此外,需要注意CSS样式的作用域,确保vue2-scale-box的样式能够正确应用到弹窗内部,避免样式冲突或覆盖问题。例如,弹窗可能使用了定位属性如fixed或absolute,这可能需要调整vue2-scale-box的容器样式以确保正确的布局。 另外,用户提到参考了vue2-org-tree的使用方法(引用[2]),其中涉及样式的引入和插件的注册。这可能提示在集成vue2-scale-box到弹窗时,需要确保相关的样式文件正确导入,避免因样式缺失导致布局异常。 总结可能的实现方法: - 在弹窗的模板中包裹vue2-scale-box组件,传递弹窗的内容作为其子元素。 - 根据弹窗的实际尺寸动态设置vue2-scale-box的width和height属性,可能需要通过props传递或计算属性获取弹窗的尺寸。 - 处理弹窗打开后的缩放更新,可能需要在mounted或updated生命周期钩子中调用缩放函数,或在弹窗打开的事件中触发调整。 可能的示例代码结构如下: 在弹窗组件中: <template> <el-dialog :visible.sync="dialogVisible"> <vue-scale-box :width="dialogWidth" :height="dialogHeight"> <!-- 弹窗内容 --> </vue-scale-box> </el-dialog> </template> 需要动态获取dialogWidth和dialogHeight,可能通过计算属性或者监听弹窗的尺寸变化。此外,可能需要使用refs来访问vue-scale-box的实例,以便在弹窗打开时调用其缩放方法。 还需要考虑弹窗可能在不同屏幕尺寸下的显示问题,确保vue2-scale-box能够正确适应弹窗容器的大小变化。如果弹窗是居中显示的,可能需要设置容器的宽度和高度为100%,以便vue-scale-box基于弹窗内容区域进行缩放。 最后,测试不同场景下的显示效果,例如弹窗大小调整、内容动态变化等,确保自适应功能正常工作。</think>在弹窗中使用`vue2-scale-box`需调整其容器尺寸适配弹窗区域,以下是具体实现步骤及示例: ### 实现方法 1. **包裹弹窗内容** 将`vue2-scale-box`作为弹窗的内容容器,动态绑定弹窗的实际展示尺寸作为参数。 2. **动态尺寸计算** 通过监听弹窗打开事件或使用`ResizeObserver`获取弹窗内容区的实时宽高,传递给`vue2-scale-box`。 3. **样式层级处理** 确保弹窗的`z-index`和定位属性不影响缩放计算,避免内容被遮挡。 ### 示例代码 ```vue <template> <div> <el-button @click="dialogVisible = true">打开弹窗</el-button> <el-dialog title="自适应弹窗" :visible.sync="dialogVisible" width="80%" @opened="handleDialogOpened" > <!-- 关键:使用vue2-scale-box包裹内容 --> <vue-scale-box :width="scaleWidth" :height="scaleHeight" ref="scaleBox" > <div class="dialog-content"> <!-- 弹窗具体内容 --> <h1>自适应弹窗内容</h1> <p>分辨率基准:{{ scaleWidth }}x{{ scaleHeight }}</p> </div> </vue-scale-box> </el-dialog> </div> </template> <script> export default { data() { return { dialogVisible: false, scaleWidth: 800, // 基准宽度,根据弹窗内容区设置 scaleHeight: 600 // 基准高度 }; }, methods: { handleDialogOpened() { // 弹窗打开后获取内容区实际尺寸 const contentEl = this.$el.querySelector('.el-dialog__body'); if (contentEl) { this.scaleWidth = contentEl.clientWidth; this.scaleHeight = contentEl.clientHeight; // 手动触发缩放更新 this.$nextTick(() => { this.$refs.scaleBox.updateScale(); }); } } } }; </script> <style scoped> .dialog-content { width: 100%; height: 100%; text-align: center; } </style> ``` ### 关键说明 1. **尺寸传递** `scaleWidth`和`scaleHeight`需根据弹窗内容区域的实际尺寸动态计算,示例中通过`@opened`事件获取元素尺寸[^1]。 2. **手动更新缩放** 调用`this.$refs.scaleBox.updateScale()`确保弹窗展开后立即应用正确缩放比例。 3. **样式穿透** 若遇到样式问题,可使用`/deep/`或`::v-deep`修改子组件样式: ```css ::v-deep .vue-scale-box-container { transform-origin: 0 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值