vue3大屏实现;使用使用CSS Grid实现大屏

文章目录

  • 一、效果
    • 1.效果
    • 2.使用CSS Grid
    • 3.插件
    • 4.html代码
    • 5.index.scss代码

一、效果

1.效果

  • 方案:采用CSS的Grid布局,实现首页大屏模块划分和自适应功能;

  • 布局: 大屏主要内容,高宽比是1920*1080;即16:9的宽高比按照该比例,自适应放大缩小;直至放大到高度撑满或者宽度先撑满为止;未撑满的那一方直接留下黑色背影即可。

  • 全屏功能 :代码里自带逻辑

  • 优点: 该方案可以保证大屏的页面比列协调,不会变成扁平或者瘦高。

  • 大屏布局
    这里是引用

2.使用CSS Grid

CSS Grid Generator工具

使用
在这里插入图片描述

3.插件

使用element-resize-detector监听尺寸变化

"element-resize-detector": "^1.2.4",

4.html代码

<template>
  <div ref="digitalEvaluationContent"
    :class="['page-view', 'digital-evaluation-content', fullScreen ? 'full-screen' : '']">
    <div ref="digitalEvaluation" class="digital-evaluation">
      <div class="parent">
        <div class="div1">
          <div class="title_name">div1系统名称XXXXX</div>
          <div class="time_box">
            <span>
              <el-icon :size="16" class="el-icon-class">
                <Calendar />
              </el-icon>
              <span style="display: inline-block; width: 170px;">{{currentDateTime}}</span>
            </span>

            <span class="ml cursor" style="color: blue;" @click="fullScreenFun">
              <el-icon :size="16" class="el-icon-class">
                <FullScreen />
              </el-icon>
              {{ fullScreen ? '退出' : '' }}全屏
            </span>

          </div>
        </div>
        <div class="div2">
          div2
        </div>
        <div class="div3">
          div3:css等设置依旧生效-这里有个 margin-bottom: 60px;
          <div>1</div>
        </div>
        <div class="div4">
          div4
        </div>
        <div class="div5">
          div5
        </div>
        <div class="div6">
          div6-依旧可以设置高度 height: 100px
        </div>
        <div class="div7">
          div7
        </div>
        <div class="div8">
          div8是自定义的一个div
        </div>
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref, unref, onMounted, onBeforeUnmount, onUnmounted } from 'vue'
import { Calendar, FullScreen, } from '@element-plus/icons-vue'
import elementResizeDetectorMaker from 'element-resize-detector'

const digitalEvaluationContent = ref(null)
const digitalEvaluation = ref(null)
let currentDateTime = ref('')
const fullScreen = ref(false)

const formatDateTime = (dateTime) => {
  const year = dateTime.getFullYear();
  const month = ('0' + (dateTime.getMonth() + 1)).slice(-2);
  const date = ('0' + dateTime.getDate()).slice(-2);
  const hours = ('0' + dateTime.getHours()).slice(-2);
  const minutes = ('0' + dateTime.getMinutes()).slice(-2);
  const seconds = ('0' + dateTime.getSeconds()).slice(-2);
  return `${year}年${month}月${date}日 ${hours}:${minutes}:${seconds}`
}

// 自适应
function resizeContent() {
  const erd = elementResizeDetectorMaker()
  erd.listenTo(unref(digitalEvaluationContent), () => {
    // * 默认缩放值
    const scale = {
      width: '1',
      height: '1'
    }

    // * 设计稿尺寸(px)
    const baseWidth = 1920
    const baseHeight = 1080

    // * 需保持的比例(默认16:9)
    const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))

    const box = unref(digitalEvaluationContent)

    const appRef = unref(digitalEvaluation)
    if (!appRef) return
    // 当前宽高比
    const currentRate = parseFloat((box.clientWidth / box.clientHeight).toFixed(5))
    if (appRef) {
      if (currentRate > baseProportion) {
        // 表示更宽
        scale.width = ((box.clientHeight * baseProportion) / baseWidth).toFixed(5)
        scale.height = (box.clientHeight / baseHeight).toFixed(5)
      } else {
        // 表示更高
        scale.height = (box.clientWidth / baseProportion / baseHeight).toFixed(5)
        scale.width = (box.clientWidth / baseWidth).toFixed(5)
      }
      appRef.style.transform = `scale(${scale.width}, ${scale.height})`
    }
  })
}

