前端实现水印(可通过接口动态渲染样式)

一、业务要求
        要求前端实现水印功能,且水印的样式(字体大小等)是通过接口返回决定的

二、实现方法
        1、在项目utils文件夹下创建水印对应的js文件,一般工具类文件都可以放在这个文件夹下

         2、js文件就是具体实现水印的代码

'use strict'

const watermark = {}
//sysStyle 就是接口返回的样式对象
const setWatermark = (str, sysStyle) => {
 
  
  can.width = 550  // 单个单位的宽
  can.height =  200 // 单个单位的高
  const cans = can.getContext('2d') // 获取canvas画布
  cans.font = `${sysStyle.fontSize + 'px'} Vedana `// 水印字体样式

  cans.fillStyle = sysStyle.color // 字体颜色
  cans.globalAlpha = sysStyle.transparency / 100 // 透明度
  if (sysStyle.tileManner === '2') {  
    cans.rotate(-20 * Math.PI / 290) // 逆时针旋转π/9
  }
  if (sysStyle.showManner === '1') { // 一个
    cans.textAlign = 'left' // 对齐
    cans.textBaseline = 'M' // 水印基准
    const height = sysStyle.tileManner === '2' ? 300 : 50
    cans.fillText(str, 50, height) // 显示几行几列水印
    const div = document.createElement('div')
    div.id = id
    div.style.pointerEvents = 'none' // 取消所有事件
    if (sysStyle.tileManner === '2') {
      div.style.bottom = '30%'
      div.style.right = '25%'
    } else {
      div.style.bottom = '35%'
      div.style.right = '20%'
    }
    div.style.position = 'fixed'
    div.style.zIndex = '100000'
    div.style.width = document.documentElement.clientWidth - 100 + 'px'
    div.style.height = document.documentElement.clientHeight - 100 + 'px'
    div.style.background = 'url(' + can.toDataURL('image/png') + ') right bottom no-repeat '
    document.body.appendChild(div)
    return id
  } else { // 满屏
    cans.textAlign = 'left' // 对齐
    cans.textBaseline = 'Middle' // 水印基准
    cans.fillText(str, 50, can.height / 1.6) // 显示几行几列水印
    const div = document.createElement('div')
    div.id = id
    div.style.pointerEvents = 'none' // 取消所有事件
    div.style.top = '20px'
    div.style.left = '0px'
    div.style.position = 'fixed'
    div.style.zIndex = '100000'
    div.style.width = document.documentElement.clientWidth - 100 + 'px'
    div.style.height = document.documentElement.clientHeight - 100 + 'px'
    div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat'
    document.body.appendChild(div)
    return id
  }
}

//js文件抛出的入口方法
watermark.set = (str, sysStyle) => {
  let id = setWatermark(str, sysStyle)
  setInterval(() => {
    if (document.getElementById(id) === null) {
      id = setWatermark(str, sysStyle)
    }
  }, 500)
  window.onresize = () => {
    setWatermark(str, sysStyle)
  }
}

export default watermark

        3、js文件要在哪一步生效就在对应页面引入该文件

//引入
import Watermark from '@/utils/watermark.js'

//在文件接口拿到值以后可以调用js抛出的入口方法使水印生效
//具体传参可根据自己的业务调整
Watermark.set(content, sysres.result)

注意:

        水印的设置也可以通过自定义事件实现,该案例使用js文件是因为需要动态渲染样式,可以根据自己情况选择方式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值