H5 Canvas实现荣誉证书生成器

没人跟我颁奖,那就自己给自己颁一个吧~

预览

在线链接 https://linyisonger.github.io/H5/22.证书生成器.html
源码地址 https://github.com/linyisonger/H5

功能点

  • 印章绘制

    • QQ 浏览器 PC
  • 个性化编辑
    • QQ 浏览器 PC
  • 延迟预览
    • QQ 浏览器 PC
  • 点击下载
    • QQ 浏览器 PC

写法上没有做很多兼容性的处理,大概写了一下逻辑。

效果

代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><style>.preview {position: relative;display: inline-block;}img {width: 768px;}.name,.detail,.date,.orgs,.colon {position: absolute;font-family: "Microsoft YaHei"}.name {top: 183px;left: 102px;width: 255px;font-size: 27px;line-height: 36px;background-color: transparent;border-bottom-width: 2px;border-bottom-color: #999;border-top-width: 0;border-left-width: 0;border-right-width: 0;text-align: center;outline: none;}.colon {top: 190px;left: calc(107px + 255px);font-size: 27px;font-family: Arial, Helvetica, sans-serif;font-weight: bold;}.detail {top: 237px;left: 94px;height: 90px;width: 559px;background-color: transparent;resize: none;border: none;font-size: 22px;letter-spacing: 4px;outline: none;text-indent: 50px;}.date {top: 432px;right: 130px;font-size: 14px;line-height: 36px;background-color: transparent;border: none;outline: none;}.orgs {top: 356px;right: 147px;width: 180px;background-color: transparent;resize: none;border: none;font-size: 14px;outline: none;text-align: justify;height: 80px;}</style>
</head><body><div class="preview"><img src="./assets/certificate-1.jpg"><input class="name" type="text" placeholder="获奖人" /><span class="colon">:</span><textarea class="detail" placeholder="获奖成就"></textarea><textarea class="orgs" placeholder="颁发机构"></textarea><input class="date" type="text" placeholder="获奖日期" /></div><canvas id="seal" width="200" height="200" style="opacity: 0;"></canvas><canvas id="preview" width="768" height="531"></canvas><script>let certificate = document.getElementsByTagName('img').item(0);/*** 印章的生成*/function seal(s) {// 防止转圈圈if (!s) return;let c = document.getElementById("seal");let ctx = c.getContext("2d");ctx.clearRect(0, 0, c.clientWidth, c.clientHeight);ctx.fillStyle = "rgb(196,38,29)";ctx.strokeStyle = "rgb(196,38,29)";// 印章的外框ctx.beginPath();ctx.lineWidth = 4;ctx.arc(100, 100, 96, 0, 2 * Math.PI);ctx.stroke();// 星星的生成ctx.beginPath();ctx.lineWidth = 1;let star_start_x = 76;let star_start_y = 88;ctx.moveTo(star_start_x, star_start_y)ctx.lineTo(star_start_x + 20, star_start_y)ctx.lineTo(star_start_x + 20 + 7, star_start_y - 20)ctx.lineTo(star_start_x + 20 + 7 + 6, star_start_y)ctx.lineTo(star_start_x + 20 + 7 + 6 + 20, star_start_y)ctx.lineTo(star_start_x + 20 + 7 + 6 + 20 - 16, star_start_y + 13)ctx.lineTo(star_start_x + 20 + 7 + 6 + 20 - 16, star_start_y + 13)ctx.lineTo(star_start_x + 20 + 7 + 6 + 20 - 16 + 5, star_start_y + 13 + 20)ctx.lineTo(star_start_x + 20 + 7 + 6 + 20 - 16 + 5 - 16, star_start_y + 20)ctx.lineTo(star_start_x + 20 + 7 + 6 + 20 - 16 + 5 - 16 - 18, star_start_y + 13 + 20)ctx.lineTo(star_start_x + 20 + 7 + 6 + 20 - 16 + 5 - 16 - 18 + 6, star_start_y + 13)ctx.closePath()ctx.fill();// 印章上旋转的文字ctx.translate(100, 100);ctx.font = '26px Helvetica';let angle = 4 * Math.PI / (3 * (s.length - 1));for (var i = 0; i < s.length; i++) {let c = s[i];if (i == 0) ctx.rotate(.8 * Math.PI);else ctx.rotate(angle);ctx.save();ctx.translate(70, 0);ctx.rotate(Math.PI / 2);ctx.fillText(c, 0, 5);ctx.restore();}// 归位ctx.rotate(-angle * (s.length - 1));ctx.rotate(-.8 * Math.PI);ctx.translate(-100, -100);return c.toDataURL()}// 预览function preview(name, detail, orgs, date) {let c = document.getElementById("preview");let ctx = c.getContext("2d");console.log(certificate);// 证书背景ctx.drawImage(certificate, 0, 0, c.clientWidth, c.clientHeight);console.log("certificate.onload");// 获奖人ctx.font = "22px Microsoft YaHei";ctx.textAlign = "center";ctx.textBaseline = "top";ctx.fillText(name, 102 + 255 / 2, 183);// 冒号ctx.textAlign = "right";ctx.fillText(":", 102 + 255, 183);// 获奖人底线ctx.beginPath();ctx.moveTo(102, 220)ctx.lineTo(102 + 245, 220)ctx.stroke();// 获奖成就let detailX = 147;let detailY = 237;ctx.font = "22px Microsoft YaHei";ctx.textAlign = "left";ctx.textBaseline = "top";for (let i = 0; i < detail.length; i++) {detailX += 32;if (detailX > 640) {detailX = 115;detailY += 32;}ctx.fillText(detail[i], detailX, detailY);if (detail.charCodeAt(i) <= 255) detailX -= 16}// 颁发机构 let orgX = c.clientWidth - 147 - 180;let orgY = 356ctx.font = "14px Microsoft YaHei";ctx.textAlign = "left";ctx.textBaseline = "top";let orgArr = orgs.split(/\n/).map(o => o.trim());for (let i = 0; i < orgArr.length; i++) {ctx.fillText(orgArr[i], orgX, orgY);orgY += 30;let img = new Image();img.src = seal(orgArr[i]);img.onload = function () {ctx.drawImage(img, c.clientWidth - 220 - i * 110, 350, 100, 100);}}// 绘制获奖日期ctx.font = "14px Microsoft YaHei";ctx.textAlign = "left";ctx.textBaseline = "top";ctx.fillText(date, c.clientWidth - 130 - 153, 450);}let timeoutId = null;let nameDom = document.querySelector('.name');let detailDom = document.querySelector('.detail');let orgsDom = document.querySelector('.orgs');let dateDom = document.querySelector('.date');nameDom.addEventListener('input', checkPreview)detailDom.addEventListener('input', checkPreview)orgsDom.addEventListener('input', checkPreview)dateDom.addEventListener('input', checkPreview)// 检查是否需要渲染function checkPreview() {let name = nameDom.value;let detail = detailDom.value;let orgs = orgsDom.value;let date = dateDom.value;clearTimeout(timeoutId);// 允许渲染if (name.trim() && detail.trim() && orgs.trim() && date.trim()) {timeoutId = setTimeout(() => {console.log("渲染");console.log(name, detail, orgs, date);preview(name, detail, orgs, date)}, 1000);}}// 示例function sample() {nameDom.value = `林一怂儿`;detailDom.textContent = "在2021年全国优秀文章中,你以优秀的错别字数量,以及非常离谱的Bug,遥遥领先。特发此证,以资鼓励。";orgsDom.textContent = `全国文章错别字核查中心\n全国离谱到家委员会`dateDom.value = "2021年12月"checkPreview()}let previewDom = document.getElementById("preview");// 下载function download() {let a = document.createElement('a');a.href = previewDom.toDataURL();a.download = "荣誉证书.png";a.click();}previewDom.addEventListener('click', this.download)certificate.onload = function () {sample();}</script>
</body></html>

奇怪的知识点又增加啦~

H5 Canvas实现荣誉证书生成器相关推荐

  1. Java生成荣誉证书PDF文件

    公司最近新需求要针对已经学完课程的同学提供下载结业证书,我们开发小组通过内部协商最终采用pdf方式让用户进行下载.操作pdf java 一般都是通过itext来实现,由于之前没有使用itext生成pd ...

  2. Python 户外俱乐部·登顶纪念证书生成器

    每个周末,我喜欢和户外俱乐部的小伙伴们一起到野外登山徒步,一晃有七.八个年头了.前些天受天行健户外聚乐部群主的委托,要给一批驴友用photoshop制作登顶纪念证书(图片),就是拿来给完成登顶的驴友们 ...

  3. H5 Canvas下雨特效

    模仿下雨的特效,雨点从空中随机飘落. 这个特效使用了H5的新特性Canvas. 效果演示 代码展示 body代码 <!DOCTYPE html> <html lang="e ...

  4. 营业执照psd模板2020_荣誉证书聘书奖状模板,CFR矢量素材PSD源文件,700张精美套用...

    Hello大家好,我是帮帮.今天跟大家分享一组认证荣誉证书聘书奖状模板,CFR矢量素材,PSD源文件,700张精美套用. 为了让大家能更稳定的下载模板,我们又开通了全新下载方式(见文章末尾),以便大家 ...

  5. java使用itextpdf生成PDF批量打印荣誉证书(指定位置输出文字)

    最近公司项目有个需求,批量打印荣誉证书,一开始尝试过传统的网络打印,控件打印,JS调用浏览器打印方法,遇到各种问题,比如定位不准,分页问题,​​缩放问题等.然后就自己研究,整理了一套打印方案,项目已测 ...

  6. html验证码图片,js+h5 canvas实现图片验证码

    本文实例为大家分享了js+h5 canvas实现图片验证码的具体代码,供大家参考,具体内容如下 实现效果 一.使用技术 原生js技术+html5 canvas画图 利用Math.random()函数随 ...

  7. 计算机奖学金用英语怎么说,奖学金证书的翻译,三好学生荣誉证书,优秀学生干部荣誉证书的英语,英语四、六级和计算机证书,辅修证书的英语怎么说, 教学实践单项奖,社会实践单项奖用英语怎么说...

    一.奖学金证书 1. X等优秀学生奖学金(例:一等优秀学生奖学金) CERTIFICATE OF SCHOLARSHIP Mr. 姓名 won the First Prize of Excellent ...

  8. html与css编程证书,利用CSS布局做一个简单的荣誉证书(代码示例)

    本篇文章将给大家介绍如何使用css布局制作一个简单的荣誉证书,有趣且实用,希望对需要的朋友有所帮助! 那么利用css布局实现简单荣誉证书样式的效果是非常简单的,主要用到以下几个基础属性: backgr ...

  9. 至高荣誉:WPS制作荣誉证书(转)

    至高荣誉:WPS制作荣誉证书(转) 每年岁末,单位都要为本年度的先进个人颁发荣誉证书,以示鼓励.商店里卖的证书内页不但千篇一律,内容古板且难合心意,那就自己用WPS 2000自己制作荣誉证书内页吧. ...

最新文章

  1. python搭建博客系统_用Pelican快速搭建极简静态博客系统
  2. VSTO之旅系列(一):VSTO入门
  3. UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理
  4. JWT (Json Web Token)教程
  5. ai驱动数据安全治理_JupyterLab中的AI驱动的代码完成
  6. 【总结整理】JavaScript的DOM事件学习(慕课网)
  7. React 第六章 事件的绑定
  8. 华三 h3c Ftp、Telnet配置
  9. 18.Argument replacement
  10. 转: 在CentOS 6.X 上面安装 Python 2.7.X
  11. plsqldev显示语言有问题
  12. 软件技术基础复习提纲
  13. opencv实现阈值分割
  14. fanuc机器人试题_工业机器人知识要点解析(FANUC机器人)
  15. 微信小程序地图插件系列(一):微信小程序使用高德地图(不定期更新)
  16. uniapp读取和写入文件
  17. 概率论温习-基础概念
  18. cocos creator pc web端 全屏
  19. abaqus个人总结 各种问题各种debug
  20. 2022快手春节跳一跳红包到 怎么获得66元红包?

热门文章

  1. Elsevier 投稿各种状态总结
  2. 蓝桥杯python组一个星期备战记录贴
  3. 【用例设计】文本框测试用例
  4. 任意进制转换为十进制(十六进制转换为十进制)
  5. 基于python的中文词频分析
  6. 三位数求最大公因数c语言,求最大公因数的三种算法
  7. React项目的打包与部署到腾讯云
  8. 树莓派hc+sr501+c语言,树莓派连接人体红外感应模块HC-SR501
  9. 使用 Vue SVG 快速绘制曲线图(带动画)
  10. 一些比较好用的域名信息查询网站