// 全屏
function fullScreenFun() {
  fullScreen.value = !fullScreen.value
  if (fullScreen.value) {
    if (document.documentElement.RequestFullScreen) {
      document.documentElement.RequestFullScreen()
    }
    // 兼容火狐
    // console.log(document.documentElement.mozRequestFullScreen)
    if (document.documentElement.mozRequestFullScreen) {
      document.documentElement.mozRequestFullScreen()
    }
    // 兼容谷歌等可以webkitRequestFullScreen也可以webkitRequestFullscreen
    if (document.documentElement.webkitRequestFullScreen) {
      document.documentElement.webkitRequestFullScreen()
    }
    // 兼容IE,只能写msRequestFullscreen
    if (document.documentElement.msRequestFullscreen) {
      document.documentElement.msRequestFullscreen()
    }
  } else {
    if (document.exitFullScreen) {
      document.exitFullscreen()
    }
    // 兼容火狐
    // console.log(document.mozExitFullScreen)
    if (document.mozCancelFullScreen) {
      document.mozCancelFullScreen()
    }
    // 兼容谷歌等
    if (document.webkitExitFullscreen) {
      document.webkitExitFullscreen()
    }
    // 兼容IE
    if (document.msExitFullscreen) {
      document.msExitFullscreen()
    }
  }
}

// 监听尺寸变化
const listenResize = () => {
  if (!checkFull()) {
    fullScreen.value = false
    // console.log('退出全屏');
  }
};

// 判断全屏
const checkFull = () => {
  //判断浏览器是否处于全屏状态 (需要考虑兼容问题)
  let isFull =
    //火狐浏览器
    document.mozFullScreen ||
    document.fullScreen ||
    //谷歌浏览器及Webkit内核浏览器
    document.webkitIsFullScreen ||
    document.webkitRequestFullScreen ||
    document.mozRequestFullScreen ||
    document.msFullscreenEnabled;
  if (isFull === undefined) {
    isFull = false;
  }
  return isFull;
};

// 五分钟轮询
let timer = ref(undefined) // 计时器

// 系统标题
const systemName = ref("")
onMounted(() => {
  window.addEventListener("resize", listenResize);
  systemName.value = localStorage.getItem("systemName") || "调度网络综合网管"
  currentDateTime.value = formatDateTime(new Date())
  setInterval(() => {
    currentDateTime.value = formatDateTime(new Date())
  }, 1000);
  resizeContent()
})

onBeforeUnmount(() => {
  // 清除定时器
  clearInterval(timer.value)
});

onUnmounted(() => {
  window.removeEventListener("resize", listenResize);
})
</script>
<style lang="scss" scoped src="./index.scss"></style>

5.index.scss代码

.pall {
  padding: 16px 16px;
}

.pr {
  padding-right: 16px;
}

.pl {
  padding-left: 16px;
}

.pt {
  padding-top: 12px;
}

.pb {
  padding-bottom: 12px;
}

.mr {
  margin-right: 16px;
}

.ml {
  margin-left: 16px;
}

.mt {
  margin-top: 12px;
}

.mb {
  margin-bottom: 12px;
}

.m0 {
  margin: 0;
}
.page-view {
  height: 100%;
  width: 100%;
}

:deep .loading-container {
  background: none;
}

.full-screen {
  position: fixed !important;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 9;
}

.digital-evaluation-content {
  // overflow: hidden;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: #000000;
}

