VUE3大屏自适应布局的几种实现方式

 更新时间:2025年10月20日 10:49:48   作者:FAIRY_STARS  
本文主要介绍了基于SCSS自定义vw和vh函数实现响应式布局的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 视口单位布局 (Viewport Units)

使用 vwvh 单位来实现响应式布局:

.full-screen {
  width: vw(1920);
  height: vh(1080);
  padding: vh(5) vw(5) vh(5) vw(5);
}

.header-title {
  font-size: vw(40);
  line-height: vh(80);
}

这里的 vw()vh() 函数是自定义的 SCSS 函数,用于将设计稿尺寸(1920×1080)转换为视口单位。

SCSS函数:

@use "sass:math";

$designWidth: 1920;
$designHeight: 1080;

@function vw($px){
    @return math.div($px, $designWidth) * 100vw;
}

@function vh($px){
    @return math.div($px, $designHeight) * 100vh;
}

需要在 vite.config.js 中配置,非常重要,它实现了 SCSS 预处理器的全局变量和函数注入功能:

css: {
  preprocessorOptions: {
    scss: {
      additionalData: '@import "@/styles/utils.scss";'
    },
  },
}

作用解释

1. 全局 SCSS 变量和函数注入

这段配置会在编译每个 SCSS 文件时,自动在文件开头插入 @import "@/styles/utils.scss";。这意味着:

  • 无需在每个 Vue 组件的 <style> 标签中手动导入 utils.scss
  • 所有 SCSS 变量、混合宏(mixin)和函数都可以在所有组件中直接使用

2. 实际效果

由于这个配置,可以在任何组件的样式中直接使用 vw()vh() 函数:

<template>
  <div class="container">...</div>
</template>

<style scoped lang="scss">
.container {
  width: vw(300); // 直接使用,无需导入
  height: vh(200); // 直接使用,无需导入
  padding: vh(10) vw(20);
}
</style>

注意事项

  1. 避免副作用:确保 utils.scss 中不包含实际 CSS 输出,只包含变量、混合宏和函数
  2. 性能影响:虽然轻微,但每个样式文件都会额外编译注入的内容
  3. 命名冲突:全局注入可能导致命名冲突,需注意命名规范

函数工作原理

  1. 设计基准:以 1920×1080 分辨率作为设计基准
  2. 单位转换
    • vw($px):将像素值转换为相对于视口宽度的百分比
    • vh($px):将像素值转换为相对于视口高度的百分比
  3. 计算方式
    • math.div($px, $designWidth) * 100vw:计算元素宽度占设计稿宽度的比例,然后转换为视口宽度单位
    • math.div($px, $designHeight) * 100vh:计算元素高度占设计稿高度的比例,然后转换为视口高度单位

使用示例

.header {
  width: vw(1900); // 转换为约 98.96vw (1900/1920*100)
  height: vh(100); // 转换为约 9.26vh (100/1080*100)
  font-size: vh(40); // 转换为约 3.7vh
}

.content-box {
  margin: vh(5) 0;
  padding: vh(5) vw(5) vh(10) vw(5);
}

注意事项

  1. 极端比例屏幕(如超宽屏)可能需要额外媒体查询调整
  2. 字体大小使用视口单位可能导致可读性问题,需要谨慎使用
  3. 最小字体大小可能需要设置限制,防止在小屏幕上过小

这种方法是实现大屏自适应布局的高效方式,特别适合数据可视化类的大屏项目。

2. Flex 弹性布局

整体布局使用 Flexbox 实现:

<div class="full-screen">
  <div class="header">...</div>
  <div class="center">...</div>
  <div class="footer">...</div>
</div>
.full-screen {
  display: flex;
  flex-direction: column;
}

.center {
  display: flex;
  // flex-direction: column;
}

3. 图表自适应

ECharts 图表通过监听窗口 resize 事件实现自适应:

