当需要实现html页面部分模块截图并具有保存图片功能时,前台直接生成截图并下载会方便的多。多的不说,直接看代码
首先我们需要引入2个js文件:

  1. <script type="text/javascript" src="js/html2canvas.js"></script>
  2. <script type="text/javascript" src="js/jquery-1.12.3.min.js"></script>

加入css 样式,主要是生成"X"关闭图片图标:

body{background: #ccc}
#dw{
position: absolute;
left: 18%;
top: 8px;
background: #88f9ab;
width: 60%;
border: 1px solid black;
padding: 16px;
height: 93%;
overflow-y: auto;
z-index: 220;
}
.close{
position:relative;
left: 10px;
width:0.2em;
height:1em;
background: #333;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-o-transform: rotate(45deg);
-ms-transform: rotate(45deg);
transform: rotate(45deg);
display: inline-block;
}
.close:after{
content: "";
position: absolute;
top: 0;
left: 0;
width:0.2em;
height:1em;
background: #333;
-webkit-transform: rotate(270deg);
-moz-transform: rotate(270deg);
-o-transform: rotate(270deg);
-ms-transform: rotate(270deg);
transform: rotate(270deg);
}
#imgcanvas{
width: 100%;
height:100%;
overflow-y: auto;
background: #fff;
max-height: 4020px;
margin: 0 auto;
}
.offno{
width: 23px;
height: 23px;
position: absolute;
top: 1px;
right: 0px;
}

  1.  

写入随便div 模块,我随便位置给的点击截图按钮

  1.  

<div style="background: red;width: 68px;text-align: center;" onclick="doScreenShot()">截图</div>
<!-- 要截图的div sfeg -->
<div id="main" style="width: 98%;padding: 50px;background: #5a90a0">
  <div id="sfeg" style="width: 800px;max-height: 2000px;overflow: auto;background: #fff"> </div>
</div>
<!--展示的div-->
<div id="dw" >
  <div class="offno" title="关闭" onclick="closeok()"><div class="close"></div></div>
  <div id="imgcanvas"></div>
</div>

先初始化执行:

  1. (function start(){
  2. $("#dw").hide();
  3. var maindiv=document.getElementById('sfeg');
  4. for(var i=0;i<20;i++){
  5. var jeq='<div style="margin:4px 2px auto;background:blue;width:300px;height:60px">'+i+'</div>';
  6. $(maindiv).append(jeq);
  7. }
  8. }
  9. ())

通过for循环主要是生成一个很长的div。然后截取这个div元素

截取的js代码如下:

  1. //截图
  2. function doScreenShot(){
  3. $("#dw").show();
  4. $("#imgcanvas").empty();
  5. html2canvas($("#sfeg"), {
  6. onrendered: function(canvas) {
  7. canvas.id = "mycanvas";
  8. var mainwh=$("#main").width();//获取元素的宽
  9. var mainhg=$("#main").height(); //获取元素高,若是做长图可以将此参数传递给canvas的高
  10. var img = convertCanvasToImage(canvas);
  11.  
  12. $("#imgcanvas").append(img) ; //添加到展示图片div区域
  13. img.onload = function() {
  14. img.onload = null;
  15. canvas = convertImageToCanvas(img, 0, 0, mainwh, mainhg); //设置图片大小和位置
  16. img.src = convertCanvasToImage(canvas).src; //重新给了一个路径,若不需要,则和上面那句都可以注释掉。
  17. $(img).css({
  18. background:"#fff"
  19. });
  20. //调用下载方法
  21. if(browserIsIe()){ //假如是ie浏览器
  22. DownLoadReportIMG('下载.jpg',img.src);
  23. }else{
  24. download(img.src) //下载图片
  25. }
  26. }
  27. }
  28. });
  29. }
  30. //绘制显示图片
  31. function convertCanvasToImage(canvas) {
  32. var image = new Image();
  33. image.src = canvas.toDataURL("image/png"); //生成图片地址
  34. return image;
  35. }
  36. //生成canvas元素
  37. function convertImageToCanvas(image, startX, startY, width, height) {
  38. var canvas = document.createElement("canvas");
  39. canvas.width = width;
  40. canvas.height = height;
  41. canvas.getContext("2d").drawImage(image, startX, startY, width, height, 0, 0, width, height);//在这调整图片中内容的显示(大小,放大缩小,位置等)
  42. return canvas;
  43. }// 另存为图片
  44. function download(src) {
  45. var $a = $("<a></a>").attr("href", src).attr("download", "img.png");
  46. $a[0].click();
  47. }
  48. //判断是否为ie浏览器
  49. function browserIsIe() {
  50. if (!!window.ActiveXObject || "ActiveXObject" in window)
  51. return true;
  52. else
  53. return false;
  54. }

单另更新ie兼容,下载64Base图片:

  1. function DownLoadReportIMG(fileName,imgPathURL) {
  2. var blob = base64Img2Blob(imgPathURL);
  3. //ie11及以上
  4. window.navigator.msSaveBlob(blob, fileName);
  5. }
  6. function base64Img2Blob(code){
  7. var parts = code.split(';base64,');
  8. var contentType = parts[0].split(':')[1];
  9. var raw = window.atob(parts[1]);
  10. var rawLength = raw.length;
  11. var uInt8Array = new Uint8Array(rawLength);
  12. for (var i = 0; i < rawLength; ++i) {
  13. uInt8Array[i] = raw.charCodeAt(i);
  14. }
  15. return new Blob([uInt8Array], {type: contentType});
  16. }

解释说明:这里核心截图代码是

