前端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中设置3D变形的transform-style属性详解
May 23 HTML / CSS
html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
Jan 09 HTML / CSS
html5中svg canvas和图片之间相互转化思路代码
Jan 24 HTML / CSS
一波HTML5 Canvas基础绘图实例代码集合
Feb 28 HTML / CSS
canvas 阴影和图形变换的示例代码
Jan 02 HTML / CSS
详解canvas绘制网络字体几种方法
Aug 27 HTML / CSS
html5拖拽应用记录及注意点
May 27 HTML / CSS
如何查看浏览器对html5的支持情况
Dec 15 HTML / CSS
CSS3鼠标悬浮过渡缩放效果
Apr 17 HTML / CSS
CSS几步实现赛博朋克2077风格视觉效果
Jun 16 HTML / CSS
CSS 一行代码实现头像与国旗的融合
Oct 24 HTML / CSS
微信小程序纯CSS实现无限弹幕滚动效果
Sep 23 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
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
用js读、写、删除Cookie代码分享及详细注释说明
2014/06/05 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
举例说明JavaScript中的实例对象与原型对象
2016/03/11 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
2016/05/17 Javascript
javascript入门之string对象【新手必看】
2016/11/22 Javascript
bootstrap模态框消失问题的解决方法
2016/12/02 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
vue获取dom元素注意事项
2017/12/28 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
vue 中Virtual Dom被创建的方法
2019/04/15 Javascript
layui复选框的全选与取消实现方法
2019/09/02 Javascript
jQuery编写QQ简易聊天框
2020/08/27 jQuery
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
[01:10:27]DOTA2-DPC中国联赛正赛 SAG vs XG BO3 第二场 3月5日
2021/03/11 DOTA
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
Python3.2模拟实现webqq登录
2016/02/15 Python
Python实现购物系统(示例讲解)
2017/09/13 Python
python re模块的高级用法详解
2018/06/06 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
python 实现图片裁剪小工具
2021/02/02 Python
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
美国家居装饰和豪华家具购物网站:One Kings Lane
2018/12/24 全球购物
介绍下Java的输入输出流
2014/01/22 面试题
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
会议活动邀请函
2014/01/27 职场文书
《小白兔和小灰兔》教学反思
2014/02/18 职场文书
初中生旷课检讨书范文
2014/10/06 职场文书
公务员考察材料
2014/12/23 职场文书
幼儿教师辞职信
2015/02/27 职场文书
高中班主任心得体会
2016/01/07 职场文书
导游词之山东红叶谷
2019/10/31 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书