可视化大屏实现屏幕自适应和自动全屏的实现

news2024/11/18 19:33:16

前言

在可视化大屏项目中,屏幕适配是绕不过去的一个问题(ps:如果知道大屏展示的屏幕是固定的,当我没说)。这里简单介绍通过 css的transform属性 里面的 scal() 实现常规屏幕适配。

常规屏幕:
  • 1366 * 768
  • 1920 * 1080 (最常见的大屏分辨率)
  • 2560 * 1440 (2k)
  • 3840 * 2160 (4k)
  • 5120 * 2880 (5k)
其他场景屏幕:
  • 1280 * 800
  • 1440 * 900

一、自适应实现

1. 新增自适应组件
<template>
  <div class="screen-adapter">
    <div class="content-wrap" :style="style">
      <slot></slot>
    </div>
  </div>
</template>

<script>
export default {
  name: 'ScreenAdapter',
  props: {
    w: { // 设计图尺寸宽
      type: Number,
      default: 1920,
    },
    h: { // 设计图尺寸高
      type: Number,
      default: 1080,
    },
  },
  data() {
    return {
      style: {
        width: `${this.w}px`,
        height: `${this.h}px`,
        transform: 'scale(1) translate(-50%, -50%)', // 默认不缩放,垂直水平居中
      },
    };
  },
  mounted() {
    this.setScale();
    this.onresize = this.debounce(() => this.setScale(), 100);
    window.addEventListener('resize', this.onresize);
  },
  methods: {
    // 防抖
    debounce(fn, t) {
      const delay = t || 500;
      let timer;
      // eslint-disable-next-line func-names
      return function () {
        // eslint-disable-next-line prefer-rest-params
        const args = arguments;
        if (timer) {
          clearTimeout(timer);
        }
        const context = this;
        timer = setTimeout(() => {
          timer = null;
          fn.apply(context, args);
        }, delay);
      };
    },
    // 获取缩放比例
    getScale() {
      // console.log(window.innerHeight, window.innerWidth);
      const w = window.innerWidth / this.w;
      const h = window.innerHeight / this.h;
      return w < h ? w : h;
      // return {w, h};
    },
    // 设置缩放比例
    setScale() {
      this.style.transform = `scale(${this.getScale()}) translate(-50%, -50%)`;
    },
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.onresize);
  },
}
</script>

<style lang='scss' scoped>
.screen-adapter {
  width: 100vw;
  min-height: 100%;
  max-height: 100vh;
  overflow: hidden;
   // 添加一个背景色,在适配不成功(上下或者左右有空白时)这个背景色和大屏主题色相似,一定程度上看不出来;该方案只在适配要求不高(只做常规屏幕适配)情况下适用
  background: #071524;
  .content-wrap {
    transform-origin: 0 0;
    position: absolute;
    top: 50%;
    left: 50%;
  }
}
</style>
2. 使用自适应组件
<template>  
  <screen-adapter>
  	<!-- 大屏内容组件 -->
    <big-screecn-page></big-screecn-page>
  </screen-adapter>
</template>

<script>
import ScreenAdapter from '@/components/screenAdapter/index';
import BigScreecnPage from '@/views/bigScreen/index'

export default {
  name: 'Index',
  components: {
    ScreenAdapter,
    BigScreecnPage
  }
}

ps: 该方案只在适配要求不高(只做常规屏幕适配)情况下适用;在非常规屏幕下,可能在屏幕上下或者左右出现留白,在适配组件里加了一个大屏主题色相似的背景颜色,可以优化这一问题(混淆视听),哈哈哈

如果想要处理非常规屏幕的留白问题,可以参考:可视化大屏自适应方案

二、自动全屏实现

1. 使用screenfull插件 (推荐)

快速开始

使用方法
  1. 首先安装 npm install screenfull --save
  2. 在使用.vue文件中 引入 import screenfull from ‘screenfull’
  3. 在按钮方法中调用 screenfull.toggle()
  4. 还可以检测全屏状态 screenfull.isFullscreen
  5. 测试浏览器是否支持全screenfull screenfull.isEnabled
API (重点)
  • request(ele) 全屏
  • exit() 退出全屏
  • toggle() 切换全屏
  • on(event, function) : event为 ‘change’ | ‘error’ 注册事件
  • off(event, function) : 移除前面已经注册的事件
  • element: 返回一个全屏的dom节点,如果没有就为 null
  • isFullscreen : 是否是全屏状态
  • isEnabled : 判断是否支持全屏
