vue 使用screenfull 实现全屏展示,全局水印实现, 以及全屏放大后部分组件无法使用,水印无法全屏显示问题的解决

news2024/11/25 18:43:55

需求:1. web项目中看板页面需要单独全屏显示 2. 项目全局增加水印,水印文字为当前用户登录姓名,登录页不显示水印

出现问题描述

  • 单页面进行全屏显示,下拉,时间选择器,抽屉等组件被 全屏覆盖到下一层,无法显示在全屏后页面的上一层
  • 单页面进行全屏展示,放大全屏后,水印消失

一、页面全屏展示

1. 下载screenfull

npm install screenfull@4.2.0 --save

直接使用 npm install screenfull --save 会报错,不支持最新版本

2. 页面引入组件,并使用

<template> 
<div id="embedContainer" ref="scrollBox">
    这是需要全屏的div  

     <el-drawer ref="drawer" id="drawerId" :visible.sync="dialogVisible" size="85%">
         这是抽屉
     </el-drawer>

</div>

<div><i class=" el-icon-full-screen" title="全屏模式"
                style="float: right;margin-right: 200px;margin-top:5px;   font-size: 30px;"
                @click="fullScreenButton"></i></div>

</template>

<script>
import screenfull from "screenfull"  

export default {
   
   methods:{
      fullScreenButton() { 
          if(screenfull.enabled) { 
                  let elementById = document.getElementById('embedContainer');
                   screenfull.toggle(elementById)
          }else {
              this.$message({
              type: 'warning',
              message: '您的浏览器不支持全屏'
          })
        }
        
      }
   }

}

</script>




3. 全屏后相关组件无法使用,被覆盖问题解决

问题1 : 抽屉组件无法在全屏后展示,被覆盖

解决: 将抽屉组件添加进q需要全屏的div,修改methods

在这里插入图片描述

   methods:{
      fullScreenButton() { 
          if(screenfull.enabled) { 
             this.$refs.scrollBox.appendChild(document.getElementById("drawerId"))    
             let elementById = document.getElementById('embedContainer');
             screenfull.toggle(elementById)
          }
        
      }
   }

问题2 : 下拉组件无法在全屏后展示,被覆盖

解决: 加上 :popper-append-to-body=“false”

 <el-select
          :popper-append-to-body="false"
          class="space_query_input"        
          size="small"
          style="width: 200px;"
          filterable
          collapse-tags
          clearable
          placeholder="请选择筛选维度"
          @change="changeType"
          v-model="queryParams.type"
        >
          <el-option
            v-for="item in choose"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          ></el-option>
        </el-select>

加上 :popper-append-to-body=“false” 后 el-select 下拉文字会肯会出现没有对齐情况

加上 popper-class=“select-popper”

在这里插入图片描述


  >>> .select-popper {
    .el-select-dropdown__item{
      text-align: left;
    }
  }

问题3 : 级联选择器组件无法在全屏后展示,被覆盖

解决:加上 :append-to-body=“false”

         <el-cascader
          :append-to-body="false"
          size="small"
          placeholder="请选组织"
          style="width:230px"
          v-model="queryParams.orgId"
          :options="orgIdOptions"
          :props="defaultOrgProps"
          clearable
          filterable
          collapse-tags
          :show-all-levels="false"
          class="space_query_input">
        </el-cascader>

问题4 : 时间选择器组件无法在全屏后展示,被覆盖

解决: 加上 :append-to-body=“false”

     <el-date-picker
          :append-to-body="false"
          :picker-options="optionsStart"
          class="space_query_input"
          size="small"
          style="width: 200px"
          v-model="queryParams.beginTime"
          type="date"
          :clearable="false"
          value-format="yyyy-MM-dd"
          placeholder="开始日期">
        </el-date-picker>

二. 项目全局添加水印 (水印文字为当前用户登录姓名)

1. 新建 waterMark.js 文件

//waterMark.js文件

let watermark = {}

