10 <script type="text/javascript"> 11 function takeScreenshot() { 12 html2canvas(document.getElementById('view')).then(function(canvas) { 13 document.body.appendChild(canvas); 14 }); 15 } 16 </script>
注意canvas直接作参数传入函数:12 html2canvas(document.getElementById('view')).then(function(canvas) {javascript
注意canvas直接被追加到body后面:13 document.body.appendChild(canvas);css
1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="utf-8"> 6 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 7 <title>html2canvas example</title> 8 <script src="html2canvas.min.js"></script> 9 </head> 10 <script type="text/javascript"> 11 function takeScreenshot() { 12 html2canvas(document.getElementById('view')).then(function(canvas) { 13 document.body.appendChild(canvas); 14 }); 15 } 16 </script> 17 <body> 18 <div id="view" style="background:url(test.jpg) 50%; width: 300px; height: 100px;"> 19 <input type="button" value="截图" onclick="takeScreenshot()"> 20 </div> 21 </body> 22 23 </html>
html2canvas是将html代码转换成为图片的插件,本主亲测,以为效果不错,其官网为:http://html2canvas.hertzen.com/html
第一步:将html转化成canvasjava
第一步很简单,只要传入一个元素便可,如:ajax
html2canvas(document.body).then(function(canvas) { document.body.appendChild(canvas); });
注:传入的元素不能是JQ对象而是原生的JS对象。canvas
第二步:将canvas转化为图片api
利用toDataURL方法进行转换:var imageData = canvas.toDataURL("image/jpeg");浏览器
其中,imageData 获得的是一串base64编码。app
第三步:将base64转换成图片文件传给后台dom
编写一个base64编码转换成blob对象的方法:
function getBlobBydataURI(dataURI,type){ var binary = atob(dataURI.split(',')[1]); var array = []; for(var i = 0; i < binary.length; i++) { array.push(binary.charCodeAt(i)); } return new Blob([new Uint8Array(array)], {type:type }); }
发请求:
var formData = new FormData(); var $Blob= getBlobBydataURI(imageData,'image/jpeg'); formData.append('file',$Blob); var timestamp = new Date().getTime(); formData.append('key',timestamp + '.png');//获得以当前时间命名的图片文件 for (var pair of formData.entries()) { if(typeof value == 'object'){ if(value.hasOwnProperty("name")){ pair[1].name = "1.jpg" } } } $.ajax({ url:ip + ' ',//接口 type:'post', data:formData, async: true, crossDomain: true, contentType: false, processData: false, success: function(data){ } });
这样就大功告成了!
以上方法是将当前窗口可视的页面全都给截下来了,若是你想截指定元素的图,那么就把html2canvas(document.body)里面的元素换成指定的元素,可是,有的人会遇到图截不完整咋办?不要着急,这是由于官网上提供的dom抓取不支持高度,会形成只能够截到浏览器可见的,解决的方法是把将要截图的元素克隆一份,放到另外的元素中,设置position: absolute;z-index: 0;z-index要设置到最小便可
var height = $(".oldDiv").height() //克隆节点,默认为false,不复制方法属性,为true是所有复制。 var cloneDom = $(".newDiv").clone(true); //设置克隆节点的css属性,由于以前的层级为0,咱们只须要比被克隆的节点层级低便可。 cloneDom.css({ "background-color": "white", "position": "absolute", "top": "0px", "z-index": "-1", "height": height }); //将克隆节点动态追加到body后面。 $("body").append(cloneDom);
完整的代码以下:
var height = $(".oldDiv").height() //克隆节点,默认为false,不复制方法属性,为true是所有复制。 var cloneDom = $(".newDiv").clone(true); //设置克隆节点的css属性,由于以前的层级为0,咱们只须要比被克隆的节点层级低便可。 cloneDom.css({ "background-color": "white", "position": "absolute", "top": "0px", "z-index": "-1", "height": height }); //将克隆节点动态追加到body后面。 $("body").append(cloneDom); html2canvas(cloneDom[0]).then(function(canvas){ function getBlobBydataURI(dataURI,type){ var binary = atob(dataURI.split(',')[1]); var array = []; for(var i = 0; i < binary.length; i++) { array.push(binary.charCodeAt(i)); } return new Blob([new Uint8Array(array)], {type:type }); } var imageData = canvas.toDataURL("image/jpeg"); var formData = new FormData(); var $Blob= getBlobBydataURI(imageData,'image/jpeg'); formData.append('file',$Blob); var timestamp = new Date().getTime(); formData.append('key',timestamp + '.png');//获得以当前时间命名的图片文件 for (var pair of formData.entries()) { if(typeof value == 'object'){ if(value.hasOwnProperty("name")){ pair[1].name = "1.jpg" } } } $.ajax({ url:api.url, type:'post', data:formData, async: true, crossDomain: true, contentType: false, processData: false, success: function(data){ } }); })
百度网盘下载地址:连接:https://pan.baidu.com/s/1ZZeKdgOu7iJb7Hx1xZEmxg
提取码:jnsr
1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="utf-8"> 6 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 7 <title>html2canvas example</title> 8 <script src="html2canvas.min.js"></script> 9 </head> 10 <script type="text/javascript"> 11 function takeScreenshot() { 12 html2canvas(document.getElementById('view')).then(function(canvas) { 13 document.body.appendChild(canvas); 14 }); 15 } 16 </script> 17 <body> 18 <div id="view" style="background:url(test.jpg) 50%; width: 300px; height: 100px;"> 19 <input type="button" value="截图" onclick="takeScreenshot()"> 20 </div> 21 </body> 22 23 </html>