HTML增加水印

原文地址:https://blog.learnzs.com/2020/08/19/237/

HTML增加水印

/**
 * 显示/创建水印
 * @param options
 * @param container 父级容器
 * @param text 水印文字
 * @param width 宽度
 * @param height 高度
 * @param zIndex 显示层级
 * @param margin 行间距
 * @param fontSize 字体大小
 * @param color 字体颜色
 * @param opacity 透明度
 * @param rotate 旋转角度
 * @param show 默认是否显示
 */
function createWatermark(options = {}) {
  const {
    container = el = '#app',
    text = '',
    width = 300,
    height = 200,
    zIndex = 9999,
    margin = 10,
    fontSize = 18,
    color = '#bbb',
    opacity = 0.5,
    rotate = -30,
    show = true
  } = options

  if (document.querySelector('.watermark')) {
    document.querySelector('.watermark').style.display = 'block'
    return
  }

  const cas = document.createElement('canvas')
  cas.setAttribute('width', width)
  cas.setAttribute('height', height)
  cas.style.border = '1px solid #000'

  const ctx = cas.getContext('2d')
  ctx.font = `${fontSize}px sans-serif`
  ctx.textAlign = 'center'
  ctx.textBaseline = 'middle'
  ctx.fillStyle = color
  ctx.translate(width / 2, height / 2)
  ctx.rotate((rotate * Math.PI) / 180)
  ctx.translate(0, 0)

  // 计算宽度
  const charts = text.split('')
  let firstLine = ''
  let secondLine = ''
  for (let index = 0; index < charts.length; index++) {
    if (ctx.measureText(firstLine).width < width - fontSize * 3) {
      firstLine += charts[index]
    } else {
      secondLine += charts[index]
    }
  }
  const showSecond = secondLine.length > 0
  console.log(firstLine)
  ctx.fillText(firstLine, 0, showSecond ? -fontSize - margin / 2 : 0)
  showSecond && ctx.fillText(secondLine, 0, margin + fontSize)
  const imageBase64 = cas.toDataURL()
  const watermarkEl = document.createElement('div')
  const containerEl = document.querySelector(container)
  containerEl.style.position = containerEl.style.position ? containerEl.style.position : 'relative'
  watermarkEl.className = 'watermark'
  watermarkEl.setAttribute(
    'style',
    `
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: ${zIndex};
    display: ${show ? 'block' : 'none'};
    width: 100%;
    height: 100%;
    background: url(${imageBase64}) repeat;
    opacity: ${opacity};
    pointer-events:none;
  `
  )
  document.querySelector(container).appendChild(watermarkEl)
}

/**
 * 隐藏水印
 */
function hideWatermark() {
  if (document.querySelector('.watermark')) {
    document.querySelector('.watermark').style.display = 'none'
  }
}

/**
 * 移除水印
 */
function removeWatermark() {
  document.querySelector('.watermark') && document.querySelector('.watermark').remove()
}

export default {
  createWatermark,
  removeWatermark,
  hideWatermark
}

### 实现HTML中的水印效果 要在HTML页面中实现水印效果,可以采用纯前端技术来完成。以下是具体的方法以及其实现细节。 #### 方法一:基于Canvas绘制水印 利用HTML5的`<canvas>`标签可以在图片或者整个网页上动态生成水印[^1]。这种方法具有高度灵活性,支持自定义文字、颜色、透明度等属性。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Watermark Example</title> <style> canvas { position: fixed; top: 0; left: 0; z-index: -1; /* 将画布置于底层 */ pointer-events: none; /* 防止遮挡交互事件 */ } </style> </head> <body> <!-- 页面内容 --> <h1>Hello, Watermark!</h1> <script> function createWatermark() { const watermarkText = 'Sample Watermark'; // 设置水印文本 const fontSize = '20px Arial'; const color = 'rgba(0, 0, 0, 0.2)'; // 半透明黑色字体 const angle = Math.PI / 4; // 斜向角度 (45°) const bodyRect = document.body.getBoundingClientRect(); const width = bodyRect.width; const height = bodyRect.height; const canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; document.body.appendChild(canvas); const ctx = canvas.getContext('2d'); ctx.font = fontSize; ctx.fillStyle = color; ctx.translate(width / 2, height / 2); ctx.rotate(angle); // 绕中心旋转 for (let x = -width * 2; x < width * 2; x += 200) { // 控制水平间距 for (let y = -height * 2; y < height * 2; y += 100) { // 控制垂直间距 ctx.fillText(watermarkText, x, y); } } window.addEventListener('resize', () => location.reload()); // 自适应窗口大小变化 } createWatermark(); // 调用水印函数 </script> </body> </html> ``` 以上代码展示了如何通过JavaScript和Canvas创建斜向排列的文字水印,并将其覆盖在整个页面之上。 --- #### 方法二:使用CSS伪元素模拟水印 如果仅需简单的静态水印,则可以通过CSS伪元素(`:before` 或 `:after`)配合背景图像或渐变色实现[^2]。 ```css /* CSS样式 */ .watermarked-body::before { content: "Sample Watermark"; font-size: 3em; opacity: 0.2; transform: rotate(-45deg); position: absolute; top: 50%; left: 50%; transform-origin: center; } ``` 将上述样式应用于`<body>`或其他容器节点即可显示全局水印[^2]。 --- #### 方法三:借助第三方库简化开发流程 对于更复杂的需求,可引入成熟的开源工具包如`jquery-watermark`或类似的插件[^2]。这些库通常封装好了大部分逻辑,开发者只需配置参数即可快速部署。 ```javascript // 示例调用方式 watermark({ watermark_txt: 'Custom Text', watermark_color: '#aaa' }); ``` 注意,在实际项目中应评估所选方案的技术栈兼容性和性能开销。 --- ### 总结 无论是选择原生JS+Canvas的方式还是依赖于轻量级框架辅助构建,都可以高效达成目标——即为HTML文档增添个性化水印装饰[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值