let setWatermark = (str) => {
  let id = '1.23452384164.123412416';

  if (document.getElementById(id) !== null) {
    document.body.removeChild(document.getElementById(id));
  }

  //创建一个画布
  let can = document.createElement('canvas');
  //设置画布的长宽
  can.width = 120;
  can.height = 120;

  let cans = can.getContext('2d');
  //旋转角度
  cans.rotate(-15 * Math.PI / 180);
  cans.font = '18px Vedana';
  //设置填充绘画的颜色、渐变或者模式
  cans.fillStyle = 'rgba(200, 200, 200, 0.40)';
  //设置文本内容的当前对齐方式
  cans.textAlign = 'left';
  //设置在绘制文本时使用的当前文本基线
  cans.textBaseline = 'Middle';
  //在画布上绘制填色的文本(输出的文本,开始绘制文本的X坐标位置,开始绘制文本的Y坐标位置)
  cans.fillText(str, can.width / 8, can.height / 2);

  let div = document.createElement('div');
  div.id = id;
  div.style.pointerEvents = 'none';
  div.style.top = '30px';
  div.style.left = '0px';
  div.style.position = 'fixed';
  div.style.zIndex = '100000';
  div.style.width = document.documentElement.clientWidth + 'px';
  div.style.height = document.documentElement.clientHeight + 'px';
  div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat';
  document.body.appendChild(div);
  return id;
}

// 该方法只允许调用一次
watermark.set = (str) => {
  let id = setWatermark(str);
  setInterval(() => {
    if (document.getElementById(id) === null) {
      id = setWatermark(str);
    }
  }, 500);
  window.onresize = () => {
    setWatermark(str);
  };
}

export default watermark;

2. 在 main.js 中引入

import watermark from ".utils/watermark"   

//去除登录页面
router.afterEach((item) =>{ 
//如果不为登录界面,显示水印
  if (item.name !=='login') { 
      //获取存储store中的数据
      watermark.set(store.state.name)
  }
})

3. store 数据存储

以当前(水印为当前登录用户姓名)场景为例,用户登录成功将用户姓名存储进store

  • store 下 index.js文件 添加相关信息
 state:{
    name:''
  },
   mutations:{
    SET_USER(state,name){
      state.name=name
    }
  },
  actions: {
    SET_USER(context,name) {
      context.commit("SET_USER",name)
    }
  }
  • login.vue 用户登录成功后进行存储操作
   this.$store.dispatch("SET_USER", res.data.data.userInfo.name)
  • 解决刷新页面后,store数据消失问题,在App.vue全局监听,刷新前先将数据存储sessionStorage,刷新后数据恢复store
created () {
      if (sessionStorage.getItem('user')) {
      this.$store.dispatch("SET_USER",sessionStorage.getItem('user'))
    }
    window.addEventListener('beforeunload',()=>{
      sessionStorage.setItem('user',this.$store.state.name)
    })
}

4. 点击登出到登录界面,水印依然存在的问题

登出方法中,将水印文字设置为空就好

import watermark from ".utils/watermark"  
   //登出方法
      handleLoginout() {
        this.$cookie.set("token", '');
        //水印设置为空
        watermark.set("")
        this.$router.push('/')
   }

5. 全屏显示时,全屏的页面水印消失问题

  • 在全屏按钮方法中重新绘制一个水印画布
<template> 
<div id="embedContainer" ref="scrollBox">
    这是需要全屏的div  

     <el-drawer ref="drawer" id="drawerId" :visible.sync="dialogVisible" size="85%">
         这是抽屉
     </el-drawer>

</div>

<div><i class=" el-icon-full-screen" title="全屏模式"
                style="float: right;margin-right: 200px;margin-top:5px;   font-size: 30px;"
                @click="fullScreenButton"></i></div>

</template>

<script>
import screenfull from "screenfull"  

export default {
   
   methods:{ 
      fullScreenButton() {
        if (screenfull.enabled) {
          this.$refs.scrollBox.appendChild(document.getElementById("drawerId"))
          let elementById = document.getElementById('embedContainer');
          screenfull.toggle(elementById)
          // 添加水印
          setTimeout(() => {
            const div1 = elementById.firstChild;
            //创建一个画布
            let can = document.createElement('canvas');
            //设置画布的长宽
            can.width = 120;
            can.height = 120;

            let cans = can.getContext('2d');
            //旋转角度
            cans.rotate(-15 * Math.PI / 180);
            cans.font = '18px Vedana';
            //设置填充绘画的颜色、渐变或者模式
            cans.fillStyle = 'rgba(200, 200, 200, 0.40)';
            //设置文本内容的当前对齐方式
            cans.textAlign = 'left';
            //设置在绘制文本时使用的当前文本基线
            cans.textBaseline = 'Middle';
            //在画布上绘制填色的文本(输出的文本,开始绘制文本的X坐标位置,开始绘制文本的Y坐标位置)
            cans.fillText(sessionStorage.getItem("user"), can.width / 8, can.height / 2);

            let div = document.createElement('partwater');
            div.id = "water";
            div.style.pointerEvents = 'none';
            div.style.top = '30px';
            div.style.left = '0px';
            div.style.position = 'fixed';
            div.style.zIndex = '100000';
            div.style.width = document.documentElement.clientWidth + 'px';
            div.style.height = document.documentElement.clientHeight + 'px';
            div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat';
            div1.appendChild(div)
          }, 100);
        } else {
          this.$message({
            type: 'warning',
            message: '您的浏览器不支持全屏'
          })
        }
      }
  }
}

