html2canvas介绍
1、html2canvas的作用就是允许让我们直接在用户浏览器上拍摄网页或其部分的“截图”。
2、常用于网页截图和图片制作。
html2canvas引入
1、请结合loadScript函数使用。
this.utils.loadScript('//g.alicdn.com/platform/c/html2canvas/1.0.0-alpha.12/dist/html2canvas.min.js');
html2canvas使用案例
我们借助html2canvas实现一个简单的截图功能。
1、首先将html2canvas引入,且在页面didMount生命周期调用。
2、复制以下JS。
// URL 转 base64
function loadDataUrl(url, callback) {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.responseType = 'blob';
xhr.send();
xhr.onload = function () {
const reader = new FileReader();
reader.readAsDataURL(xhr.response);
reader.onloadend = function () {
callback(reader.result);
};
};
}
3、页面构成
图片上传组件:最大上传文件个数1、绑定onSuccess回调函数,函数示例如下。
//下述$内唯一标识需修改为你自己当前页面的图片组件
export function onSuccess(file, value) {
let url = value.length > 0 ? location.origin + value[0].url : "";
this.$('image_koi91j89').set("src", url);
}
容器:CSS配置如下,宽高可根据需要自行改变。
:root {
height: 300px;
width: 300px;
align-items: center;
justify-content: center;
display: flex;
overflow: hidden;
}
图片组件:放入上述容器内,宽高配置跟上述容器一致,可根据当前效果自行设置摆放方式。
按钮:绑定下述JS,第2行$内唯一标识需修改为上述容器的唯一标识,27行scale属性可自行修改,为等比放大倍率,scale: 2,最终生成图片宽/高 = 容器宽/高*2。
export function onDownload(ctx) {
const root = ReactDOM.findDOMNode(this.$("div_koi91j88"));
// h2c 对同域图片不加 crossOrigin,但宜搭上传的文件比较特殊,是 302 出来的跨域,
// 因此使用 XHR 转 base64 处理,以避免跨域资源导致污染 canvas 无法导出。
Promise.all(Array.from(root.querySelectorAll('*')).map(el => new Promise(resolve => {
if (~(el.src || '').indexOf(`${location.host}/ossFileHandle`)) {
loadDataUrl(el.src, dataUrl => {
el.src = dataUrl;
resolve();
});
} else {
const bgImg = getComputedStyle(el).backgroundImage || '';
if (~bgImg.indexOf(`${location.host}/ossFileHandle`)) {
loadDataUrl(/url\(['"](.+)['"]\)/.exec(bgImg)[1], dataUrl => {
el.style.backgroundImage = `url(${dataUrl})`;
resolve();
});
} else {
resolve();
}
}
}))).then(() => html2canvas(root, {
width: root.clientWidth,
height: root.clientHeight,
useCORS: true,
allowTaint: false,
scale: 2
}).then(canvas => {
if (!this.utils.isMobile()) {
const a = document.createElement('a');
a.download = '头像.jpg';
a.href = canvas.toDataURL();
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
} else {
const url = canvas.toDataURL('image/jpeg');
this.utils.dialog({
type: 'show',
content: (
<div style={{ height: 'auto', userSelect: 'none', '-webkit-user-select': 'none' }} >
<div
style={{
padding: '0 10px',
color: '#888',
fontSize: '12px', userSelect: 'none'
}}
>
长按下图保存至相册
</div>
<img style={{ width: '100%', userSelect: 'none', tabIndex: "1", borderRadius: '5px', marginTop: '15px', objectFit: 'contain', }} src={url} />
</div>
),
footer: false,
title: '下载海报'
})
}
}));
}
4、效果
PC端:
移动端(钉钉内):
PC钉钉工作台暂不支持