window.addEventListener('resize', () => {
  myChart.resize();
});

4. 全屏切换功能

使用 screenfull 库实现全屏切换:

let fullScreen = () => {
  if (screenfull.isEnabled) {
    screenfull.toggle();
  }
};

5. 缩放控制

通过监听滚轮事件实现页面缩放:

window.addEventListener('wheel', function(event) {
  if (event.ctrlKey || event.metaKey) {
    if (event.deltaY > 0) {
      document.body.style.zoom = (parseFloat(getComputedStyle(document.body).zoom) || 1) * 1.1;
    }
    if (event.deltaY < 0) {
      document.body.style.zoom = (parseFloat(getComputedStyle(document.body).zoom) || 1) / 1.1;
    }
  }
});

6. 栅格系统

使用 Element Plus 的栅格系统进行列布局:

<el-row class="header" :gutter="20">
  <el-col :span="7" class="header-time">...</el-col>
  <el-col :span="10" class="header-title">...</el-col>
  <el-col :span="6">...</el-col>
</el-row>

到此这篇关于VUE3大屏自适应布局的几种实现方式的文章就介绍到这了,更多相关VUE3大屏自适应布局内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue下拉菜单组件(含搜索)的实现代码

    vue下拉菜单组件(含搜索)的实现代码

    这篇文章主要介绍了vue下拉菜单组件(含搜索)的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • vue router返回到指定的路由的场景分析

    vue router返回到指定的路由的场景分析

    这篇文章主要介绍了vue router返回到指定的路由的场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • vue中 v-for循环的用法详解

    vue中 v-for循环的用法详解

    这篇文章主要介绍了vue中 v-for循环的用法详解,本文通过实例代码的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • vue跳转时根据url锚点(#xxx)实现页面内容定位的方法

    vue跳转时根据url锚点(#xxx)实现页面内容定位的方法

    本前端仔在做页面跳转的时候,被要求跳转到页面时候,把对应部分的内容自动滚动到顶部,我一开始想到的就是根据锚点<a href="#xxid">进行处理,但是发现不太好实现,于是便自己研究了一个比较取巧的方法,需要的朋友可以参考下
    2024-04-04
  • vue将html页面生成高清晰pdf文件的方法

    vue将html页面生成高清晰pdf文件的方法

    最近工作中遇到个需求,需要实现个可视化图表页的PDF文件导出,所以下面这篇文章主要给大家介绍了关于利用vue如何将html页面生成高清晰pdf文件的相关资料,需要的朋友可以参考下
    2022-03-03
  • react+vite动态导入报错@vite-ignore的问题及解决

    react+vite动态导入报错@vite-ignore的问题及解决

    这篇文章主要介绍了react+vite动态导入报错@vite-ignore的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Vue2 的12种组件通讯

    Vue2 的12种组件通讯

    之前文章我们描述给过Vue3 的七通信使用,今天中五篇文章我们再来看看Vue2 的通信使用写法的相关资料,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • Vue数字输入框组件示例代码详解

    Vue数字输入框组件示例代码详解

    很多朋友经常遇到这样的功能,只允许输入数字,允许设置初始值、最大值、最小值,今天小编给大家分享示例代码给大家介绍vue数字输入框功能,感兴趣的朋友一起看看吧
    2020-01-01
  • vue实现列表滑动下拉加载数据的方法

    vue实现列表滑动下拉加载数据的方法

    文章介绍了如何使用Vue实现列表滑动下拉加载数据的功能,通过监听滚动事件,检测用户是否滚动到底部,然后动态加载更多数据,附带了实现思路和案例代码,感兴趣的朋友一起看看吧
    2024-11-11
  • element-plus table合并列、合计行、表格填报添加验证的示例

    element-plus table合并列、合计行、表格填报添加验证的示例

    这篇文章主要介绍了element-plus table合并列、合计行、表格填报添加验证的示例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-06-06

最新评论