大屏可视化适配方案

news2024/11/23 17:18:46

大屏适配方案

  • 方案一:rem 单位 + 动态设置 html 的 font-size;
  • 方案二:vw 单位;
  • 方案三:scale 等比例缩放

对比

方案一

        核心思想:动态调整 HTML 根字体大小和 body 字体大小,结合百分比或vw/vh单位,实现容器宽高、字体大小、位移的动态适配。
        优点:基于比例缩放,能够灵活适应不同分辨率和屏幕尺寸。
        缺点:需要额外的计算和处理,可能增加开发复杂度。

方案二

        核心思想:通过将像素值(px)转换为视口宽度(vw)和视口高度(vh)来适配不同尺寸的屏幕,实时计算图表尺寸、字体大小等。
        优点:实时自适应不同屏幕大小,适合全屏应用。
        缺点:在极端分辨率下可能出现不可预期的布局问题。

方案三

        核心思想:根据屏幕宽高比例动态缩放,代码简洁,几行代码即可实现适配。
        优点:实现简单,特别适合基本的大屏展示场景。
        缺点:在地图、Canvas 等带有交互的组件中,可能会出现点击事件错位问题,需针对性调整。

方案1 – rem

  • 动态设置HTML根字体大小 和 body 字体大小(lib_flexible.js)
    • 将设计稿的宽(1920)平均分成 24 等份, 每一份为 80px。
    • HTML字体大小就设置为 80 px,即1rem = 80px, 24rem = 1920px
    • body字体大小设置为 16px。
    • 安装 cssrem 插件, root font size 设置为 80px。

      image.png

      image.png

    • 这个是px单位转rem的参考值 px 转 rem方式:手动 less/scss函数cssrem插件webpack插件、Vite插件
    • image.png

    • 接着就可以按照 1920px * 1080px 的设计稿愉快开发,此时的页面已经是响应式,并且宽高比不变

      image.png

lib_flexible.js 

(function flexible (window, document) {
  var docEl = document.documentElement
  var dpr = window.devicePixelRatio || 1
 
  // adjust body font size
  function setBodyFontSize () {
    if (document.body) {
      document.body.style.fontSize = (16 * dpr) + 'px'
    }
    else {
      document.addEventListener('DOMContentLoaded', setBodyFontSize)
    }
  }
  setBodyFontSize();
 
  // set 1rem = viewWidth / 10
  function setRemUnit () {
    var rem = docEl.clientWidth / 24
    docEl.style.fontSize = rem + 'px'
  }
 
  setRemUnit()
 
  // reset rem unit on page resize
  window.addEventListener('resize', setRemUnit)
  window.addEventListener('pageshow', function (e) {
    if (e.persisted) {
      setRemUnit()
    }
  })
 
  // detect 0.5px supports
  if (dpr >= 2) {
    var fakeBody = document.createElement('body')
    var testElement = document.createElement('div')
    testElement.style.border = '.5px solid transparent'
    fakeBody.appendChild(testElement)
    docEl.appendChild(fakeBody)
    if (testElement.offsetHeight === 1) {
      docEl.classList.add('hairlines')
    }
    docEl.removeChild(fakeBody)
  }
}(window, document))

方案1 - rem

上面的方法是将页面等分并设置 1rem = 80px

这个方案约定:将1920的基准字体大小设置为 14px,遇到其他尺寸自动按照与1920的比例对基准字体大小进行调整;并对 Echarts 进行处理;

useScreenAdapt.js

const FONT_SIZE = 14; // 基准字体大小

/**
 * 计算相对的像素值
 * @param {Number} size 像素值
 * @returns {Number}
 */
export function transform(size) {
  try {
    const htmlSize = document.documentElement.style.fontSize.match(/\d+/)[0] || FONT_SIZE;
    return (size * htmlSize) / FONT_SIZE;
  } catch (error) {
    return size;
  }
}

/**
 * 屏幕适配 hook
 */
export function useScreenAdapt() {
  onMounted(() => {
    let htmlContent = document.documentElement;

    htmlContent.style.fontSize = `${(window.innerWidth / 1920) * FONT_SIZE}px`;

    window.addEventListener("resize", () => {
      htmlContent.style.fontSize = `${(window.innerWidth / 1920) * FONT_SIZE}px`;
    });
  });
}

