当前位置:首页 > 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水印适合需要矢量缩放或复杂效果的场景。

js 实现水印功能

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伪元素实现简单水印

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

js 实现水印功能

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水印后导出。

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实现拨号功能的方法 使用HTML5的tel协议 在Vue模板中直接使用<a>标签的tel:协议实现拨号功能。这种方法适用于移动端浏览器,点击后会调起系统的拨号界面。 <te…

vue实现ping功能

vue实现ping功能

实现Ping功能的思路 在Vue中实现Ping功能通常需要借助浏览器API或后端服务。由于浏览器环境限制,无法直接发送ICMP请求(传统Ping协议),但可通过以下两种方式模拟: HTTP请求模拟P…

vue实现考试多选功能

vue实现考试多选功能

Vue实现考试多选功能 数据绑定与选项渲染 使用v-model绑定用户选择的答案数组,结合v-for循环渲染选项列表。示例代码: <template> <div>…

vue前端实现打印功能

vue前端实现打印功能

使用Vue实现前端打印功能 使用window.print()方法 Vue中可以直接调用浏览器的window.print()方法实现打印功能。这种方法简单快捷,适用于打印整个页面或特定区域。 meth…

vue实现按钮实现点击功能

vue实现按钮实现点击功能

实现按钮点击功能 在Vue中实现按钮点击功能可以通过v-on指令或@缩写来绑定事件。以下是几种常见的实现方式: 使用v-on指令 通过v-on:click绑定点击事件,触发定义在methods中的方…

vue实现答题功能

vue实现答题功能

Vue实现答题功能 数据准备 创建一个包含题目、选项和正确答案的数据结构,通常是一个数组对象。每个题目对象包含问题文本、选项数组和正确答案索引。 const questions = [ {…