当前位置:首页 > JavaScript

js 实现水印功能

2026-03-16 00:18:25JavaScript

基础水印实现

使用Canvas绘制文本水印并覆盖在页面上:

function createWatermark(text) {
  const canvas = document.createElement('canvas');
  canvas.width = 200;
  canvas.height = 100;
  const ctx = canvas.getContext('2d');

  ctx.font = '16px Arial';
  ctx.fillStyle = 'rgba(200, 200, 200, 0.5)';
  ctx.rotate(-0.2);
  ctx.fillText(text, 20, 60);

  return canvas.toDataURL();
}

const watermarkDiv = document.createElement('div');
watermarkDiv.style.position = 'fixed';
watermarkDiv.style.top = '0';
watermarkDiv.style.left = '0';
watermarkDiv.style.width = '100%';
watermarkDiv.style.height = '100%';
watermarkDiv.style.pointerEvents = 'none';
watermarkDiv.style.backgroundImage = `url(${createWatermark('机密文件')})`;
watermarkDiv.style.backgroundRepeat = 'repeat';
document.body.appendChild(watermarkDiv);

防篡改水印方案

通过MutationObserver监听DOM变化,防止水印被删除:

const observer = new MutationObserver((mutations) => {
  mutations.forEach((mutation) => {
    if (!document.body.contains(watermarkDiv)) {
      document.body.appendChild(watermarkDiv);
    }
  });
});

observer.observe(document.body, {
  childList: true,
  subtree: true
});

动态水印方案

结合用户信息生成个性化水印:

function generateDynamicWatermark(userInfo) {
  const text = `${userInfo.name} ${userInfo.id} ${new Date().toLocaleString()}`;
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');

  canvas.width = 400;
  canvas.height = 200;
  ctx.font = '14px Arial';
  ctx.fillStyle = 'rgba(100, 100, 100, 0.1)';

  for (let i = 0; i < 10; i++) {
    for (let j = 0; j < 5; j++) {
      ctx.save();
      ctx.translate(i * 150, j * 100);
      ctx.rotate(-0.2);
      ctx.fillText(text, 0, 50);
      ctx.restore();
    }
  }

  return canvas.toDataURL();
}

SVG水印方案

使用SVG实现高清水印:

function createSvgWatermark(text) {
  const svg = `
    <svg width="300" height="200" xmlns="http://www.w3.org/2000/svg">
      <text x="50" y="100" 
            font-family="Arial" 
            font-size="20" 
            fill="rgba(150,150,150,0.5)"
            transform="rotate(-15)">
        ${text}
      </text>
    </svg>`;

  return `data:image/svg+xml;base64,${btoa(svg)}`;
}

水印性能优化

对于大量水印的情况,使用CSS重复背景替代多个DOM元素:

js 实现水印功能

const watermarkStyle = document.createElement('style');
watermarkStyle.innerHTML = `
  body {
    position: relative;
  }
  body::after {
    content: "";
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    pointer-events: none;
    background-image: url(${createWatermark('禁止复制')});
    background-repeat: repeat;
    opacity: 0.5;
    z-index: 9999;
  }
`;
document.head.appendChild(watermarkStyle);

标签: 水印功能
分享给朋友:

相关文章

vue实现后台功能

vue实现后台功能

Vue 实现后台功能的方法 Vue.js 是一个流行的前端框架,适合构建后台管理系统。以下是实现后台功能的常见方法和步骤。 项目初始化 使用 Vue CLI 或 Vite 初始化项目: # Vue…

vue修改功能实现

vue修改功能实现

Vue 修改功能的实现方法 修改功能是 CRUD 操作中的重要部分,在 Vue 中可以通过多种方式实现。以下是几种常见的实现方案: 数据绑定与表单处理 使用 v-model 实现双向数据绑定,快速获…

vue实现轨道功能

vue实现轨道功能

Vue 实现轨道功能的方法 轨道功能通常指在界面中实现元素沿特定路径移动的效果,例如进度条、时间轴或动画轨迹。以下是几种常见的实现方式: 使用 CSS 动画与 Vue 结合 通过 Vue 动态绑定样…

vue实现注册功能

vue实现注册功能

前端实现注册功能 在Vue中实现注册功能通常需要结合表单验证、HTTP请求和状态管理。以下是一个基于Vue 3和Element Plus的完整实现方案: 模板部分 <template>…

vue实现水印组件

vue实现水印组件

Vue 水印组件的实现方法 使用Canvas绘制水印 在Vue组件中通过Canvas动态生成水印图案,将其作为背景添加到目标元素上。 <template> <div ref="…

vue实现模态功能

vue实现模态功能

Vue 实现模态框功能 方法一:使用组件和v-if/v-show控制显示 创建独立的模态框组件(如Modal.vue),通过props接收标题、内容等数据,使用v-if或v-show控制显示状态。…