一、业务要求
要求前端实现水印功能,且水印的样式(字体大小等)是通过接口返回决定的
二、实现方法
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文件是因为需要动态渲染样式,可以根据自己情况选择方式