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 转 base64function 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' }} ><divstyle={{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钉钉工作台暂不支持
