当前位置: 首页 > news >正文

js实现一键任意html元素生成截图功能

最近在搞一个项目,用户需要截图datatable表格,表格出现滚动条时,用户需要滚动表格并截图多次,截图大小不一,比较麻烦,于是我实现一键生成html任意元素截图的功能,对于出现滚动条看不见的元素也能生成图片,示例代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.3.3/html2canvas.min.js"></script><title>Canvas to Image</title>
</head>
<body><div id="mydiv" style="background-color:yellow">1</div>
<div id="mydiv2" style="background-color:red">2</div>
<div id="mydiv3" style="background-color:black">3</div>
<div id="mydiv4" style="background-color:purple">4</div><button id="pic_btn">Convert to Image</button><script>$("#pic_btn").click(function(){convert_elements_to_image_and_download(["#mydiv", "#mydiv2", "#mydiv3", "#mydiv4"]);
})async function convert_elements_to_image_and_download(array_ele_selectors, is_vertical=true) {// 元素img data保存列表let array_ele_img_datas = new Array();// 元素img 宽度保存列表let array_ele_img_widths = new Array();// 元素img 高度保存列表let array_ele_img_heights = new Array();for(let i=0; i < array_ele_selectors.length; i++){let selector = document.querySelector(array_ele_selectors[i]);array_ele_img_datas.push(await generate_img_data(selector));array_ele_img_widths.push(get_ele_width(selector));array_ele_img_heights.push(get_ele_height(selector));}let img_data = null;if(is_vertical){//垂直排列合并元素图片img_data = await vertical_merge_elements_pic(array_ele_img_datas,array_ele_img_widths,array_ele_img_heights);}else{console.log("Not support yet!");return false;}download_picture(img_data);
}async function vertical_merge_elements_pic(array_ele_img_datas,array_ele_img_widths,array_ele_img_heights){// 垂直方向合并各个元素图片let total_height = 0;let max_width = 0;for(let i=0; i < array_ele_img_datas.length; i++){total_height += array_ele_img_heights[i];if(max_width < array_ele_img_widths[i]){max_width = array_ele_img_widths[i];}}// 创建canvas元素var canvas = document.createElement('canvas');// 设置canvas的宽高canvas.width = max_width;canvas.height = total_height;// 获取canvas的2D绘图上下文var ctx = canvas.getContext('2d');//在canvas上绘制图片let already_have_height = 0;for(var j=0;j<array_ele_img_datas.length;j++){await new Promise((resolve, reject) => {let tmp_img = new Image();tmp_img.onload = () => {ctx.drawImage(tmp_img, 0, already_have_height);resolve();};tmp_img.onerror = reject;tmp_img.src = array_ele_img_datas[j];});already_have_height += array_ele_img_heights[j];}// 返回合并后的图片return canvas.toDataURL();
}function get_ele_width(element){//获取元素宽度return element.clientWidth;
}function get_ele_height(element){//获取元素高度return element.clientHeight;
}async function generate_img_data(element) {//返回的是图片base64编码try {// html2canvas是异步执行的// 使用await关键字等待html2canvas的Promise完成const canvas = await html2canvas(element);console.log("Canvas generated:", canvas);return canvas.toDataURL();} catch (error) {console.error('Error generating canvas:', error);}
}function download_picture(data_url){// 创建一个a标签用于下载const a = document.createElement('a');a.href = data_url;// 设置下载的文件名a.download = 'screenshot.png';// 触发点击事件a.click();
}</script></body>
</html>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 洛阳建筑设计资质市场未来趋势
  • Web 中POST为什么会发送两次请求
  • Java反射和动态代理用法(附10道练习题)
  • C++ 入门基础:开启编程之旅
  • C语言------指针讲解(2)
  • Facebook未来展望:数字社交平台的进化之路
  • 类与对象-继承-继承语法
  • idea中使用maven
  • react基础样式控制
  • Dav_笔记9:Using Indexes and Clusters之1
  • ROS2 humble使用nav2_map_server保存地图报错:Failed to spin map subscription
  • qt 下拉列表变更事件
  • leetcode-383.赎金信
  • 阿里ChatSDK使用,开箱即用聊天框
  • 前端面试题日常练-day92 【Less】
  • CentOS 7 修改主机名
  • Fabric架构演变之路
  • java取消线程实例
  • Mithril.js 入门介绍
  • python学习笔记-类对象的信息
  • rc-form之最单纯情况
  • react 代码优化(一) ——事件处理
  • spring-boot List转Page
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • vue的全局变量和全局拦截请求器
  • 从重复到重用
  • 检测对象或数组
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 线上 python http server profile 实践
  • 原生 js 实现移动端 Touch 滑动反弹
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 1.Ext JS 建立web开发工程
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 整理一些计算机基础知识!
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #{}和${}的区别是什么 -- java面试
  • (42)STM32——LCD显示屏实验笔记
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (pycharm)安装python库函数Matplotlib步骤
  • (笔记)M1使用hombrew安装qemu
  • (二)丶RabbitMQ的六大核心
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (回溯) LeetCode 131. 分割回文串
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十三)MipMap
  • (十一)图像的罗伯特梯度锐化
  • (算法)N皇后问题
  • (一)VirtualBox安装增强功能
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)平衡树
  • (转载)跟我一起学习VIM - The Life Changing Editor