.digital-evaluation {
  width: 1920px;
  height: 1080px;
  color: #fff;

  .parent {
    position: relative;
    padding: 0px 20px;
    width: 1920px;
    height: 100%;
    display: grid;
    // grid-template-columns: 1fr 900px 1fr;
    // grid-template-rows: 86px repeat(3, 1fr);
    grid-template-rows: 125px repeat(6, 1fr); // 7行=125px + 6等份
    grid-template-columns: 447px repeat(1, 1fr) 447px; // 三列=447px + 1等份 + 447px
    grid-column-gap: 20px;
    grid-row-gap: 20px;
    background-color: #1fff;

    background-image: url("@/assets/homeImg/bj.jpg");
    background-repeat: no-repeat;
    background-size: 100% 100%;
  }

  .div1 {
    // 占据几行几列 再默认 1 1
    grid-area: span 1 / span 3 / span 1 / span 1;
    position: relative;
    overflow: hidden;
    // height: 403px; //单独设置
    // pointer-events: none;
    background-color: #132222;
    opacity: 0.7;

    .title_name {
      position: absolute;
      text-align: center;
      font-size: 38px;
      left: 0;
      right: 0;
      margin: 0 auto;
      line-height: 86px;
      font-weight: 500;
      letter-spacing: 6px;
      font-style: italic; // 斜体
      z-index: 5;

      // 渐变字体
      background: linear-gradient(0deg, #eb0e0e 30%, #ffffff 60%, #fff 100%);
      -webkit-text-fill-color: transparent;
      background-clip: text;
      -moz-background-clip: text;
      -webkit-background-clip: text;
    }

    .time_box {
      background-color: #48ce82;
      position: absolute;
      z-index: 999;
      text-align: center;
      left: 0;
      right: 0;
      top: 80px;
      font-size: 14px;

      .el-icon-class {
        position: relative;
        top: 3px;
      }
    }
  }
  .div2 {
    grid-area: span 2 / span 1 / span 1 / span 1;
    background-color: #132222;
    opacity: 0.7;
  }
  .div3 {
    padding: 0 10px;
    grid-area: span 6 / span 1 / span 1 / span 1;
    background-color: #132222;
    opacity: 0.7;
  }
  .div4 {
    grid-area: span 4 / span 1 / span 1 / span 1;
    background-color: #132222;
    opacity: 0.7;
  }
  .div5 {
    grid-area: span 3 / span 1 / span 1 / span 1;
    background-color: #132222;
    opacity: 0.7;
  }
  .div6 {
    grid-area: span 2 / span 1 / span 1 / span 1;
    background-color: #132222;
    height: 100px;
    opacity: 0.7;
  }
  .div7 {
    height: 160px;
    grid-area: span 1 / span 1 / span 1 / span 1;
    background-color: #132222;
    opacity: 0.7;
  }
  .div8 {
    cursor: pointer;
    position: absolute;
    bottom: 0;
    left: 50%;
    height: 30px;
    line-height: 30px;
    transform: translateX(-50%);
    color: #00fffb;
    // grid-area: span 1 / span 1 / span 1 / span 2;
    background-color: #132222;
    opacity: 0.7;
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于FISCO BCOS的电子签署系统

概述 本项目致力于构建一个安全、高效且功能完备的电子签署系统&#xff0c;通过整合区块链技术与传统数据库管理&#xff0c;为用户提供了可靠的电子签署解决方案&#xff0c;有效应对传统电子签署系统的数据安全隐患&#xff0c;满足企业和个人在数字化办公环境下对电子文档…

【PCIe 总线及设备入门学习专栏 5 -- PCIE接头引脚定义】

文章目录 PCIe 硬件接口 pin 本文转自&#xff1a;小K 硬件会 2024年09月03日 19:35 北京 PCIe 硬件接口 pin 在使用 PCIe 接口时&#xff0c;可以将 PCIe 金手指插入任何不短于金手指长度的 PCIe 插槽中。比如&#xff1a; x1 的 PCIe 金手指可以插入 x1、x4、x8 和 x16 的…

【开源免费】基于SpringBoot+Vue.JS大型商场应急预案管理系统(JAVA毕业设计)

本文项目编号 T 105 &#xff0c;文末自助获取源码 \color{red}{T105&#xff0c;文末自助获取源码} T105&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

【鸿蒙NEXT】鸿蒙里面类似iOS的Keychain——关键资产(@ohos.security.asset)实现设备唯一标识

前言 在iOS开发中Keychain 是一个非常安全的存储系统&#xff0c;用于保存敏感信息&#xff0c;如密码、证书、密钥等。与 NSUserDefaults 或文件系统不同&#xff0c;Keychain 提供了更高的安全性&#xff0c;因为它对数据进行了加密&#xff0c;并且只有经过授权的应用程序才…

VBA批量插入图片到PPT,一页一图

Sub InsertPicturesIntoSlides()Dim pptApp As ObjectDim pptPres As ObjectDim pptSlide As ObjectDim strFolderPath As StringDim strFileName As StringDim i As Integer 设置图片文件夹路径strFolderPath "C:\您的图片文件夹路径\" 请替换为您的图片文件夹路径…

【Gitlab】详细介绍与安装配置指南

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是Gitlab 2、Gitlab起源 二、GitLab的核心功能 …

Mcnemar‘s exact test

与卡方检验的区别 与fisher exact test区别

从手术到诊断:Tekceleo超声波压电电机的全面医疗应用

在当今医疗领域&#xff0c;技术的不断创新正在推动传统医疗模式向更精准、更高效的方向转变。Tekceleo公司凭借其超声波压电电机技术&#xff0c;在医疗行业中逐步占据重要地位&#xff0c;为医疗操作的精准化与高效化做出了显著贡献。 Tekceleo超声波压电电机的技术特点 Tek…

Postman[3] 创建Get和Post请求

1.创建Get请求 以打开百度页面为例 链接&#xff1a;https://www.baidu.com/ 步骤&#xff1a; 1.1新建一个Collection 1.2Add Request 1.3填充请求的url 1.4 Send 1.5检查返回结果 注意&#xff1a;这里和我们打开网页看到的页面不一样&#xff0c;是因为缺少请求头&…

C# OpenCV机器视觉:姿态估计

在一个阴沉沉的下午&#xff0c;天空仿佛被一块巨大的灰色抹布盖住&#xff0c;细雨淅淅沥沥地洒着&#xff0c;阿强正在实验室里捣鼓他那些宝贝仪器&#xff0c;活像一个正在摆弄玩具的大孩子。突然&#xff0c;同事小杨像只没头的苍蝇一样冲了进来&#xff0c;脸上写满了困惑…

自动化测试模型(一)

8.8.1 自动化测试模型概述 在自动化测试运用于测试工作的过程中&#xff0c;测试人员根据不同自动化测试工具、测试框架等所进行的测试活动进行了抽象&#xff0c;总结出线性测试、模块化驱动测试、数据驱动测试和关键字驱动测试这4种自动化测试模型。 线性测试 首先&#…

语音识别基础算法——动态时间规整算法

前言 动态时间规整算法&#xff0c;Dynamic Time Wraping&#xff0c;缩写为DTW&#xff0c;是语音识别领域的一个基础算法。 算法的提出 DTW 的提出是为了解决或尽量解决在语音识别当中的孤立词识别不正确的问题。该问题简单描述为&#xff1a;在识别阶段&#xff0c;将输入…

Word论文交叉引用一键上标

Word论文交叉引用一键上标 1.进入Microsoft word使用CtrlH快捷键或单击替换按钮 2.在查找内容中输入[^#] 3.鼠标点击&#xff0c;标签为“替换为&#xff1a;”的文本框&#xff0c;注意光标一定要打在图红色方框圈中的文本框中&#xff01; 4.点击格式选择字体 5.勾选上标…

BLIP论文笔记

论文地址 BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 论文思想 其实Clip就相当于只用了ITC

适用于项目经理的跨团队协作实践:Atlassian Jira与Confluence集成

适用于项目经理的跨团队协作实践&#xff1a;Atlassian Jira与Confluence集成 现代项目经理的核心职责是提供可视性、保持团队一致&#xff0c;并确保团队拥有交付出色工作所需的资源。在过去几年中&#xff0c;由于分布式团队的需求不断增加&#xff0c;项目经理这一角色已迅速…

【交叉编译】sysstat 离线编译

1、下载源码 首先从下载&#xff1a; https://github.com/sysstat/sysstat/tags &#xff0c;我直接下载最新的 2、配置交叉编译链 快速的方法就是把整个编译包全部放在Linux &#xff0c;然后编辑~/.zshrc或者~/.bashrc,在最后加入&#xff1a; export PATH$PATH:/opt/arm-so…

算法题(20):买卖股票的最佳时机

审题&#xff1a; 需要返回最大利润值 思路&#xff1a; 首先我们需要看看股票走势图 我们看到股票走势图是把数据图像化了&#xff0c;那么我们观察这个股票图的时候发现他在某一段区间呈大体上升&#xff0c;而大体上升的前提就是没有出现比最低点更低的数据值。 根据这一点我…

IDEA XML 文件 SQL 提示

首先连接到对应的数据库。Database 里面要填写对应的数据库名称 配置当前项目的 SQL 方言&#xff0c;例如我这里是 MySQL 数据库管理系统&#xff0c;那么就选择 MySQL 此时就有 SQL 语法、表名、字段名等提示信息了

【STM32项目】基于STM32单片机温湿度PM2.5粉尘甲醛环境质量监测系统wifi【完整工程资料源码】

演示视频&#xff1a; 基于STM32单片机温湿度PM2.5粉尘甲醛环境质量监测系统 目录 演示视频&#xff1a; 一、项目简介&#xff1a; 1.1 功能介绍&#xff1a; 1.2 设计背景&#xff1a; 1.3 设计意义&#xff1a; 1.4 设计目的 二、硬件设计&#xff1a; 2.1 整体原理图设计&…

优化站群SEO:使用苹果CMS泛目录插件实现泛目录页面刷新不变

优化站群SEO&#xff1a;使用苹果CMS泛目录插件实现泛目录页面刷新不变 在当今数字营销环境中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;是提升网站流量和可见性的关键策略。苹果CMS作为一款灵活的内容管理系统&#xff0c;提供了丰富的插件功能&#xff0c;尤其是…