仲灏小栈 仲灏小栈
首页
大前端
后端&运维
其他技术
生活
关于我
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

仲灏

诚意, 正心, 格物, 致知
首页
大前端
后端&运维
其他技术
生活
关于我
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 《前端项目基础建设》
  • HTML&CSS

  • JavaScript&TypeScript

  • Node

  • 构建

  • Vue

    • 持久化存储实时读取
    • vue自适应布局
    • Vue 中后台表格的增删改查统一解决方案(mixin版)
    • Vue 中后台表格的增删改查同一解决方案(组件封装版)
    • Vue Render自定义table单元格内容
    • 项目初始化编码规范(eslint,prettier等)
    • vue element-ui 换肤功能开发
    • vue element 定义多种主题实现换肤
    • 大屏自适应容器
    • el-upload 自定义上传进度
    • vue3初学注意点
    • vue3 hooks 自适应可视化大屏
      • 思路
      • 开始
        • 有什么
        • 做什么
        • 定义hooks
        • 使用
    • vue3 element-plus ant- design 自定义主题
    • 博客开发
    • vue2中使用jsx
    • Vue 放弃繁琐的render函数,拥抱JSX
    • 组件设计步骤
    • 倒计时验证
    • Vue中computed和watch的区别
    • vue3面试聚焦
    • Vue3 原理 Proxy实现响应式
  • React

  • 小程序

  • 跨端

  • Electron

  • WebGL&GIS

  • 浏览器

  • 面经

  • 其他

  • 大前端
  • Vue
仲灏
2022-01-20
目录

vue3 hooks 自适应可视化大屏

# 思路

自适应方案:

  • rem 自适应
    • 根据设计图尺寸宽度与设计度元素大小的比例,结合实际屏幕宽度计算出实际元素大小,在与html的fant-size做比例换算得出**rem值
  • scale 自适应缩放
    • 下面就是使用的此种方式

# 开始

# 有什么

现有设计图 1920*1294

image-20220120141614540

# 做什么

自适应

# 定义hooks

hooks/useGetScale.ts

最开始之前是根绝屏幕整个宽度改变去做的计算,因涉及到不改变屏幕宽度里面的内容尺寸也会发生变化的情况,如抽屉的展开收缩会引起内容的的宽度变化,后面就做了改变, 对父容器的宽度变化进行了监听达到计算缩放比例。

以下注释的代码是前一版本的

/*
 * @Author: 仲灏<izhaong@outlook.com>🌶🌶🌶
 * @Date: 2022-01-16 17:04:57
 * @LastEditTime: 2022-01-17 16:36:07
 * @LastEditors: 仲灏<izhaong@outlook.com>🌶🌶🌶
 * @Description:
 * @FilePath: /***/hooks/useGetScale.ts
 */

import { ref, Ref, isRef, onMounted, nextTick } from "vue";
// import { useDebounce } from "@/utils/utils";
type Target = HTMLElement | Ref<HTMLElement> | (() => HTMLElement);

// uiWidth 为设计图宽度尺寸
const useGetScale = (containerDom: Target, uiWidth = 1920): Ref => {
  let el: HTMLElement;
  const scale = ref(1);
  const getEl = () => {
    if (typeof containerDom === "function") {
      return containerDom();
    }
    return isRef(containerDom) ? containerDom.value : containerDom;
  };

  // const resizeHandle = () => {
  //   el = getEl();
  //   scale.value = el.offsetWidth / uiWidth;
  // };

  onMounted(() => {
    // nextTick(() => {
    //   resizeHandle();
    // });
    // window.addEventListener("resize", useDebounce(resizeHandle, 200, { trailing: true }));

    nextTick(() => {
      el = getEl();
      const ro = new ResizeObserver(() => {
        scale.value = el.offsetWidth / uiWidth;
      });
      ro.observe(el);
    });
  });
  // onUnmounted(() => {
  //   window.removeEventListener("resize", resizeHandle);
  // });

  return scale;
};

export default useGetScale;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

# 使用

使用就很简单了

里面界面样式就跟设计图一样 是多少px 就是多少px

<template>
  <div class="mid_hull" ref="ovAnaRef">
    <div class="overview-analysis_container relative" :style="{ transform: `scale(${scale})` }" v-loading="loading" element-loading-background="rgba(0, 0, 0, 0.3)">
      <left-area></left-area>
      <middle-area></middle-area>
      <right-area></right-area>
      <fold-button></fold-button>
    </div>
  </div>
</template>

<script lang="ts">
import { defineComponent, ref } from "vue";
import useGetScale from "../hooks/useGetScale";
...
export default defineComponent({
  name: "...",
  setup() {
    const ovAnaRef = ref();
    const scale = useGetScale(ovAnaRef);
    return {
      ovAnaRef,
      ...
      scale
    };
  }
})
</script>
<style lang="less" scoped>
.mid_hull {
  width: 100%;
  overflow-x: hidden;
  .overview-analysis_container {
    transform-origin: 0 0; // 这个很重要 缩放变形位置定在起始点
    position: relative;
    width: 1920px;
    height: 1294px;
    background-image: url(***/bg-v2.png);
    background-size: 100% 100%;
    background-repeat: no-repeat;
    background-position: center;
    overflow: hidden;
  }
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
上次更新: 2022/06/05, 20:31:36
vue3初学注意点
vue3 element-plus ant- design 自定义主题

← vue3初学注意点 vue3 element-plus ant- design 自定义主题→

最近更新
01
vim日常使用记录
04-02
02
滑动窗口最大值
04-02
03
有效的字母异位词
04-02
更多文章>
Theme by Vdoing | Copyright © 2021-2025 izhaong | github | 蜀ICP备2021031194号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式