</script>

5. 解决点击全屏,取消全屏(反复操作)水印文字慢慢变深问题

监听是否全屏,未全屏,移除水印节点

mounted() {
         window.onresize = () => {
           if (!screenfull.isFullscreen) {
          let elementById = document.getElementById("water");
          elementById.parentNode.removeChild(elementById)
        }
      }
}

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

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

相关文章

MyBatis入门基础

目录 1.什么是MyBatis 2.第一个MyBatis查询 2.1 准备工作 2.2 实际操作 2.2.1 定义接口 2.2.2 创建XML实现上述接口 2.3 单元测试 2.3.1 单元测试的优势 2.3.2 创建并使用单元测试 2.3.3 有关断言 3.增删改的基本操作 3.1 插入操作 特殊的添加&#xff1a;返…

【PyTorch】Torchvision

文章目录三、Torchvision1、Dataset2、DataLoader2.1 test_data2.2 test_loader2.3 drop_last2.4 shuffle三、Torchvision PyTorch官网&#xff1a;https://pytorch.org 1、Dataset 数据集描述&#xff1a;https://www.cs.toronto.edu/~kriz/cifar.html 数据集使用说明&#…

SpringCloud案例day05

SpringCloud Gateway网关 案例1&#xff1a;环境搭建 可以复制 Service-A9001 改成Gateway-C9009 》1&#xff1a;创建工程导入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artif…

汽车全景视频制作让企业营销传播无界长久

全景视频制作 全景VR视频&#xff0c;顾名思义就是能够使我们看到拍摄点周围360景致的视频。传统视频拍摄受限于镜头视角&#xff0c;所以我们只能看到镜头前方180内的景物。而全景VR视频能够看到周围360以及上下180各个角度的一切景物&#xff0c;用户能够更加多方位的观赏视频…

可观测性-Event-指标事件采样策略总结

文章目录前言采样的几种策略简单随机采样周期性完整采样基于条件的采样前言 在默认情况下&#xff0c;系统会采集所有追踪&#xff08;Tracing&#xff09;的数据。但是如果系统比较复杂&#xff0c;采集的端点比较多的时候&#xff0c;对存储压力比较大&#xff0c;这个时候我…

Educational Codeforces Round 135 (Rated for Div. 2)

A:思维 题意&#xff1a;箱子里有N个颜色的球&#xff08;用下标代表不同的颜色&#xff09;&#xff0c;每个颜色的球对应一定的数量&#xff0c;你会进行多次拿球的操作&#xff0c;当箱子里的球颜色一致时&#xff0c;你就不能再拿球了&#xff0c;问最后颜色一致的球是哪个…

免疫抑制作用的转录抑制分子

科研人员发现&#xff1a;社交失败导致了小鼠焦虑行为&#xff0c;进而抑制了化疗药物的治疗过程&#xff0c;加速了肿瘤的发展。在正常小鼠中&#xff0c;人为给予外源性糖皮质激素会使得 Tsc22d3(一个具有很强免疫抑制作用的转录抑制分子)在肿瘤浸润树突细胞(TIDC)的表达上调…

Q3营收同比翻三倍,踩猛“油门”零跑必将领跑?

近日&#xff0c;零跑汽车公布三季度财报。从财报成绩来看&#xff0c;有喜有忧。喜的是销量营收同比环比均出现大幅度增长&#xff0c;忧的是亏损同比扩大86.11%。 营收同比猛增398.5%&#xff0c;销量能否穿越迷雾&#xff1f; 详细来看&#xff0c;三季度零跑汽车销量3.56万…

【附源码】计算机毕业设计JAVA旅行指南网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

HOOPS学习笔记

