首页 > 其他分享 >前端水印实现

前端水印实现

时间:2024-05-29 16:00:50浏览次数:16  
标签:canvas const observer 实现 前端 ctx elem 水印 style

点击查看代码
      class WaterMark {
        constructor(el, content) {
          this.el = el;
          this.content = content;
          this.observer = null;
          this.config = { attributes: true, childList: true, subtree: true };
          this.init();
        }
        init() {
          this.createContext(this.el);
        }
        createContext(elem) {
          const { offsetWidth, offsetHeight } = elem;
          const canvas = document.createElement("canvas");
          const ctx = canvas.getContext("2d");
          canvas.width = offsetWidth;
          canvas.height = offsetHeight;
          canvas.style.position = "absolute";
          canvas.style.pointerEvents = "none";
          canvas.style.top = "0px";
          canvas.style.left = "0px";
          canvas.style.zIndex = "99";
          ctx.font = "24px serif";
          ctx.rotate((-20 * Math.PI) / 180);
          ctx.fillStyle = "rgba(180, 180, 180, 0.6)";
          ctx.textAlign = "left";
          ctx.textBaseline = "middle";
          //   循环在canvas中渲染
          for (let i = 0; i < canvas.width / 100; i++) {
            for (let j = 0; j < canvas.height / 50; j++) {
              ctx.fillText(this.content, i * 200, j * 100 + 20);
            }
          }
          elem.appendChild(canvas);
          this.createObserver(elem);
          // 添加监听
        }
        createObserver(elem) {
          if (this.observer) this.observer.disconnect();
          this.observer = new MutationObserver((changeList, watcher) => {
            Array.from(changeList).forEach((record) => {
              const { removedNodes } = record;
              const removeNodeNames = Array.from(removedNodes).map(
                (node) => node.nodeName
              );
              if (removeNodeNames.includes("CANVAS")) {
                window.requestIdleCallback(() => this.createContext(elem), {
                  timeout: 300,
                });
              }
            });
          });
          this.observer.observe(elem, this.config);
        }
      }
      const elem = document.getElementById("content");
      const waterMark = new WaterMark(elem, "hello, world");

标签:canvas,const,observer,实现,前端,ctx,elem,水印,style
From: https://www.cnblogs.com/mccree/p/18220492

相关文章

  • 快速排序的实现
    目录一、递归        1、霍尔法:2、挖坑法:3、前后指针法:二、非递归三、完整代码:基本思想:先取这个待排序元素序列中的某一个元素最为key值,然后通过这个key值将这个序列分为两边,一边小于这个key,另一边大于这个key,然后接着对这个左边的序列和右边的序列进行相......
  • QT C++实现表头添加组件
    QTableWidget在表头添加组件QTableWidget的表头有一个类QHeaderView是专门处理表头的类,要在表头添加一个类似QCheckBox的组件需要重写一个类并继承QHeaderView。QTableWidget中添加复选框并实现全选居中:自定义类MyHeaderView并继承QHeaderView自定义类MyTableWidget并继承QTa......
  • 在 Vue 3 中如何实现代码拆分和懒加载?
    在现代开发中,前端应用越来越复杂,同时用户期望应用能够迅速响应。为了解决加载速度问题,前端框架如Vue3提供了代码拆分和懒加载功能。这不仅能提升性能,还能增强用户体验。接下来,我们将详细介绍在Vue3中如何实现代码拆分和懒加载。什么是代码拆分和懒加载?代码拆分(Code......
  • 前端架构的职责
    概念 前端架构指的是在前端开发中所采用的一系列设计模式、工具和最佳实践,用于构建高效、可维护、可扩展的前端应用。它是前端开发的重要组成部分,确保项目在长期开发和维护中保持高质量和高效率。 前端架构的职责 模块化设计:将代码分割成独立的、可重用的模块。......
  • 鸿蒙HarmonyOS实战-Web组件(前端函数和应用侧函数相互调用)
    ......
  • 封装通用 ECharts 图表组件(三):环形图实现
    在数据可视化领域,ECharts是一个非常流行且功能强大的图表库。它提供了丰富的图表类型,能够满足各种复杂的数据展示需求。在本系列的第三篇文章中,我们将探讨如何封装一个通用的ECharts环形图组件。什么是环形图?环形图是一种特殊的饼图,它由一个内圆和一个外圆组成,中间的部分是......
  • 封装通用 ECharts 图表组件(四):分格柱状图实现
    在数据可视化的世界中,ECharts以其强大的功能和灵活性,成为了开发者们的首选图表库之一。继我们之前探讨的环形图封装之后,本文将带领大家进入另一个实用且美观的图表类型——分格柱状图的封装实现。分格柱状图简介分格柱状图是一种特殊的柱状图,它通过将每个柱子分割成多个小格......
  • css通过子元素选择父元素的实现示例
    在CSS中,直接通过子元素选择其父元素并不直接支持,因为CSS的选择器是从上到下(从父元素到子元素)进行选择的,而不是相反。但是,你可以使用其他方法或技术来间接实现这一效果,比如使用JavaScript、jQuery或其他脚本语言,或者通过调整你的HTML结构和CSS样式来达到类似的效果。不过,我可以给......
  • 前端自动化
       appium和selenium区别 Appium学习视频:https://www.bilibili.com/video/BV1B441197rZ?p=1&vd_source=b145378dc4a63e7f1ee72b34a3e543fb1.功能上:Appium是一种自动化测试工具,可以用来测试移动端应用,而Selenium是一种自动化测试工具,可以用来测试Web应用。2.环境要......
  • Java实现一个简单的计算器
    当实现一个简单的计算器时,我们可以创建一个Java程序,该程序接受用户输入的两个数字和一个运算符,然后执行相应的数学运算并输出结果。下面是一个简单的Java代码示例,用于实现这样的计算器:importjava.util.Scanner;publicclassSimpleCalculator{publicstaticvoid......