当前位置:首页 > 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变化,防止水印被删除:

js 实现水印功能

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
});

动态水印方案

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

js 实现水印功能

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元素:

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电影功能实现 数据获取与展示 使用Axios或Fetch API从电影API获取数据,例如TMDB或豆瓣API。在Vue组件的created或mounted生命周期钩子中发起请求,将返回的电影数…

vue实现功能插件

vue实现功能插件

Vue 插件实现方法 Vue 插件通常用于封装全局功能(如指令、过滤器、混入等),以下是实现 Vue 插件的典型方式: 插件基本结构 const MyPlugin = { install(Vu…

vue实现网页水印

vue实现网页水印

添加静态水印 在Vue中可以通过CSS或Canvas实现静态水印。CSS方法适合简单文字水印,Canvas适合复杂水印效果。 <template> <div class="wa…

php实现分页功能

php实现分页功能

PHP实现分页功能的方法 数据库查询与分页逻辑 使用SQL的LIMIT和OFFSET实现分页。假设每页显示10条数据,当前页码为$page: $perPage = 10; $page = isset…

h5实现点击复制功能

h5实现点击复制功能

使用document.execCommand方法(兼容旧浏览器) 通过document.execCommand('copy')实现复制功能,需先选中文本内容。创建一个隐藏的textarea或input…

php登陆功能实现

php登陆功能实现

实现PHP登录功能 数据库准备 创建一个用户表存储登录信息,基本字段包括用户名、密码(需加密)等: CREATE TABLE users ( id INT AUTO_INCREMENT PR…