大屏页面 index.vue

<!-- 大屏 -->
<template>
  <div class="container">
    <headerDate />
    <leftPanel />
    <Map />
    <rightPanel />
  </div>
</template>
<script setup>
import leftPanel from "./components/leftPanel/index.vue";
import Map from "./components/jinjitan/index.vue";
import rightPanel from "./components/rightPanel/index.vue";
import headerDate from "./components/header/index.vue";
import { useScreenAdapt } from "./hooks/useScreenAdapt";

useScreenAdapt();
</script>
<style lang="scss" scoped>
.container {
  width: 100vw;
  height: 100vh;
  background: #333;
  position: relative;
}
</style>

样式使用 rem

 

对于 Echarts ,使用 transform 方法设置字体大小

参数:传入在1980屏幕下对应的字号大小

方案2 - vw

  • 屏幕的宽默认为 100vw,那么100vw = 1920px, 1vw = 19.2px 。
  • 安装 cssrem 插件, body的宽高(1920px * 1080px)直接把px单位转vw单位

    image.png

    • px 转 vw 方式:手动、less/scss函数、cssrem插件、webpack插件、Vite插件
  • 接着就可以按照 1920px * 1080px 的设计稿愉快开发,此时的页面已经是响应式,并宽高比不变。

    image.png

方案3 - scale

使用CSS3中的scale函数来缩放网页,这里我们将使用两种方案来实现:

  • 方案一:直接根据宽度的比率进行缩放。(宽度比率=网页当前宽 / 设计稿宽)
  • 方案二:动态计算网页宽高比,决定是是否按照宽度的比率进行缩放。
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    body, ul{
      margin: 0;
      padding: 0;
    }
    body{
      width: 1920px;
      height: 1080px;
      box-sizing: border-box;
      border: 3px solid red;

      /* 指定缩放的原点在左上角 */
      transform-origin: left top;
    }

    ul{
      width: 100%;
      height: 100%;
      list-style: none;

      display: flex;
      flex-direction: row;
      flex-wrap: wrap;
    }

    li{
      width: 33.333%;
      height: 50%;
      box-sizing: border-box;
      border: 2px solid green;
      font-size: 30px;
    }
  </style>
</head>
<body>

  <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
  </ul>

  <script>
    // 设计稿:  1920 * 1080
    // 目标适配:  1920 * 1080   3840 * 2160 ( 2 * 2 ) ;  7680 * 2160( 4 * 2)

    // 1.设计稿的尺寸
    let targetX = 1920

    // 2.拿到当前设备(浏览器)的宽度
    let currentX = document.documentElement.clientWidth || document.body.clientWidth
    //  1920 * 1080  -> 3840 * 2160

    // 3.计算缩放比例
    let scaleRatio = currentX / targetX; // 参照宽度进行缩放

    // 4.开始缩放网页
    document.body.style = `transform: scale(${scaleRatio})`
  </script>
</body>
</html>

完美适配 3840 * 2160

image.png

此时有个问题出现了

  • 在7680*2160的屏幕下,出现了超出屏幕高度,出现了滚动条

    image.png

  • 为什么会出现这个问题
    • 因为我们使用scale进行缩放的时候 放大了四倍 1920x4= 7680 1080 x 4= 4320
    • 这个时候很明显1080高度无法放下4320高度所以出现了滚动条
  • 如何解决
    • 这个时候我们不能参照宽度进行缩放( 默认情况 )
    • 需要判断如果视口宽高比大于设计稿宽高比就参照高度进行缩放
    • 比如 3840 / 2160 > 1920 / 1080 就按照参照高度进行缩放 -js代码更改
  // 设计稿:  1920 * 1080
      // 目标适配:  1920 * 1080   3840 * 2160 ( 2 * 2 ) ;  7680 * 2160( 4 * 2)

      // 1.设计稿的尺寸
      let targetX = 1920;
      let targetY = 1080;
      let oldRatio = targetX / targetY;


      // 2.拿到当前设备(浏览器)的宽度
      let currentX =
        document.documentElement.clientWidth || document.body.clientWidth;
      let currentY =
        document.documentElement.clientHeight || document.body.clientHeight;
      //  1920 * 1080  -> 3840 * 2160

      // 3.计算缩放比例
      let scaleRatio = currentX / targetX; // 参照宽度进行缩放 ( 默认情况 )
      let currentRatio = currentX / currentY; // 宽高比率

      // 超宽屏
      if (currentRatio > oldRatio) {
        scaleRatio = currentY / targetY; // 参照高度进行缩放
        document.body.style = `width:${targetX}px; height:${targetY}px;transform: scale(${scaleRatio}) translateX(-50%); left: 50%`;
      } else {
        // 4.开始缩放网页
        document.body.style = `width:${targetX}px; height:${targetY}px; transform:           scale(${s  caleRatio})`;
      }

