Vue使得大屏自适应的多种方法

 更新时间:2023年10月12日 09:21:26   作者:幕飒前端程序员  
这篇文章主要介绍了Vue使得大屏自适应的多种方法,自适屏幕,始终保持16:9的比例,还一种是使用CSS scale属性对大屏幕做自适应处理,需要的朋友可以参考下

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

1.自适屏幕,始终保持16:9的比例

<!-- 大屏固定比例16:9自适应   -->
<template>
    <div class="container">
      <div class="content" :style="getAspectRatioStyle">
        <!-- 数据展示内容 -->
      </div>
    </div>
  </template>
  <script setup lang="ts">
  import { ref, onMounted, onBeforeUnmount, computed } from 'vue';
      const contentWidth = ref(0);
      const contentHeight = ref(0);
      const calculateAspectRatio = () => {
        const container = document.querySelector('.container');
        // const containerWidth = container.offsetWidth;
        const containerWidth: number = (<HTMLElement>container).offsetWidth;
        // const containerHeight = container.offsetHeight;
        const containerHeight: number = (<HTMLElement>container).offsetHeight;
        const aspectRatio = 16 / 9; // 16:9 比例
        const containerAspectRatio = containerWidth / containerHeight;
        if (containerAspectRatio > aspectRatio) {
          // 以高度为基准,按比例计算宽度
          contentHeight.value = containerHeight;
          contentWidth.value = Math.floor(containerHeight * aspectRatio);
        } else {
          // 以宽度为基准,按比例计算高度
          contentWidth.value = containerWidth;
          contentHeight.value = Math.floor(containerWidth / aspectRatio);
        }
        console.log('contentWidth',contentWidth.value)
        console.log('contentHeight',contentHeight.value)
      };
      onMounted(() => {
        calculateAspectRatio();
        window.addEventListener('resize', calculateAspectRatio);
      });
      onBeforeUnmount(() => {
        window.removeEventListener('resize', calculateAspectRatio);
      });
      const getAspectRatioStyle = computed(() => ({
        width: `${contentWidth.value}px`,
        height: `${contentHeight.value}px`,
        margin: 'auto',
        background: 'gray'
      }
    ));
  </script>
  <style>
  .container {
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .content {
    /* 根据计算得到的宽高样式设置 */
  }
  </style>

2.使用CSS scale属性对大屏幕做自适应处理

<template>
<div class="login-container">
  <div class="login-main" ref="dataScreenRef"></div>
</div>
</template>
<script setup>
const dataScreenRef = ref(null);
const width = 1920;
const height = 1080;
// 根据浏览器大小推断缩放比例
// 首先要确定设计稿尺寸,默认是 1920 x 1080
// 分别计算浏览器和设计图宽高比
// 如果浏览器的宽高比大于设计稿的宽高比,就取浏览器高度和设计稿高度之比
// 如果浏览器的宽高比小于设计稿的宽高比,就取浏览器宽度和设计稿宽度之比
const getScale = (w = width, h = height) => {
  let ww = window.innerWidth / w;
  let wh = window.innerHeight / h;
  return ww < wh ? ww : wh;
};
/* 浏览器监听 resize 事件 */
const resize = () => {
  if (dataScreenRef.value) {
    dataScreenRef.value.style.transform = `scale(${getScale()}) translate(-50%, -50%)`;
  }
};
onMounted(() => {
  // 初始化时为外层盒子加上缩放属性,防止刷新界面时就已经缩放
  if (dataScreenRef.value) {
    dataScreenRef.value.style.transform = `scale(${getScale()}) translate(-50%, -50%)`;
    dataScreenRef.value.style.width = `${width}px`;
    dataScreenRef.value.style.height = `${height}px`;
  }
  window.addEventListener("resize", resize);
});
</script>
<style scoped lang="scss">
.login-container {
  width: 100%;
  height: 100%;
  transform-origin: 0 0;
  position: relative;
}
.login-main {
  width: 100%;
  height: 100%;
  position: absolute;
}
</style>

3.使用rem

(1)npm下载插件,自动将px单位转换成rem单位

npm install postcss-px2rem --save

(2)在根目录src中新建util目录下新建rem.js等比适配文件

// rem等比适配配置文件
// 基准大小
const baseSize = 14
// 设置 rem 函数
function setRem () {
  // 当前页面宽度相对于 1920宽的缩放比例,可根据自己需要修改。
  const scale = document.documentElement.clientWidth / 1920
  // 设置页面根节点字体大小(“Math.min(scale, 2)” 指最高放大比例为2,可根据实际业务需求调整)
  document.documentElement.style.fontSize = baseSize * Math.min(scale, 2) + 'px'
}
// 初始化
setRem()
// 改变窗口大小时重新设置 `rem`
window.onresize = function () {
  setRem()
}

(3)在main.js中引入适配文件

import './util/rem'

(4)到vue.config.js中配置插件

// 引入等比适配插件
const px2rem = require('postcss-px2rem')
// 配置基本大小
const postcss = px2rem({
  // 基准大小 baseSize,需要和rem.js中相同
  // remUnit: 14 代表 1rem = 14px; 所以当你一个14px值时,它会自动转成 (14px/14)rem
  remUnit: 14
})
// 使用等比适配插件
module.exports = {
  lintOnSave: true,
  css: {
    loaderOptions: {
      less: {
        javascriptEnabled: true,
      },
      postcss: {
        plugins: [
          postcss,
        ],
      },
    },
  },
}

到此这篇关于Vue使得大屏自适应的多种方法的文章就介绍到这了,更多相关vue大屏幕自适应内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue3中使用Pinia修改State的五种方式

    Vue3中使用Pinia修改State的五种方式

    这篇文章主要介绍了Vue3中使用Pinia修改State的五种方式,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2023-11-11
  • Pinia入门学习之实现简单的用户状态管理

    Pinia入门学习之实现简单的用户状态管理

    Vue3虽然相对于Vue2很多东西都变了,但是核心的东西还是没有变,比如说状态管理、路由等,再Vue3中尤大神推荐我们使用pinia来实现状态管理,他也说pinia就是Vuex的新版本,这篇文章主要给大家介绍了关于Pinia入门学习之实现简单的用户状态管理的相关资料,需要的朋友可以参考下
    2022-11-11
  • vue-preview动态获取图片宽高并增加旋转功能的实现

    vue-preview动态获取图片宽高并增加旋转功能的实现

    这篇文章主要介绍了vue-preview动态获取图片宽高并增加旋转功能的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • VUE中data配置项详细解析

    VUE中data配置项详细解析

    data属性是Vue实例的数据对象,可以绑定的是对象或者是函数,下面这篇文章主要给大家介绍了关于VUE中data配置项详细解析的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • vue.draggable实现表格拖拽排序效果

    vue.draggable实现表格拖拽排序效果

    这篇文章主要为大家详细介绍了vue.draggable实现表格拖拽排序效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • el-select 下拉框全选、多选的几种方式组件示例详解

    el-select 下拉框全选、多选的几种方式组件示例详解

    这篇文章主要介绍了el-select 下拉框全选、多选的几种方式组件示例详解,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12
  • vue获取DOM元素并设置属性的两种实现方法

    vue获取DOM元素并设置属性的两种实现方法

    下面小编就为大家带来一篇vue获取DOM元素并设置属性的两种实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • element-ui配合node实现自定义上传文件方式

    element-ui配合node实现自定义上传文件方式

    这篇文章主要介绍了element-ui配合node实现自定义上传文件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 浅谈Vue服务端渲染框架Nuxt的那些事

    浅谈Vue服务端渲染框架Nuxt的那些事

    这篇文章主要介绍了浅谈Vue服务端渲染框架Nuxt的那些事,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • vue项目打包优化的方法实战记录

    vue项目打包优化的方法实战记录

    最近入职了新公司,接手了一个新拆分出来的Vue项目,针对该项目做了个打包优化,把经验分享出来,下面这篇文章主要给大家介绍了关于vue项目打包优化的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08

最新评论