• VUE如何使得大屏自适应的几种方法?


    VUE3学习大屏自适应的几种方法

    1.自适屏幕,始终保持16:9的比例(第一种方法)

    1. <!-- 大屏固定比例169自适应 -->
    2. <template>
    3. <div class="container">
    4. <div class="content" :style="getAspectRatioStyle">
    5. <!-- 数据展示内容 -->
    6. </div>
    7. </div>
    8. </template>
    9. <script setup lang="ts">
    10. import { ref, onMounted, onBeforeUnmount, computed } from 'vue';
    11. const contentWidth = ref(0);
    12. const contentHeight = ref(0);
    13. const calculateAspectRatio = () => {
    14. const container = document.querySelector('.container');
    15. // const containerWidth = container.offsetWidth;
    16. const containerWidth: number = (<HTMLElement>container).offsetWidth;
    17. // const containerHeight = container.offsetHeight;
    18. const containerHeight: number = (<HTMLElement>container).offsetHeight;
    19. const aspectRatio = 16 / 9; // 16:9 比例
    20. const containerAspectRatio = containerWidth / containerHeight;
    21. if (containerAspectRatio > aspectRatio) {
    22. // 以高度为基准,按比例计算宽度
    23. contentHeight.value = containerHeight;
    24. contentWidth.value = Math.floor(containerHeight * aspectRatio);
    25. } else {
    26. // 以宽度为基准,按比例计算高度
    27. contentWidth.value = containerWidth;
    28. contentHeight.value = Math.floor(containerWidth / aspectRatio);
    29. }
    30. console.log('contentWidth',contentWidth.value)
    31. console.log('contentHeight',contentHeight.value)
    32. };
    33. onMounted(() => {
    34. calculateAspectRatio();
    35. window.addEventListener('resize', calculateAspectRatio);
    36. });
    37. onBeforeUnmount(() => {
    38. window.removeEventListener('resize', calculateAspectRatio);
    39. });
    40. const getAspectRatioStyle = computed(() => ({
    41. width: `${contentWidth.value}px`,
    42. height: `${contentHeight.value}px`,
    43. margin: 'auto',
    44. background: 'gray'
    45. }
    46. ));
    47. </script>
    48. <style>
    49. .container {
    50. width: 100%;
    51. height: 100%;
    52. display: flex;
    53. align-items: center;
    54. justify-content: center;
    55. }
    56. .content {
    57. /* 根据计算得到的宽高样式设置 */
    58. }
    59. </style>

    2.使用CSS scale属性对大屏幕做自适应处理(第二种方法)

    1. <template>
    2. <div class="login-container">
    3. <div class="login-main" ref="dataScreenRef"></div>
    4. </div>
    5. </template>
    6. <script setup>
    7. const dataScreenRef = ref(null);
    8. const width = 1920;
    9. const height = 1080;
    10. // 根据浏览器大小推断缩放比例
    11. // 首先要确定设计稿尺寸,默认是 1920 x 1080
    12. // 分别计算浏览器和设计图宽高比
    13. // 如果浏览器的宽高比大于设计稿的宽高比,就取浏览器高度和设计稿高度之比
    14. // 如果浏览器的宽高比小于设计稿的宽高比,就取浏览器宽度和设计稿宽度之比
    15. const getScale = (w = width, h = height) => {
    16. let ww = window.innerWidth / w;
    17. let wh = window.innerHeight / h;
    18. return ww < wh ? ww : wh;
    19. };
    20. /* 浏览器监听 resize 事件 */
    21. const resize = () => {
    22. if (dataScreenRef.value) {
    23. dataScreenRef.value.style.transform = `scale(${getScale()}) translate(-50%, -50%)`;
    24. }
    25. };
    26. onMounted(() => {
    27. // 初始化时为外层盒子加上缩放属性,防止刷新界面时就已经缩放
    28. if (dataScreenRef.value) {
    29. dataScreenRef.value.style.transform = `scale(${getScale()}) translate(-50%, -50%)`;
    30. dataScreenRef.value.style.width = `${width}px`;
    31. dataScreenRef.value.style.height = `${height}px`;
    32. }
    33. window.addEventListener("resize", resize);
    34. });
    35. </script>
    36. <style scoped lang="scss">
    37. .login-container {
    38. width: 100%;
    39. height: 100%;
    40. transform-origin: 0 0;
    41. position: relative;
    42. }
    43. .login-main {
    44. width: 100%;
    45. height: 100%;
    46. position: absolute;
    47. }
    48. </style>

    3.使用rem(第三种方法)

    (1)npm下载插件,自动将px单位转换成rem单位
    npm install postcss-px2rem --save
    
    (2)在根目录src中新建util目录下新建rem.js等比适配文件
    1. // rem等比适配配置文件
    2. // 基准大小
    3. const baseSize = 14
    4. // 设置 rem 函数
    5. function setRem () {
    6. // 当前页面宽度相对于 1920宽的缩放比例,可根据自己需要修改。
    7. const scale = document.documentElement.clientWidth / 1920
    8. // 设置页面根节点字体大小(“Math.min(scale, 2)” 指最高放大比例为2,可根据实际业务需求调整)
    9. document.documentElement.style.fontSize = baseSize * Math.min(scale, 2) + 'px'
    10. }
    11. // 初始化
    12. setRem()
    13. // 改变窗口大小时重新设置 `rem`
    14. window.onresize = function () {
    15. setRem()
    16. }
    (3)在main.js中引入适配文件
    import './util/rem'
    
    (4)到vue.config.js中配置插件
    1. // 引入等比适配插件
    2. const px2rem = require('postcss-px2rem')
    3. // 配置基本大小
    4. const postcss = px2rem({
    5. // 基准大小 baseSize,需要和rem.js中相同
    6. // remUnit: 14 代表 1rem = 14px; 所以当你一个14px值时,它会自动转成 (14px/14)rem
    7. remUnit: 14
    8. })
    9. // 使用等比适配插件
    10. module.exports = {
    11. lintOnSave: true,
    12. css: {
    13. loaderOptions: {
    14. less: {
    15. javascriptEnabled: true,
    16. },
    17. postcss: {
    18. plugins: [
    19. postcss,
    20. ],
    21. },
    22. },
    23. },
    24. }
  • 相关阅读:
    7.elasticsearch字段类型列表
    CSS基础知识筑基
    安卓教材学习
    Linux O_CLOEXEC
    (十六)Alian 的 Spring Cloud Eureka 集群配置(主机名方式)
    Spring 的事务实现方式有哪些?
    Target EDI 850 采购订单报文详解
    从0开始学python(八)
    LeetCode 704. 二分查找
    静态住宅代理是什么?为什么要选择它?
  • 原文地址:https://blog.csdn.net/weixin_42711805/article/details/133773699