前端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 相关文章推荐
HTML5 File接口在web页面上使用文件下载
Feb 27 HTML / CSS
canvas粒子动画背景的实现示例
Sep 03 HTML / CSS
Bootstrap 学习分享
Nov 12 HTML / CSS
html5指南-1.html5全局属性(html5 global attributes)深入理解
Jan 07 HTML / CSS
HTML中fieldset标签概述及使用方法
Feb 01 HTML / CSS
html5 canvas实现圆形时钟代码分享
Dec 25 HTML / CSS
HTML5 CSS3打造相册效果附源码下载
Jun 16 HTML / CSS
让IE下支持Html5的placeholder属性的插件
Sep 02 HTML / CSS
详解快速开发基于 HTML5 网络拓扑图应用
Jan 08 HTML / CSS
HTML中meta标签及Keywords
Apr 15 HTML / CSS
Html5饼图绘制实现统计图的方法
Aug 05 HTML / CSS
几款流行的HTML5 UI框架比较(小结)
Apr 08 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版(5)
2006/10/09 PHP
phpmyadmin的#1251问题
2006/11/25 PHP
thinkphp5使用无限极分类
2019/02/18 PHP
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
ie8本地图片上传预览示例代码
2014/01/12 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
js实现三张图(文)片一起切换的banner焦点图
2015/08/25 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
javascript特殊日历控件分享
2016/03/07 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
使用jQuery如何写一个含验证码的登录界面
2019/05/13 jQuery
原生JS实现留言板功能
2020/02/08 Javascript
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
python3生成随机数实例
2014/10/20 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
python调用opencv实现猫脸检测功能
2019/01/15 Python
python opencv minAreaRect 生成最小外接矩形的方法
2019/07/01 Python
Python笔记之代理模式
2019/11/20 Python
详解KMP算法以及python如何实现
2020/09/18 Python
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
施华洛世奇韩国官网:SWAROVSKI韩国
2018/06/05 全球购物
实现向右循环移位
2014/07/31 面试题
必须要使用游标的SQL语句有那些
2012/05/07 面试题
秋季运动会广播稿大全
2014/02/17 职场文书
优秀技术工人先进材料
2014/02/17 职场文书
土木工程求职信
2014/05/29 职场文书
励志演讲稿800字
2014/08/21 职场文书
重点工程汇报材料
2014/08/27 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript
vue组件冲突之引用另一个组件出现组件不显示的问题
2022/04/13 Vue.js