https://juejin.cn/post/7254200330493444151

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2140932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

配置cobbler服务提供centos7安装源

cobbler服务和pxe服务的作用类似但是从安装部署角度来说比pxe简单得多。 cobbler可以用来快速建立Linux网络安装环境&#xff0c;大幅度降低了Linux网络安装的技术门槛。 一.cobbler介绍 由RedHat公司基于python语言开发&#xff0c; 作用&#xff1a;快速批量部署Linux系统…

艾里斑(Airy Disk)与瑞利判据(Rayleigh criterion)

艾里斑的定义与形成 艾里斑&#xff08;Airy Disk&#xff09;&#xff0c;又称艾里图样&#xff08;Airy Pattern&#xff09;&#xff0c;是光通过圆形孔径发生衍射时&#xff0c;在焦点处形成的光斑。这一现象由英国数学家和天文学家George Biddell Airy在19世纪首次详细描…

面试官问:你在团队中的角色是什么?

面试官问你在团队中的角色是什么&#xff0c;其目的是了解你如何在团队环境中工作&#xff0c;以及你如何看待自己在团队中的定位。他们希望听到你如何与他人协作、你的领导能力或团队合作精神&#xff0c;以及你是否能适应不同的团队角色。 回答这类问题时&#xff0c;你可以…

shiro漏洞复现

目录 shiro介绍框架介绍判断是否使用shiro框架 环境搭建CVE-2010-3863漏洞原理影响版本漏洞复现 CVE-2016-4437漏洞原理影响版本漏洞复现 CVE-2020-1957漏洞原理影响版本漏洞复现 shiro-721拉取环境漏洞原理漏洞复现 shiro介绍 框架介绍 Apache Shiro提供了认证、授权、加密和…

关于手机号码数理的计算和推导,获得“平替”尾号

文章背景&#xff1a;我个人比较相信命运&#xff0c;对于手机号码的吉凶或是数理颇为在乎。最近&#xff0c;我沉浸于这方面的研究中&#xff0c;并发现许多手机号码的数理核心竟出奇地一致——关键在于后四位尾号&#xff0c;而前面的数字似乎并不占据主导位置。然而&#xf…

电气自动化入门01:电工基础

视频链接&#xff1a;1.1 电工知识&#xff1a;电工基础_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW?p2&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.电能和电力系统 2.电工常用物理量及其应用 2.1电阻&#xff1a; 2.2电流&#xff1a; 2.3电压&…

队列-------

队列总览 队列的定义 队列的基本操作 队列回顾 顺序队列总览 队列的顺序实现 队列的初始化 入队操作&#xff0c;rear&#xff0c;后面的&#xff0c;下一个队列元素要插入的位置。front&#xff0c;前面的&#xff0c;当前队列的第一个元素。 循环队列入队操作 循环…

建设世界一流财务管理体系【数字化顶层设计】【持续更新】

财务管理是企业管理的中心环节&#xff0c;是企业实现基业长青的重要基础和保障。近年来&#xff0c;中央企业认真贯彻落实党中央、国务院决策部署&#xff0c;高度重视财务管理工作&#xff0c;持续优化管理手段&#xff0c;不断创新管理模式&#xff0c;积极应用先进管理工具…

photozoom pro 9如何激活解锁 2024最新激活解锁代码

