当前位置:首页 > JavaScript

js 实现水印功能

2026-02-02 23:49:43JavaScript

实现水印功能的几种方法

使用Canvas绘制水印

通过Canvas绘制文本或图片水印,生成Base64数据后设置为背景。

function createWatermark(text, options = {}) {
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    const fontSize = options.fontSize || 16;
    const color = options.color || 'rgba(180, 180, 180, 0.3)';
    const angle = options.angle || -20;

    canvas.width = 200;
    canvas.height = 100;
    ctx.font = `${fontSize}px Arial`;
    ctx.fillStyle = color;
    ctx.rotate(angle * Math.PI / 180);
    ctx.fillText(text, 10, 50);

    return canvas.toDataURL('image/png');
}

// 应用水印
const watermarkUrl = createWatermark('Confidential');
document.body.style.backgroundImage = `url(${watermarkUrl})`;

使用SVG生成水印

SVG水印适合需要矢量缩放或复杂效果的场景。

function createSvgWatermark(text) {
    const svg = `
        <svg width="200" height="100" xmlns="http://www.w3.org/2000/svg">
            <text x="20" y="50" fill="rgba(180,180,180,0.3)" 
                  font-family="Arial" font-size="16" transform="rotate(-20)">
                ${text}
            </text>
        </svg>`;
    return `data:image/svg+xml;base64,${btoa(svg)}`;
}

document.body.style.backgroundImage = `url(${createSvgWatermark('Draft')})`;

使用CSS伪元素实现简单水印

适合不需要旋转的静态水印。

const style = document.createElement('style');
style.innerHTML = `
    body::after {
        content: "SAMPLE";
        position: fixed;
        opacity: 0.3;
        font-size: 80px;
        z-index: 9999;
        pointer-events: none;
        transform: rotate(-15deg);
    }
`;
document.head.appendChild(style);

防止水印被删除的增强方案

通过MutationObserver监测DOM变化,防止水印被移除。

function protectWatermark(watermarkId) {
    const observer = new MutationObserver(() => {
        if (!document.getElementById(watermarkId)) {
            const watermark = document.createElement('div');
            watermark.id = watermarkId;
            watermark.style.position = 'fixed';
            // 重新添加水印样式
            document.body.appendChild(watermark);
        }
    });
    observer.observe(document.body, { childList: true });
}

图片水印实现示例

为图片添加Canvas水印后导出。

js 实现水印功能

function addImageWatermark(imgSrc, watermarkText) {
    const img = new Image();
    img.onload = function() {
        const canvas = document.createElement('canvas');
        canvas.width = img.width;
        canvas.height = img.height;
        const ctx = canvas.getContext('2d');
        ctx.drawImage(img, 0, 0);
        ctx.font = '30px Arial';
        ctx.fillStyle = 'rgba(255,0,0,0.5)';
        ctx.fillText(watermarkText, 50, 50);
        document.body.appendChild(canvas);
    };
    img.src = imgSrc;
}

注意事项

  • 动态水印需考虑性能影响,避免频繁重绘
  • 重要数据建议结合后端校验
  • 移动端需测试兼容性
  • 透明度和旋转角度根据实际需求调整

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

相关文章

vue实现倒计时功能

vue实现倒计时功能

vue实现倒计时功能 在Vue中实现倒计时功能可以通过多种方式完成,以下是几种常见的方法: 方法一:使用setInterval和clearInterval 创建一个倒计时组件,利用setInter…

vue功能实现

vue功能实现

Vue 功能实现指南 Vue.js 是一个流行的前端框架,用于构建用户界面和单页应用。以下是 Vue 功能实现的关键方法和技术。 数据绑定与响应式 Vue 的核心特性是数据绑定和响应式系统。通过 d…

php登陆功能实现

php登陆功能实现

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

vue实现模态功能

vue实现模态功能

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

php购物车功能实现

php购物车功能实现

数据库设计 购物车功能通常需要设计数据库表来存储商品和用户信息。常见的表包括: products 表:存储商品信息,如商品ID、名称、价格、库存等。 users 表:存储用户信息,如用户ID、用户名…

vue实现全选功能

vue实现全选功能

实现全选功能的基本思路 在Vue中实现全选功能通常需要绑定一个全选复选框的状态,并通过v-model或事件监听控制子选项的选中状态。核心逻辑包括全选按钮与子选项的双向数据绑定,以及状态同步。 数据准…