vue3 添加水印效果

效果图

水印组件

<template>
    <div class="elementdiv" ref="waterMarkRef">
        <slot></slot>
    </div>
</template>

<script setup>
import { ref, onMounted, nextTick } from "vue";
import Watermark from "@/utils/setWaterMark.js";

let waterMarkRef = ref();
onMounted(() => {
    Watermark.set("dong");
});
</script>

<style lang="less" scoped>
.elementdiv {
    width: 100%;
    height: 100%;
}
</style>

引入的 setWaterMark.js

/*水印配置*/
//声明 
let watermark = {}
    //水印配置 
let setWatermark = (str) => {
    let id = '1.23452384164.123412415'
        // 移除水印 判断
    if (document.getElementById(id) !== null) {
        document.body.removeChild(document.getElementById(id))
    }

    //创建画布
    let createCanvas = document.createElement('canvas')
        // 设置canvas画布大小
    createCanvas.width = 250 //宽度
    createCanvas.height = 220 //高度

    //创建Context2D对象作为2D渲染的上下文。
    let Context2D = createCanvas.getContext('2d')
        /*水印样式调整配置*/
    Context2D.rotate(-20 * Math.PI / 100) // 水印旋转角度
    Context2D.font = '20px Vedana' //水印文字大小
    Context2D.fillStyle = '#fff' //水印颜色 HEX格式,可使用red 或者rgb格式
    Context2D.textAlign = 'center' //水印水平位置
    Context2D.textBaseline = 'Middle' //水印垂直位置
    Context2D.fillText(str, createCanvas.width / 3, createCanvas.height / 2)

    //创建元素
    let createDiv = document.createElement('div')
    createDiv.id = id
        //水印默认设置
    createDiv.style.pointerEvents = 'none' //水印层事件穿透 让水印不阻止交互事件
    createDiv.style.top = '70px' //水印顶部距离
    createDiv.style.left = '0px' //水印左侧距离
    createDiv.style.opacity = '0.75' //水印透明度
    createDiv.style.position = 'fixed' //水印定位
    createDiv.style.zIndex = '100000' //水印样式优先显示
    createDiv.style.width = document.documentElement.clientWidth - 100 + 'px' //水印宽度
    createDiv.style.height = document.documentElement.clientHeight - 100 + 'px' //水印高度
    createDiv.style.background = 'url(' + createCanvas.toDataURL('image/png') + ') left top repeat' //水印显示(关键代码)
    document.body.appendChild(createDiv) //在指定元素节点的最后一个子节点之后添加节点
    return id
}

// 此方法只允许调用一次
watermark.set = (str) => {
    let id = setWatermark(str)
        //设置间隔
    setInterval(() => {
            if (document.getElementById(id) === null) {
                id = setWatermark(str)
            }
        }, 500)
        //改变大小时执行
    window.onresize = () => {
        setWatermark(str)
    }
}

export default watermark

父节点

<template>
    <waterMark>
        <div
            @click="dbPosition"
            class="viewer-container"
            :class="{ active: viewerActive }"
            id="viewer-container"
        >
        </div>
    </waterMark>
</template>
<script setup>

import waterMark from "@/components/waterMark.vue";

</script>    

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值