JS - 原生js实现 网页截图(+下载截图) 功能

简介: 实现:html2canvas + canvas.toDataURL首先,引入依赖插件:import { html2canvas } from './html2canvas';html2canvas截图模糊处理:  1 /*图片跨域及截图模糊处理*/ 2 let canvasContent = document.

实现:html2canvas + canvas.toDataURL

首先,引入依赖插件:

import { html2canvas } from './html2canvas';

html2canvas截图模糊处理:

 

 1 /*图片跨域及截图模糊处理*/
 2 let canvasContent = document.getElementById('canvas'),//需要截图的包裹的(原生的)DOM 对象
 3     width = canvasContent.clientWidth,//canvasContent.offsetWidth || document.body.clientWidth; //获取dom 宽度
 4     height = canvasContent.clientHeight,//canvasContent.offsetHeight; //获取dom 高度
 5     canvas = document.createElement("canvas"), //创建一个canvas节点
 6     scale = 4; //定义任意放大倍数 支持小数
 7 canvas.width = width * scale; //定义canvas 宽度 * 缩放
 8 canvas.height = height * scale; //定义canvas高度 *缩放
 9 canvas.style.width = canvasContent.clientWidth * scale + "px";
10 canvas.style.height = canvasContent.clientHeight * scale + "px";
11 canvas.getContext("2d").scale(scale, scale); //获取context,设置scale

 

 

opts配置:

 

1 let opts = {
2     scale: scale, // 添加的scale 参数
3     canvas: canvas, //自定义 canvas
4     logging: false, //日志开关,便于查看html2canvas的内部执行流程
5     width: width, //dom 原始宽度
6     height: height,
7     useCORS: true // 【重要】开启跨域配置
8 };
9 //部分配置,其他另配

 

使用:

 1 let shareContent = document.getElementById('XXX');
 2 export let html = (type,toDown=false) =>{
 3   html2canvas(domContent,opts).then(function(canvas){
 4     let imgUrl =  canvas.toDataURL('image/' + type);
 5     if(toDown){
 6       window.location.href = imgUrl;
 7     }else{
 8       return imgUrl;
 9     }
10   });
11 }

 

调用

1 html('jpg') //只获取base64后的jpg图片地址
2 html('png',true) //下载png格式的图片功能

 

仓促记录,待完善和测试

 html2canvas依赖

/*!
* html2canvas 1.0.0-alpha.12 <https://html2canvas.hertzen.com>
* Copyright (c) 2018 Niklas von Hertzen <https://hertzen.com>
* Released under MIT License
*/
1 import html2canvas from 'html2canvas/dist/html2canvas.min';
2 export { html2canvas };
 1 /*
 2  * @Author: guojufeng@ 
 3  * @Date: 2017-12-25 15:18:12
 4  * html2image模块
 5  * @param {object=} parameter 参数配置
 6  * @param {string} parameter.targetEleId: 目标元素id--要截屏的区域
 7  * @param {string} parameter.imgType: 要保留下来的图片格式:png|jpg|bmp|gif
 8  * @param {Boolean} toDown: 是否执行下载功能,不执行则返回图片base64地址
 9 */
10 import { html2canvas } from './html2canvas';
11 export let html2img = (parameter,toDown = true)=> {
12   const promise = new Promise((resolve,reject)=>{
13     if(parameter.imgType == 'png' || parameter.imgType == 'jpg' || parameter.imgType == 'bmp' || parameter.imgType == 'gif'){
14       let type = parameter.imgType;
15       /**
16       * 获取mimeType
17       * @param  {String} type the old mime-type
18       * @return the new mime-type
19       */
20       const _fixType = function(type) {
21           type = type.toLowerCase().replace(/jpg/i, 'jpeg');
22           let r = type.match(/png|jpeg|bmp|gif/)[0];
23           return 'image/' + r;
24       };
25       /*图片跨域及截图模糊处理*/
26       let shareContent = parameter.targetEleId,//需要截图的包裹的(原生的)DOM 对象
27           width = shareContent.clientWidth,//shareContent.offsetWidth; //获取dom 宽度
28           height = shareContent.clientHeight,//shareContent.offsetHeight; //获取dom 高度
29           canvas = document.createElement("canvas"), //创建一个canvas节点
30           scale = 4; //定义任意放大倍数 支持小数
31       canvas.width = width * scale; //定义canvas 宽度 * 缩放
32       canvas.height = height * scale; //定义canvas高度 *缩放
33       canvas.style.width = shareContent.clientWidth * scale + "px";
34       canvas.style.height = shareContent.clientHeight * scale + "px";
35       canvas.getContext("2d").scale(scale, scale); //获取context,设置scale 
36       let opts = {
37           scale: scale, // 添加的scale 参数
38           canvas: canvas, //自定义 canvas
39           logging: false, //日志开关,便于查看html2canvas的内部执行流程
40           width: width, //dom 原始宽度
41           height: height,
42           useCORS: true // 【重要】开启跨域配置
43       };
44       html2canvas(shareContent,opts).then(function(canvas) {
45         let imgData = canvas.toDataURL(type)
46         let save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
47         save_link.href = imgData.replace(_fixType(type),'image/octet-stream');
48         if(toDown){
49           let link_title = parameter.titleStr ? parameter.titleStr + '_' : 'easypass_';
50           save_link.download = link_title + (new Date()).getTime() + '.' + type;
51           let event = document.createEvent('MouseEvents');
52           event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
53           save_link.dispatchEvent(event);
54         }else{
55           resolve(save_link.href);
56         }
57       }); 
58     }else{
59       reject(new Error('parameter.imgType 类型错误,应该是字符串,且只有四种类型值。'));
60     }
61   });
62   return promise;
63 }
html2img源码

 

目录
相关文章
|
1月前
|
存储 JavaScript 前端开发
使用JavaScript构建动态交互式网页:从基础到实践
【10月更文挑战第12天】使用JavaScript构建动态交互式网页:从基础到实践
77 1
|
16天前
|
JavaScript
js实现简洁实用的网页计算器功能源码
这是一款使用js实现简洁实用的网页计算器功能源码。可实现比较基本的加减乘除四则运算功能,界面简洁实用,是一款比较基本的js运算功能源码。该源码可兼容目前最新的各类主流浏览器。
24 2
|
14天前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
24 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
1月前
|
存储 JavaScript 前端开发
【JavaScript】网页交互的灵魂舞者
本文介绍了 JavaScript 的三种引入方式(行内、内部、外部)和基础语法,包括变量、数据类型、运算符、数组、函数和对象等内容。同时,文章还详细讲解了 jQuery 的基本语法和常用方法,如 `text()`、`html()`、`val()`、`attr()` 和 `css()` 等,以及如何插入和删除元素。通过示例代码和图解,帮助读者更好地理解和应用这些知识。
16 1
【JavaScript】网页交互的灵魂舞者
|
1月前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
|
1月前
|
JavaScript 前端开发 API
|
1月前
|
JavaScript API UED
vue.js怎么实现全屏显示功能
【10月更文挑战第7天】
20 1
|
1月前
|
JavaScript 搜索推荐
JS中的模糊查询功能
JS中的模糊查询功能
29 1
|
1月前
|
前端开发 JavaScript
使用 JavaScript 实现图片预览功能
使用 JavaScript 实现图片预览功能
29 0
|
存储 前端开发 JavaScript
下一篇
无影云桌面