前端水印优点

  • 速度快
  • 减少服务器压力
  • 简单

实现方式

这里采用的是svg的写法,大概的一个想法就是用svg写水印然后覆盖整个网站
前端写水印有两个要解决的问题:一个是防止有人控制台删除此水印相关代码;另一个是当水印覆盖整个网站的时候,网站的事件按钮被覆盖失效的问题。
看到这里可以先思考这两个问题,然后看下面额实现代码

项目环境

react

实现效果

这是公司的项目,只能截取一部分给大家看看了

实现代码

组件: waterMark.js

import React, { Component } from 'react'
import MutationObserver from 'react-mutation-observer';class Watermark extends Component {constructor(props) {super(props);this.state = {waterMarkStyle: '180px  120px',isError: false}}callback = (records) => {// outerHTMLif(records.child){let child = records.childdocument.getElementById('***').parentNode.appendChild(child)}}render() {const { waterMarkStyle } = this.stateconst { text = '测试水印', content } = this.props;const boxStyle = {backgroundSize: waterMarkStyle,backgroundImage: `url("data:image/svg+xml;utf8,<svg width=\'100%\' height=\'100%\' xmlns=\'http://www.w3.org/2000/svg\' version=\'1.1\'><text width=\'100%\' height=\'100%\' x=\'20\' y=\'68\'  transform=\'rotate(-20)\' fill=\'rgba(0, 0, 0, 0.2)\' font-size=\'14\' stroke=\'rgba(255, 255, 255, .2)\' stroke-width=\'1\'>${text}</text></svg>")`,};return (<MutationObserver onChildRemoval={this.callback}><div className={'water_mark_wrapper'} ><div className={'water_mark_box'} style={boxStyle} />{content}  // content主要是要应用水印的节点部分</div></MutationObserver>);}
}export default Watermark

水印核心代码,主要是svg文本部分

<svg width=\'100%\' height=\'100%\' xmlns=\'http://www.w3.org/2000/svg\' version=\'1.1\'><text width=\'100%\' height=\'100%\' x=\'20\' y=\'68\'  transform=\'rotate(-20)\' fill=\'rgba(0, 0, 0, 0.2)\' font-size=\'14\' stroke=\'rgba(255, 255, 255, .2)\' stroke-width=\'1\'>${text}</text></svg>

大概看一下代码,然后我们这边来解释一下上面提到的两个问题
首先是防止删除
我这里引用了一个react-mutation-observer,如果你不是写的react,可以看看原生的,用法其实一样的。这个东西的用法就是可以帮你监听某个节点是否发生了变更,我这里的思路是当它被删除的时候,触发callback方法,callback方法会帮我重新把这个被删除的水印,重新添加进去

callback = (records) => {// records.child就是被删除的水印所在节点if(records.child){let child = records.child// 这里可以根据实际需求来看要如何添加document.getElementById('***').parentNode.appendChild(child)}}

防止删除问题解决了,一顿操作,发现页面的事件按钮点击不了,被层级高的水印覆盖了,这时候只需要一行css解决
style.css

.water_mark_wrapper{position: relative;
}.water_mark_box{position: absolute;top: 0;left: 0;width: 100%;height: 100%;z-index: 9999;pointer-events: none;  // 关键代码
}

使用组件

因为我的水印在网站的每个页面都需要,所以在app.js页面用了
app.js

import React from 'react';
import Watermark from './components/watermark'
import Main from './routes/index'class App extends React.Component {render() {return (<div className="App"><Watermark content={<Route path="/" component={Main} />}></Watermark></div>);}
}export default App;

总结

其实如果粗暴点解决的话,可以直接禁止打开浏览器控制台,就可以避免各种删除等操作。

  • 参考文章
    水印实现的几种方式

前端--网站水印实现相关推荐

  1. Tomcat 配置 项目 到tomcat目录外面 和 域名绑定访问(api接口、前端网站、后台管理网站)...

    先停止tomcat服务 1.进入apache-tomcat-7.0.68/conf/Catalina/localhost(如果之前还都没有启动过tomcat,是不会有此目录的,先启动一次再关闭,会自动 ...

  2. 前端flv.js设置缓冲时间和大小_不可不知的 WEB 前端网站优化 —— 雅虎 34 条军规...

    不可不知的 WEB 前端网站优化 -- 雅虎 34 条军规 不得不说现在依然适用于大部分的网站 当年雅虎推荐了一套优化网站加载速度的34条法则(包括Yslow规则22条),以下是详细说明. 1. Mi ...

  3. PerfMap – 显示前端网站性能的热力图插件

    PerfMap 是用来分析前端性能,基于资源定时 API 生成网页资源加载的前端性能热图.热图的颜色和第一个毫秒值指示在什么时候页面的图像加载完毕,这是用户体验的一个很好的指标.括号中的第二个值是浏览 ...

  4. nginx配置前端网站

    原文链接:nginx配置前端网站 0.前言 上面一篇文章中,简单介绍了windows下下载安装nginx.这篇文章继续介绍下nginx下配置前端网站等. 1.配置文件 nginx的配置文件在下面的目录 ...

  5. 前端网站资源精编!!

    前端网站资源精编!! 目录: 1-------- 走进前端 2-------- jQuery 3-------- CSS 4-------- Angularjs 5-------- ES6 6---- ...

  6. 前端-网站性能优化——CDN加速

    前端-网站性能优化--CDN加速 网站性能优化是一个大活儿,按工种划分的话,分前端.后端和db等,作为一名前端工程师,这系列文章只聊前端工程师应该知道的关于网站性能优化的那些事儿.写此文章算是一个工作 ...

  7. 纯前端网站的上传(3free免费空间)教程

    纯前端网站的上传(3free免费空间)教程 一.8u-ftp 首先下载一个8UFTP,安装好之后先不用管. 二.3free 1.打开3free的官网,点击注册. 2.姓名那可以随便填 3.之后点击激活 ...

  8. 前端网站学习网站整理

    从网上搜罗的自己认为还不错的各种前段学习网站:包括视频网站.博客网站 1. 前端网 里面包括一些前端网站常用的工具下载,视频学习,除此之外我很 喜欢这里面的笔记功能,自己当天学习到的内容可以存到自己的 ...

  9. web页面--前端明水印

    采用canvas绘制图片,observe监听页面元素改变重新添加. 实现一个这种水印: <template><div id="water_mater" ref=& ...

最新文章

  1. 周志华、张潼亲自辅导AI课程,DeeCamp 2019正式启动
  2. Java知识系列 -- 反射
  3. 嵌入式Linux USB驱动开发之教你一步步编写USB驱动程序
  4. eclipse mac 下载php文件夹,PHP Pydev Eclipse (linux or mac)
  5. Redis源码编译安装
  6. 20080331 - What is a PID, How is it useful when troubleshooting a system
  7. 祝福!微软 46 周年生日快乐!
  8. 阿里达摩院-视觉方向(校招、社招、实习),欢迎各路大神
  9. c++解析xml文件_XML文件解析实践(DOM解析)
  10. 每日算法系列【LeetCode 309】最佳买卖股票时机含冷冻期
  11. 【TDA4系列】Linux SDK安装与交叉编译测试,以及刷写SD卡
  12. RedHat7 安装 MySQL 5.7
  13. 第七章——ICell的常用属性与方法
  14. 长期对着电脑的人保护颈椎
  15. 解决rk3288 摄像头顿卡问题解决过程
  16. Oracle 存储过程详解(上)
  17. Visio调整背景大小
  18. 三、Git本地仓库基本操作——git仓库忽略跟踪文件
  19. 模式先行区块链商城将颠覆传统商城
  20. 如何构建智能车联网主动防御体系

热门文章

  1. shell脚本--while循环
  2. 关于Jupyter Notebook No module named ‘xxx’ 问题解决
  3. Chrome浏览器安装路径移动与错误代码释义
  4. SLB优雅的滚动发布
  5. 一个人企业可以申请几个百度熊掌号?
  6. mysql replicate-rewrite-db_replicate-rewrite-db和Replicate_Wild_Do_Table实现表级别映射复制
  7. Java语言可以开发人工智能吗
  8. 拉勾网-深圳福利待遇词云
  9. java url转urf8_怎么把图片路径64位编码的转化成正常的路径,不编码的
  10. 对口单招计算机原理提纲,对口单招计算机原理计算专题练习.docx