html2canvas(dom, {  onrendered: function(canvas) {})方法,是插件提供的。其中:dom是你要截图的元素模块

它的作用是把这个参数canvas形成一个img图片元素。调用的是单另的convertCanvasToImage()方法,

其中: image.src = canvas.toDataURL("image/png");这句就是生成图片的地址。而这个图片就是截取的你的那个元素,有了图片地址就很好办了。我只是把它添加到id=“imgcanvas

”这个元素中提供展示效果。

后面给图片加载方法:onload ()在其中添加属性撒的,自动执行下载方法:区分了ie浏览器(估计这个ie兼容不太好找,我之前写的没有用,也没测试,现在更新好了),还有我直接生成的下载方法download()

。关于下载方法很多,你们随意选。

效果图:绿色区域是展示区,其中图片很长,我用滚动条展示了。

本文为作者原创,如有转载请标明文章出处:
http://www.cnblogs.com/mobeisanghai/p/7682463.html
作者:漠北桑海

 

js 实现div模块的截图并下载功能(可制作长图)的更多相关文章

  1. cropper.js 二次开发:截图并下载图片

    cropper.js 是一个基于jquery的图片截取库. 参考:https://blog.csdn.net/weixin_38023551/article/details/78792400 我的代码 ...

  2. js 利用canvas + flv.js实现视频流 截屏 、本地下载功能实现,兼容火狐,谷歌;canvas截屏跨域问题,无音频视频流加载不显示问题

    项目:物联网监控项目----后台视频流管理(前端实现视频截屏功能) 本文就不同视频源分情况展示: 1 本地视频(项目同目录视频)截屏(canvas.getContext("2d).drawI ...

  3. 利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)

    对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素.若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了. WebDriver.Phant ...

  4. JS实现多Div模块拖拽功能

    空闲时间,同事让帮忙整个JS拖拽div模块功能.于是便在网上搜索,总结如下一个可实现多div模块拖拽的功能.一下是整体的HTML代码, 里边可以控制到 拖拽开始(onStart),拖拽时候(onMov ...

  5. JS控制div跳转到指定的位置的解决方案总结

    总结一下自己在写这个需求遇到的问题,相信大家应该是经常遇到的.即要求滚轮滚动到指定的位置.先看下基本的解决方案. 1.给链接a加个#的方式来实现跳转.(锚点方法)这里直接贴下代码: html页面: & ...

  6. js 控制Div循环显示 非插件版

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. JS控制DIV隐藏显示

    转载自:http://blog.sina.com.cn/s/blog_6c3a67be0100ldbe.html JS控制DIV隐藏显示 一,需求描述: 现在有3个DIV块,3个超链接,需要点击一个链 ...

  8. 《深入浅出node.js(朴灵)》【PDF】下载

    <深入浅出node.js(朴灵)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062563 内容简介 <深入浅出Node. ...

  9. node.js中express模块创建服务器和http模块客户端发请求

    首先下载express模块,命令行输入 npm install express 1.node.js中express模块创建服务端 在js代码同文件位置新建一个文件夹(www_root),里面存放网页文 ...

随机推荐

  1. 【Jquery系列】详解Jquery对象和Dom对象

    问题描述 本篇文章主要讲解Jquery对象和DOM对象,主要围绕如下五个方面来介绍: Jquery对象和dom对象定义 Jquery对象与dom对象区别 Jquery对象及运用举例 dom对象及运用举 ...

  2. SAP开发快捷键

    F1 帮助     F2 回车确认(在某些地方可用,比如ABAP)     F3 返回     F4 选择输入项     F5 新增     F6 复制为...     F7 全选     F8 选择 ...

  3. IntelliJ下断点不可用 No executable code found

    情景说明:ant工程+IntelliJ Idea 采取copy编译后的class文件到WEB-INF/classes目录下,断点一直不可用 如图: 网上查了很多资料都说的不够明确,IntelliJ社区 ...

  4. Cloud9 on Docker镜像发送

    老外有做过几个cloud9的镜像,但是都有各种各样的问题. 小弟在此做了一个docker镜像,特此分享,希望各位大佬多提宝贵意见.谢谢. Cloud9 Online IDE Coding anywhe ...

  5. Android的主线程和子线程

    在一个Android 程序开始运行的时候,会单独启动一个Process.默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的Co ...

  6. sqoop1.4.6导出oracle实例

    1.导入odbj6.jar到$SQOOP_HOME/lib目录下. 2.sqoop import --append --connect jdbc:oracle:thin:@219.216.110.12 ...

  7. VMware驱动程序"vmci.sys"的版本不正确 怎么解决

    解决办法: 1.创建好虚拟机之后,别打开电源,然后到建好的虚拟机文件夹里: 2.找到后缀vmx的文件,记事本打开: 3.找到vmci0.present='TRUE',把true改为false: 4.保 ...

  8. C# group 子句

    group 子句返回一个 IGrouping<TKey,TElement> 对象序列,这些对象包含零个或更多与该组的键值匹配的项. 例如,可以按照每个字符串中的第一个字母对字符串序列进行分 ...

  9. display: run-in

    If a sibling block box (that does not float and is not absolutely positioned) follows the run-in box ...

  10. 使用mitmproxy嗅探双向认证ssl链接——嗅探AWS IoT SDK的mqtts

    亚马逊AWS IoT使用MQTTS(在TLS上的MQTT)来提供物联网设备与云平台直接的通信功能.出于安全考虑,建议给每个设备配备了证书来认证,同时,设备也要安装亚马逊的根证书:这样,在使用8883端 ...