使用注意事项
  1. requestFullscreen方法只能由用户触发。
  2. 页面跳转需先退出全屏
  3. 进入全屏的元素,将脱离其父元素,所以可能导致之前某些css的失效
  4. 解决方案:使用 :full-screen伪类 为元素添加全屏时的样式(使用时为了兼容注意添加-webkit、-moz或-ms前缀)
    我这里是使用原生的方法修改了css
    5.一个元素A全屏后,其子元素要再全屏,需先让元素A退出全屏
使用时出现编译错误

提示:在vue项目中导入screenfull插件,出现编译错误,错误如图所示:
在这里插入图片描述
这是因为安装的screenfull插件版本过高, 降低插件版本即可:npm install screenfull@4.2.0 --save

参考文章:https://blog.csdn.net/weixin_45665171/article/details/129799619

具体使用实例:
// 一些代码实在vue3中编写
import screenfull from 'screenfull';

onMounted(() => { 
  setTimeout(() => {
    const thisPageEl = document.querySelector('.big-screen-page-box');
    thisPageEl && screenfull.request(thisPageEl);
  }, 50);
});
onUnmounted(() => {
   screenfull.exit();
 });

 
 
文章仅为本人学习过程的一个记录,仅供参考,如有问题,欢迎指出

对博客文章的引用,若原文章博主介意,请联系删除!请原谅

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

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

相关文章

【学习心得】爬虫JS逆向通解思路

我希望能总结一个涵盖大部分爬虫逆向问题的固定思路&#xff0c;在这个思路框架下可以很高效的进行逆向爬虫开发。目前我仍在总结中&#xff0c;下面的通解思路尚不完善&#xff0c;还望各位读者见谅。 一、第一步&#xff1a;明确反爬手段 反爬手段可以分为几个大类 &#…

Tabby-全网最详细讲解

1.Tabby简介 Tabby是一个无限可定制的跨平台终端应用程序&#xff0c;适用于local shells、serial、SSH和Telnet的连接。 Tabby是基于TypeScript开发的终端模拟器&#xff0c;可用于Linux、Windows和Mac OS系统。 Tabby (前身是 Terminus) 是一个可高度配置的终端模拟器和 SSH …

如何使用支付宝沙箱环境本地配置模拟支付并实现公网远程访问【内网穿透】

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 前言 在沙箱环境调试支付SDK的时候&#xff0c;往往沙箱环境部署在本地&#xff0c;局限性大&#xff0c;在沙箱环境…

青少年软件编程(Python)等级考试试卷(一级)2020年3月

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;一级&#xff09;2020年3月 第 1 题 【单选题】 运行下方代码段&#xff0c;输出的是( )。 print("a"*3) A :a3 B :3a C :a a a D :aaa 正确答案:D 试题解析 第 2 题 【单选题】 下…

MySQL基础-----SQL语句之DDL数据定义语句

目录 前言 开启登录数据库 一、数据库操作 1.查询所有数据库 2.切换使用数据库 3.查询当前使用的数据库 4.创建数据库 创建一个hello数据库, 使用数据库默认的字符集。 创建一个itheima数据库&#xff0c;并且指定字符集 5.删除数据库 二、表操作 1.查询当前数据库所有…

深入理解C语言:开发属于你的三子棋小游戏

三子棋 1. 前言2. 准备工作3. 使用二维数组存储下棋的数据4. 初始化棋盘为全空格5. 打印棋盘6. 玩家下棋7. 电脑下棋8. 判断输赢9. 效果展示10. 完整代码 1. 前言 大家好&#xff0c;我是努力学习游泳的鱼&#xff0c;今天我们会用C语言实现三子棋。所谓三子棋&#xff0c;就是…

Progressive Widening

下面的解释来源于论文《Monte Carlo Tree Search With Iteratively Refining State Abstractions》&#xff0c;因为这篇论文的重点不是Progressive Widening&#xff0c;所以就不全文学习了&#xff0c;只摘抄其中关于Progressive Widening的部分。 Progressive Widening&…

shell文本处理工具-shell三剑客1

shell脚本常用基础命令2 shell脚本常用基础命令 shell脚本常用基础命令2一、grep用法二、sed用法2.1p参数 &#xff08;显示&#xff09;n参数&#xff08;只显示处理过的行&#xff09; 文本处理三剑客&#xff1a;grep sed awk 一、grep用法 grep -E egrep (扩展搜索正文表…

