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源码

 

目录
相关文章
|
2天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
23 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
6天前
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
25 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
4天前
|
JavaScript 前端开发
Node.js 中实现多任务下载的并发控制策略
Node.js 中实现多任务下载的并发控制策略
|
25天前
|
JavaScript 前端开发 安全
盘点原生JS中目前最没用的几个功能API
在JavaScript的发展历程中,许多功能与API曾风光无限,但随着技术进步和语言演化,部分功能逐渐被淘汰或被更高效的替代方案取代。例如,`with`语句使代码作用域复杂、可读性差;`void`操作符功能冗余且影响可读性;`eval`函数存在严重安全风险和性能问题;`unescape`和`escape`函数已被`decodeURIComponent`和`encodeURIComponent`取代;`arguments`对象则被ES6的剩余参数语法替代。这些变化体现了JavaScript不断优化的趋势,开发者应紧跟技术步伐,学习新技能,适应新技术环境。
43 10
|
26天前
|
JavaScript 前端开发 测试技术
盘点原生JavaScript中直接触发事件的方式
本文全面探讨了原生JavaScript中触发事件的多种方式,包括`dispatchEvent`、`Event`构造函数、`CustomEvent`构造器、直接调用事件处理器以及过时的`createEvent`和`initEvent`方法。通过技术案例分析,如模拟点击事件、派发自定义数据加载事件和实现提示框系统,帮助开发者掌握这些方法在实际开发中的应用,提升灵活性与兼容性。
35 3
|
1月前
|
JavaScript 前端开发
【Vue.js】监听器功能(EventListener)的实际应用【合集】
而此次问题的核心就在于,Vue实例化的时机过早,在其所依赖的DOM结构尚未完整构建完成时就已启动挂载流程,从而导致无法找到对应的DOM元素,最终致使计算器功能出现异常,输出框错误地显示“{{current}}”,并且按钮的交互功能也完全丧失响应。为了让代码结构更为清晰,便于后续的维护与管理工作,我打算把HTML文件中标签内的JavaScript代码迁移到外部的JS文件里,随后在HTML文件中对其进行引用。
52 8
|
2月前
|
JavaScript 容器
带方向感知功能的js图片遮罩层插件
带方向感知功能的js图片遮罩层插件
|
3月前
|
JavaScript 前端开发 容器
jQuery多功能滑块插件r-slider.js
r-slider.js是一款jQuery多功能滑块插件。使用该插件,可以制作出滑块、开关按钮、进度条、向导步骤等多种效果。
65 5
|
3月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
87 5
|
3月前
|
JavaScript
js实现简洁实用的网页计算器功能源码
这是一款使用js实现简洁实用的网页计算器功能源码。可实现比较基本的加减乘除四则运算功能,界面简洁实用,是一款比较基本的js运算功能源码。该源码可兼容目前最新的各类主流浏览器。
54 2

热门文章

最新文章

  • 1
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    23
  • 2
    Node.js 中实现多任务下载的并发控制策略
    32
  • 3
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    25
  • 4
    【JavaScript】深入理解 let、var 和 const
    48
  • 5
    【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
    44
  • 6
    【03】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架搭建-服务端-后台管理-整体搭建-优雅草卓伊凡商业项目实战
    53
  • 7
    【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
    55
  • 8
    如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
    71
  • 9
    【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
    55
  • 10
    JavaWeb JavaScript ③ JS的流程控制和函数
    62