使用Canvas绘制页面水印

效果图

在这里插入图片描述

代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<style>
html,body{
    width: 100%;
    height: 100%;
}


</style>

<body >

    <div style="display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;">
        <div>坚持就是胜利</div>
    </div>
    <script>
        // https://www.runoob.com/jsref/dom-obj-canvas.html
        let watermark = {};
        let setWatermark = (str) => {
            let id = '1.23452384164.123412415';
            if (document.getElementById(id) !== null) {
                document.body.removeChild(document.getElementById(id));
            }
            let can = document.createElement('canvas');
            can.width = 350;
            can.height = 120;
            let cans = can.getContext('2d');
            // getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性,可用于在画布上绘制文本、线条、矩形、圆形等等。
            cans.rotate(-20 * Math.PI / 180);
            // Math.PI = 3.14 = 180°  1度
            cans.font = '16px Vedana';
            // Verdana是一套无衬线字体
            // cans.fillStyle = 'rgba(242, 242, 242, 0.10)';
            cans.fillStyle = 'blue'; //方便观看的颜色,正常使用删掉
            cans.textAlign = 'left';
            cans.textBaseline = 'Middle';
            cans.fillText(str, can.width / 20, can.height);
            let div = document.createElement('div');
            div.id = id;
            div.style.pointerEvents = 'none';
            // 元素永远不会成为鼠标事件的target。
            div.style.top = '3px';
            div.style.left = '0px';
            div.style.position = 'fixed';
            div.style.zIndex = '100000';
            div.style.width = document.documentElement.clientWidth + 'px';
            div.style.height = document.documentElement.clientHeight + 'px';
            div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat';
            // left:背景图像在横向上填充从左边开始;
            // background-repeat 背景图像在横向和纵向平铺
            document.body.appendChild(div);
            return id;
        };

        // 该方法只允许调用一次
        watermark.set = (str) => {
            let id = setWatermark(str);
            setInterval(() => {
                if (document.getElementById(id) === null) {
                    id = setWatermark(str);
                }
            }, 2000);
            window.onresize = () => {
                // 当浏览器被重置大小时执行Javascript代码:
                setWatermark(str);
            };
        };
        watermark.set("不必比较,在自己的时区前行")
        // export default watermark;
    </script>
</body>

</html>

项目中使用

  • 把相关js放到 assets 文件夹中
  • 直接引入到mian.js中 import watermark from ‘./assets/js/watermark’;//水印
  • 放到原型上 Vue.prototype.$watermark = watermark;//水印

相关API

Canvas 对象

进阶(Vue中某些页面不想使用水印)

多种方法,下面是其中一种

  • 把上面方法放到自己自定义class类的私有属性上(static)
  • 在私有属性上加个移除DOM的函数
  • 如果想要在某些页面不使用水印,可以监听$route,然后触发函数,判断路由的path然后决定是否加水印或者移除水印
    • $route 作为vue实例的一个响应式属性,是和你在data中写的属性本质上是一样的,都可以通过this的方式拿到。既然你可以监听data中的属性变化,同样也可以监听 $route 的变化。watch中监听的对象默认回调函数中的参数值就是newVal,oldVal。作为 $route 属性来说当然也就是 to 和 from 的概念了。
   watch     : {
        $route(v) {
            this.$_setWatermark(v.path);
        }
    },
    methods   : {
     $_setWatermark(routePath) {
            // 若地址不为登录页和首页,则设置水印
            if (routePath !== '/main/home' && routePath !== '/login') {
                this.$watermark.setWatermark(this.content); //水印
            } else {
                this.$watermark..removeWatermark();
            }
        }
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章