【C/C++随笔】static 的用法和作用

「前言」所有文章已经分类好&#xff0c;放心食用 「归属专栏」C语言 | C嘎嘎 「主页链接」个人主页 「笔者」枫叶先生(fy) static 的用法和作用&#xff1f;&#xff1f;&#xff1f; static作用&#xff1a; 作用1修改存储方式&#xff1a;用 static 修饰的变量存储在静态区…

牛客练习赛122

D:圆 正着求删除的最小代价不好做&#xff0c;采用逆向思维&#xff0c;求选择一些不相交的线段使得构成一个圆的代价尽量大&#xff0c;最后答案就是所有线段权值之和减去最大代价。 那么如何求这个最大代价呢&#xff1f;显然区间DP 老套路&#xff1a;破环成链&#xff0…

一文读懂DDoS,分享防御DDoS攻击的几大有效方法

DDoS攻击是目前最常见的网络攻击方式之一。其见效快、成本低的特点&#xff0c;使它深受不法分子的喜爱。每39秒就会发生一次新的网络攻击&#xff0c;全球每天大约发生23000次DDoS攻击。对于未受保护的企业来说&#xff0c;每次DDoS攻击的平均成本为20万美元。可见部署DDoS防御…

LabVIEW齿轮传动健康状态静电在线监测

LabVIEW齿轮传动健康状态静电在线监测 随着工业自动化的不断发展&#xff0c;齿轮传动作为最常见的机械传动方式之一&#xff0c;在各种机械设备中发挥着至关重要的作用。然而&#xff0c;齿轮在长期运行过程中易受到磨损、变形等因素影响&#xff0c;进而影响整个机械系统的稳…

二维码门楼牌管理系统技术服务:门牌编设规则详解

文章目录 前言一、门牌编设规则解读二、区间编号与分段编号策略三、多出入口建筑物的门牌编设 前言 随着城市化的快速推进&#xff0c;门楼牌管理成为城市管理中不可或缺的一环。二维码门楼牌管理系统的引入&#xff0c;不仅提升了管理的效率&#xff0c;也为市民提供了更为便…

poi-tl表格行循环(自定义复杂表头)

输入模板 注:集合使用{{xx}}进行标识(在其需要循环的上一行进行标识),[xx]中的内容表示集合中对象属性 public static void main(String[] args) throws IOException {Map<String, Object> map new HashMap<>();LoopRowTableRenderPolicy policy new LoopRowTab…

FPGA高端项目:FPGA基于GS2971的SDI视频接收+图像缩放,提供3套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收HLS动态字符叠加输出应用本方案的SDI接收HLS多路视频…

【Web - 框架 - Vue】随笔 - 通过CDN的方式使用VUE 2.0和Element UI

通过CDN的方式使用VUE 2.0和Element UI - 快速上手 VUE 网址 https://cdn.bootcdn.net/ajax/libs/vue/2.7.16/vue.js源码 https://download.csdn.net/download/HIGK_365/88815507测试 代码 <!DOCTYPE html> <html lang"en"> <head><meta …

【论文阅读-PRIVGUARD】Day4:3节

3 PRIVANALYZER&#xff1a;强制执行隐私政策的静态分析 本节介绍PRIVANALYZER&#xff0c;这是一个用于强制执行由PRIVGUARD追踪的隐私政策的静态分析器**。我们首先回顾LEGALEASE政策语言&#xff0c;我们使用它来正式编码政策&#xff0c;然后描述如何静态地强制执行它们**…

【24最新版PythonPycharm安装教程】小白保姆级别安装教程

今天&#xff0c;我就来教大家一下&#xff0c;如何去安装Python&#xff01; 需要博主打包好的一键激活版Pycharm&&Python也可扫下方直接获取 ​ 1 了解Python Python是一种面向对象的解释型计算机程序设计语言&#xff0c;由荷兰人Guido van Rossum于1989年发明&…

调试工具vue,react,redux

React Developer Tools Redux DevTools Vue devtools 使用浏览器官方组件扩展搜索安装

阿克曼转向车型导航末段位姿调整控制

1目标 分析RPP算法时控制器算法学习1-RPP受控纯追踪算法发现,在终点时如果角度还有较大偏差,该算法无法进行很好的调整,故开始尝试在末端接近目标点时,用自己的控制算法去调整位姿,姑且命名为TEA算法(Target-End-Adjust Algorithm for Ackermann) 2控制思路 step1. 将…