前端canvas水印快速制作(附完整代码)


Posted in HTML / CSS onSeptember 19, 2019

两种水印效果如图:

前端canvas水印快速制作(附完整代码)

前端canvas水印快速制作(附完整代码)

原理解析:

  • 图一斜纹类:创建一个和页面一样大的画布,根据页面大小以及倾斜角度大致铺满水印文字,最后转化为一张图片设为背景
  • 图二倾斜类:将文字倾斜后转化为图片,然后设置背景图片repeat填充整个页面

代码分析:

这里我只简略分析图一斜纹类,事实上这两种方式都较为简单,不需要特别强的canvas基础,只需大概了解就行,直接上完整代码吧

图一

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

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    .water {
      width: 100vw;
      height: 2000px;
      position: absolute;
      top: 0;
      left: 0;
      background-repeat: no-repeat;
    }
    .content {
      width: 800px;
      height: 2000px;
      margin-left: auto;
      margin-right: auto;
      background: cadetblue;
      overflow: hidden;
      
    }
  </style>
  <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
</head>
<body>
  <div class="content">
    <div class="water"></div>
  </div>
  
  <script>
    function addWaterMarker(str) {
      // 这里限制了不超过15个字,实际按需求来
      var cpyName = str;
      if (str.length > 16) {
        cpyName = str.substring(0, 16);
      }
      // 创建 canvas 元素
      var can = document.createElement('canvas');
      // 获取 content 元素
      var report = $('.content')[0]
      // 将 canvas 元素添加到 content 中
      report.appendChild(can);
      // 设置 canvas页面宽度,这里的 800 是因为我司水印文件大小固定,可按需求更改
      can.width = 800;
      // 获取整个body高度
      can.height = document.body.offsetHeight;
      // 隐藏 canvas 元素
      can.style.display = 'none';
      can.style.zIndex = '999'
      // 获取 canvas 元素工具箱
      var cans = can.getContext('2d');
      // 设置文字倾斜角度为 -25 度以及样式
      cans.rotate(-25 * Math.PI / 180);
      cans.font = "800 30px Microsoft JhengHei";
      cans.fillStyle = "#000";
      cans.textAlign = 'center';
      cans.textBaseline = 'Middle';
      // 动态改变字体大小
      if(cans.measureText(cpyName).width > 180) {
        var size = 180 / cpyName.length
        cans.font = '800 ' + size +'px '+ ' Microsoft JhengHei'
      }
      /* 
        双重遍历,
        当 宽度小于页面宽度时,
        当 高度小于页面高度时,
        这里的宽高可以适当写大,目的是为了让水印文字铺满
       */
      for(let i = (document.body.offsetHeight*0.5)*-1; i<800; i+=160) {
        for(let j = 0; j<document.body.offsetHeight*1.5; j+=60) {
          // 填充文字,x 间距, y 间距
          cans.fillText(cpyName, i, j)
        }
      }
      // 将 canvas 转化为图片并且设置为背景
      report.style.backgroundImage = "url(" + can.toDataURL("image/png") + ")";
    }
    addWaterMarker('测试水印');
  </script>
</body>

</html>

图二

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    .water {
      width: 100vw;
      height: 2000px;
      position: absolute;
      top: 0;
      left: 0;
      background-repeat: no-repeat;
    }
    .content {
      width: 800px;
      height: 2000px;
      margin-left: auto;
      margin-right: auto;
      background: cadetblue;
      overflow: hidden;
    }
  </style>
</head>
<body>
    <div class="content">
      <div class="water"></div>
    </div>
  <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
  <script>
    // 添加水印方法
    function addWaterMarker(str) {
      var cpyName = str;
      if (str.length > 16) {
        cpyName = str.substring(0, 16);
      }
      var can = document.createElement('canvas');
      var report = $('.content')[0];
      report.appendChild(can);
      can.width = 180;
      can.height = 110;
      can.style.display = 'none';
      can.style.zIndex = '999'

      var cans = can.getContext('2d');
      cans.rotate(-25 * Math.PI / 180);
      cans.font = "800 30px Microsoft JhengHei";
      cans.fillStyle = "#000";
      cans.textAlign = 'center';
      cans.textBaseline = 'Middle';
      if(cans.measureText(cpyName).width > 180) {
        var size = 180 / cpyName.length
        cans.font = '800 ' + size +'px '+ ' Microsoft JhengHei'
      }
      cans.fillText(cpyName, 60, 100);
      report.style.backgroundImage = "url(" + can.toDataURL("image/png") + ")";
    }
    addWaterMarker('测试水印');
  </script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3中的注音对齐属性ruby-align用法指南
Jul 01 HTML / CSS
使用 css3 transform 属性来变换背景图的方法
May 07 HTML / CSS
纯CSS3实现地球自转实现代码(图文教程附送源码)
Dec 26 HTML / CSS
css3 线性渐变和径向渐变示例附图
Apr 08 HTML / CSS
css3制作彩色边线3d立体按钮的示例(css3按钮)
May 06 HTML / CSS
web页面录屏实现
Feb 12 HTML / CSS
Html5如何唤起百度地图App的方法
Jan 27 HTML / CSS
HTML5的结构和语义(3):语义性的块级元素
Oct 17 HTML / CSS
简单整理HTML5的基本特性和语法
Feb 18 HTML / CSS
HTML5本地存储和本地数据库实例详解
Sep 05 HTML / CSS
html5+css如何实现中间大两头小的轮播效果
Dec 06 HTML / CSS
canvas 橡皮筋式线条绘图应用方法
Feb 13 HTML / CSS
HTML5 Canvas 破碎重组的视频特效的示例代码
Sep 24 #HTML / CSS
HTML5实现的震撼3D焦点图动画的示例代码
Sep 26 #HTML / CSS
基于 HTML5 WebGL 实现的垃圾分类系统
Oct 08 #HTML / CSS
HTML5移动端开发遇见的东西
Oct 11 #HTML / CSS
分享一个页面平滑滚动小技巧(推荐)
Oct 23 #HTML / CSS
分享一个H5原生form表单的checkbox特效代码
Feb 26 #HTML / CSS
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
Jan 08 #HTML / CSS
You might like
php $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
2010/06/21 PHP
ThinkPHP之M方法实例详解
2014/06/20 PHP
给Function做的OOP扩展
2009/05/07 Javascript
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
Node.js中看JavaScript的引用
2017/04/22 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
微信小程序利用canvas 绘制幸运大转盘功能
2018/07/06 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
详解关于JSON.parse()和JSON.stringify()的性能小测试
2019/03/14 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
javascript合并两个数组最简单的实现方法
2019/09/14 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
python抓取文件夹的所有文件
2018/02/27 Python
将python代码和注释分离的方法
2018/04/21 Python
Python实现端口检测的方法
2018/07/24 Python
django项目搭建与Session使用详解
2018/10/10 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
Python Django实现layui风格+django分页功能的例子
2019/08/29 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
pip/anaconda修改镜像源,加快python模块安装速度的操作
2021/03/04 Python
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
博士学位自我鉴定范文
2013/12/26 职场文书
运动会开幕式主持词
2014/03/28 职场文书
开展读书活动总结
2014/06/30 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
群众路线调研报告范文
2014/11/03 职场文书
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
2021/04/12 Python
Python初识逻辑与if语句及用法大全
2021/08/07 Python
使用python求解迷宫问题的三种实现方法
2022/03/17 Python