您好,现在程程来为大家解答以上的问题。photozoom pro 9解锁代码&#xff0c;photozoom pro 9解锁代码相信很多小伙伴还不知道,现在让我们一起来看... 您好,现在程程来为大家解答以上的问题。photozoom pro 9解锁代码&#xff0c;photozoom pro 9解锁代码相信很多小伙伴还不知道…

新160个crackme - 057-bbbs-crackme04

运行分析 因软件版本老旧&#xff0c;需使用windows XP虚拟机运行有个SystemID&#xff0c;值为12345678需破解User ID和Password PE分析 yC壳&#xff0c;32位 OD手动脱壳 使用windows XP虚拟机&#xff0c;将程序拖入OD按一下F8&#xff0c;ESP变红&#xff0c;根据ESP定律设…

【网络原理】Tcp 常用提升效率机制——滑动窗口,快速重传,流量控制, 拥塞控制, 建议收藏 !!!

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

2024永久激活版 Studio One 6 Pro for mac 音乐创作编辑软件 完美兼容

Studio One 6是一款功能强大的音乐制作软件&#xff0c;由PreSonus公司开发。它提供了全面的音频录制、编辑、混音和母带处理工具&#xff0c;适用于音乐制作人、音频工程师和创作人员。 Studio One 6拥有直观的用户界面&#xff0c;使用户能够快速而流畅地进行音乐创作。它采…

MOE论文汇总

最近对MOE感兴趣&#xff0c;现汇总MOE无监督相关的文章&#xff0c;文章均为略读 文章 Self-Supervised Mixture-of-Experts by Uncertainty estimation 发表于:AAAI19 流程: 总体来说&#xff0c;当环境给出反馈&#xff0c;通过门控网络激活相应的专家去交涉。但是&…

LabVIEW减速机加载控制系统

为了保障减速机的产品质量&#xff0c;开发了一套基于LabVIEW的减速机加载控制系统。该系统利用先进的传感技术与自动化控制理念&#xff0c;实现了减速机性能的全面测试与分析&#xff0c;有效提升了生产线的自动化水平与检测效率。 项目背景 随着工业自动化水平的不断提高&a…

面试官问:请描述一次你成功解决问题的经历?

面试官为什么要这么问&#xff1f; 面试官问你描述一次成功解决问题的经历&#xff0c;主要是为了评估你的几个关键方面&#xff1a; 问题解决能力&#xff1a;了解你在面对挑战时的思维方式和应对策略。 决策能力&#xff1a;考察你在压力下做出明智决定的能力。 沟通技巧&am…

Linux实操笔记2 Ubuntu安装Nginx的不同方法

今天来了解Ubuntu或者说Linux系统安装Nginx的几种办法。包括从Ubuntu的库安装到官方源码编译安装。 一、Nginx是什么&#xff1f; 以下是来自Nginx中文文档的内容。 Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: 作为 Web 服务器&#xff1a;相比…

Matlab生成prbs7的代码

最近的一个客户需求&#xff0c;客户想看一下我们的产品产生的prbs并进行一些分析。 我在“”豆包“”这里找到了一个pbs的matlab的生成程序&#xff0c;效果就是连续生成prbs7&#xff0c;然后每次都在原来的基础之上添加。 生成的matlab的PRBS7代码修改如下&#xff1a; %…

深入了解字符函数和字符串函数

前言&#xff1a;今天给大家深入理解一下字符函数 和 字符串函数。通过使用 和 模拟实现 带大家加深理解&#xff0c;让大家灵活使用。 字符函数 在C语言中&#xff0c;有一系列函数是专门做字符分类的&#xff0c;也就是一个字符属于什么类型的字符。 这些函数的使用都要包含…

Redis embstr 编码

embstr 编码 是 Redis 中一种优化存储小型字符串的编码方式。它是 Redis 内部存储字符串的多种方式之一&#xff0c;特别适用于存储长度不超过 44 字节的小字符串。

java中Class文件的文件格式

无关性的基石 计算机底层只能识别二进制&#xff0c;由CPU直接处理二进制&#xff0c;在底层上面是操作系统&#xff0c;在操作系统上面就是虚拟机&#xff0c;java有一个口号&#xff0c;“一次编写&#xff0c;到处运行”这个不太可能在操作系统层面上实现&#xff0c;不同的…