【sgWatermark.js】自定义组件:基于Vue2+html2canvas实现全局水印效果

sgWatermark.js源码

javascript 复制代码
import html2canvas from 'html2canvas'; // npm install --save html2canvas (官网:https://html2canvas.hertzen.com)
export default {
  addWatermark({
    container = document.body, // 水印添加到的容器
    innerHTML = "水印文字内容", // 水印文字的内容
    rotate = -30,//默认文字旋转角度
    cssText = `
      box-sizing: border-box;
      width: max-content;
      height: max-content;
      padding: 30px;
      font-size: 12px;
      font-family: 'Microsoft YaHei';
      color: #00000022;
      transform-origin:center;
      transform: rotate(-30deg);
      z-index: 999999;
      pointer-events: none;
      display: flex;
      justify-content: center;
      align-items: center;
    `,//水印模板文本的默认样式
    className = '__sgWatermark__',//水印类名
  } = {}) {
    let dom = document.createElement("div");
    dom.innerHTML = innerHTML;
    dom.style.cssText = cssText;//默认样式
    dom.style.transform = `rotate(${rotate}deg)`;//旋转角度
    container.appendChild(dom);//添加模板文本
    // ----------------------------------------
    html2canvas(dom, { backgroundColor: 'transparent', logging: false, }).then(canvas => {
      dom.parentNode.removeChild(dom);//移除模板文本
      let base64Url = canvas.toDataURL('image/png', 1.0);
      const __sgWatermark__ = document.querySelector(`.${className}`);
      const watermarkDiv = __sgWatermark__ || document.createElement("div");
      watermarkDiv.style.cssText = `transition: .618s ease;opacity: 0;position: fixed; top: 0; left: 0; bottom: 0; right: 0; pointer-events: none; z-index: 999999999; background: url(${base64Url}); `;
      setTimeout(() => {
        watermarkDiv.style.opacity = 1;//缓慢出现
      }, 0);
      watermarkDiv.className = className;
      __sgWatermark__ || container.insertBefore(watermarkDiv, container.firstChild);
    });
  },
  removeWatermark(
    className = '__sgWatermark__',//水印类名
  ) {
    const dom = document.querySelector(`.${className}`);
    dom.parentNode.removeChild(dom);
  },
};

示例

html 复制代码
<template>
  <div :class="$options.name">
    <el-button type="primary" style="width: 300px; height: 100px">主要按钮</el-button>
    <div
      ref="div"
      style="
        width: 600px;
        height: 300px;
        background-color: #00000011;
        display: flex;
        justify-content: center;
        align-items: center;
      "
    >
      局部div
    </div>
  </div>
</template>
<script>
import sgWatermark from "@/js/sgWatermark";
export default {
  mounted() {
    // 示例1
    sgWatermark.addWatermark();
    // 示例2
    // sgWatermark.addWatermark({ container: this.$el, innerHTML: `高启强(No:201314)` });
    // 示例3
    // sgWatermark.addWatermark({ container: this.$refs.div, innerHTML: `<b style="color: #F56C6C88;font-weight: bold;font-size: 24px;" >你挚爱的强哥</b>` });
  },
};
</script>
相关推荐
薛定谔的猫喵喵2 分钟前
基于PyQt5的视频答题竞赛系统设计与实现
开发语言·qt·音视频
岱宗夫up7 分钟前
Python 数据分析入门
开发语言·python·数据分析
码界筑梦坊9 分钟前
325-基于Python的校园卡消费行为数据可视化分析系统
开发语言·python·信息可视化·django·毕业设计
多恩Stone12 分钟前
【RoPE】Flux 中的 Image Tokenization
开发语言·人工智能·python
李日灐14 分钟前
C++进阶必备:红黑树从 0 到 1: 手撕底层,带你搞懂平衡二叉树的平衡逻辑与黑高检验
开发语言·数据结构·c++·后端·面试·红黑树·自平衡二叉搜索树
John_ToDebug15 分钟前
引擎深处的漫游者:构建浏览器JavaScript引擎的哲学与技艺
javascript·chrome·js
Risehuxyc23 分钟前
备份三个PHP程序
android·开发语言·php
lly20240629 分钟前
PHP Error: 常见错误及其解决方法
开发语言
网安墨雨30 分钟前
Python自动化一------pytes与allure结合生成测试报告
开发语言·自动化测试·软件测试·python·职场和发展·自动化
程序猿阿伟31 分钟前
《TypeScript中Protobuf到运行时类型安全的转换指南》
javascript·安全·typescript