应用场景
H5的分享海报,需要从后台获取数据,绘制DOM,并且可以长按保存。也就是要求所有DOM都要转为image元素。
需要引用的库
html2Canvas: Screenshots with JavaScript 等于是用js去转换指定的DOM成为image。
需要注意的地方
html2Canvas执行渲染时 ,需等待DOM本身获取后台数据的渲染完成。否则会出现黑背景
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| $(window).load(function() { setTimeout(function () { drawCanvas('#sharePoster_bg_img').then(canvas => { const img = new Image(); img.style.display = "block"; img.src = canvas.toDataURL('image/jpeg', 0.92); img.crossOrigin = "Anonymous"; $('#sharePoster_bg_img').html(img); $('.save_text').show(); }) },500) });
|
优化细节 以及 要用到的工具函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
async function drawCanvas(selector) { const dom = document.querySelector(selector); const box = window.getComputedStyle(dom); const width = parseValue(box.width); const height = parseValue(box.height); const scaleBy = DPR(); const canvas = document.createElement('canvas');
canvas.width = width * scaleBy; canvas.height = height * scaleBy; canvas.style.width = `${width}px`; canvas.style.height = `${height}px`; const context = canvas.getContext('2d');
context.scale(scaleBy, scaleBy);
return await html2canvas(dom, {canvas, allowTaint: false, useCORS: true, async: false, width: width, height: height }); }
|
1 2 3 4 5 6 7 8 9 10 11
|
function DPR() { if (window.devicePixelRatio && window.devicePixelRatio > 1) { return window.devicePixelRatio; } return 1; }
|
1 2 3 4 5 6 7 8
|
function parseValue(value) { return parseInt(value, 10); }
|
注意细节:
需绘制的DOM所用到的css属性值最好不用最新的属性,html2Canvas不支持最新的css属性解析,会造成生成的图片有黑色背景。
参考链接:
html2Canvas官网
js资源