Hoops简介 HOOPS Visualize由一套集成的组件组成&#xff0c;可快速开发高性能设计、可视化和工程应用程序。HOOPS 3DF在每个组件中保持平台独立性&#xff0c;在Windows、Linux和Mac OS X上提供跨平台解决方案。 HOOPS Visualize包含如下组件&#xff1a; 1.HOOPS/3dGS - HO…

vue+express+mysql+elementUI实现前后端交互增删改查

简介&#xff1a;使用 Vue koa koa2-router mySql elementUI实现前后端交互 页面整体效果图&#xff1a; 编辑页面&#xff1a; 添加页面&#xff1a; 删除操作&#xff1a; 数据库客户端使用Navicat for mysql 当然你需要下载安装 在数据库新建 stuInfo 表和表结构 st…

Github点赞接近 100k 的Spring Boot学习教程+实战项目推荐

很明显的一个现象&#xff0c;除了一些老项目&#xff0c;现在 Java 后端项目基本都是基于 Spring Boot 进行开发&#xff0c;毕竟它这么好用以及天然微服务友好。不夸张的说&#xff0c;Spring Boot 是 Java 后端领域最最最重要的技术之一&#xff0c;熟练掌握它对于 Java 程序…

SpringBoot-快速入门

目录 SpringBoot 概念 Spring缺点 SpringBoot 功能 快速入门案例&#xff1a;需求 案例&#xff1a;实现步骤 示例 小结 快速构建SpringBoot工程 SpringBoot 概念 SpringBoot提供了一种快速使用Spring的方式基于约定优于配置的思想&#xff0c;可以让开发人员不必在配置…

QML地图Map中使用QPainterPath,并显示任意点经纬度位置

QML地图Map中提供了供绘制图形的组件&#xff0c;例如MapPolyline&#xff0c;MapCircle等&#xff0c;但是这些组件在绘制复杂轨迹时就显得功能不够全面&#xff0c;因此我将QPainterPath在Map中进行使用并进行绘制&#xff0c;并使用C和Qml中的函数进行相互调用计算获取点屏幕…

macOS 的「预览」有几种用法

如果要评选 macOS 最低调的 App &#xff0c;「预览」可能就会位列其中之一。「预览」和 macOS 结合异常紧密&#xff0c;甚至让人都会遗忘它还是个 App。毕竟大多数的时候&#xff0c;提到「预览」就会想到操作系统的一部分。而实际上&#xff0c;「预览」那「瘦小」的身躯之内…

Unity3D赛车游戏+脚本基础

前言 游戏对象实例化 Scenes游戏场景 GameObject游戏对象 Component组件 Component使用方法 预制体 Unity事件函数 Instantiate():实例化对象 什么是Time.deltaTime Transform的移动&#xff0c;旋转和缩放 实战:赛车游戏 运行演示 具体步骤 游戏打包流程 前言 …

智慧教育解决方案-最新全套文件

智慧教育解决方案-最新全套文件一、建设背景二、思路架构三、建设方案四、获取 - 智慧教育全套最新解决方案合集一、建设背景 目前数字化校园现状&#xff1a; 各自为政 分散建设 各个学校组成的业务系统、网站五花八门&#xff0c;形式多样。形式单一 功能简单 学校网站主要…

为什么同一表情‘‘.length==5但‘‘.length==4?本文带你深入理解 String Unicode UTF8 UTF16

背景 为什么同样是男人&#xff0c;但有的男人&#x1f9d4;‍♂️.length 5&#xff0c;有的男人&#x1f9d4;‍♂.length 4呢&#xff1f; 这二者都是JS中的字符串&#xff0c;要理解本质原因&#xff0c;你需要明白JS中字符串的本质&#xff0c;你需要理解 String Unic…

vlan trunk stp攻防

目录 一、VLAN、Trunk面临的安全风险 trunk干道攻击DTP攻击&#xff08;思科特有&#xff09; VLAN跳跃攻击 STP根桥攻击 二、攻击防护 一、VLAN、Trunk面临的安全风险 trunk干道攻击DTP攻击&#xff08;思科特有&#xff09; 在华为设备中trunk链路是手工指定的&#xf…

A-LEVEL Chemistry考点分析

A-LEVEL化学其实不是一门很难的科目&#xff0c;并没有太多的内容&#xff0c;虽说包含十几章的内容但其实每章都是相互关联&#xff0c;一通百通&#xff0c;掌握元素周期表的实质&#xff0c;基本上就没有什么问题了&#xff0c;重在理解&#xff01;知识点多而不碎&#xff…