使用canvas生成水印watermark,有详细注释,简单易懂

大家好,我是小梅,公众号:「小梅的前端之路」 原创作者。

作为在前端领域不断探索的一员,在此记录开发中遇到的问题,如果你也遇到了相同的问题,希望本文对你有帮助。


直接上代码,生成水印的js文件:

// const watermark = {}
// 定义设置水印的方法,
const watermarkFun = () => {
  // 如果水印元素已经存在就先移走,重新生成, id要是全局独一无二的
  const id = '3.14159261111'
  if (document.getElementById(id) !== null) {
    document.body.removeChild(document.getElementById(id))
  }
  // 第一步:生成cavas元素,使用canvas, 绘制水印
  const str = '我是水印ya'
  const canvasEle = document.createElement('canvas')
  // 设置单个水印元素的宽高,这决定了页面水印的密度,需要更具水印文字的大小以及长度设置合理的值
  canvasEle.width = 200
  canvasEle.height = 100
  const ctx = canvasEle.getContext('2d') // 绘制2d图形
  ctx.rotate(-20 * Math.PI / 180)// 设置水印元素的倾斜, 这一行代码要写在设置水印文字之前,涉及样式的都写在设置水印文字之前
  ctx.font = '16px serif' // 设置水印文字的大小和字体
  ctx.fillStyle = 'rgba(200, 200, 200, 0.8)' // 设置水印文字的颜色
  ctx.textAlign = 'left' // 文本左对齐
  ctx.fillText(str, canvasEle.width / 16, canvasEle.height / 2) // 设置水印文字

  // 第二步:把canvas转化为一张图片,作为背景图,添加到div
  const divEle = document.createElement('div')
  divEle.id = id
  divEle.style.width = document.documentElement.clientWidth - 10 + 'px' // 设置div元素的宽高
  divEle.style.height = document.documentElement.clientHeight - 20 + 'px'
  divEle.style.pointerEvents = 'none' // 元素永远不会成为鼠标事件的target
  divEle.style.position = 'fixed' // 固定定位, 让元素撑满整个可视区域
  divEle.style.top = '3px'
  divEle.style.left = '5px'
  divEle.style.background = 'url(' + canvasEle.toDataURL() + ') left top repeat' // 水印图片做div的背景,并且重复,这样看起来就是满屏都是水印
  divEle.style.zIndex = 999999 // 水印元素的权值设得大一些,以此来遮盖所有的元素
  // 第三步:div添加到body元素,水印生成
  document.body.appendChild(divEle)
  return id
}
// 设置水印,就调用这个方法
watermarkFun()
// 页面发生缩放,重绘水印
window.onresize = () => {
  watermarkFun()
}
// watermark.set = () => {
//   watermarkFun()
//   // 页面发生缩放,重绘水印
//   window.onresize = () => {
//     watermarkFun()
//   }
// }
// export default watermark

引用水印js的html文件: 

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
243254
<div style="margin-top: 200px; margin-left: 500px;">
  hhhsdf
  <button onclick="alert('do click')">dianji</button>
</div>
<script src="./test11.js"></script>
<!--<script type="module">-->
<!--import watermark from './test11.js';-->

<!--  console.log(123, watermark.set())-->
<!--</script>-->
</body>
</html>

页面效果图:


❤️欢迎素质三连[点赞 + 收藏 + 评论]

我是小梅,有兴趣的话可以在微信搜一搜「小梅的前端之路」第一时间接收文章更新通知,一起沟通、学习成长呀。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值