前端之路:html2canvas脱坑,(图片模糊,多次加载,图片跨域)

本文详细介绍了html2canvas截图插件的使用方法,包括不同版本的特性、参数配置及常见问题解决策略,如图片跨域、模糊问题和版本选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有女票的程序员真的颓废,都不记得多久没写心路历程了(T T).

插件简介:

1.官网:http://html2canvas.hertzen.com/

2.GitHub:https://github.com/niklasvh/html2canvas/

3.版本:(压缩版地址就不贴了)

         0.4.0(https://cdn.bootcss.com/html2canvas/0.4.0/html2canvas.js)  

         0.5.0(https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.js

         1.0.0(http://html2canvas.hertzen.com/dist/html2canvas.js

4.作用:

将页面dom 元素画到  canvas 上,视觉上 达成了   截图的 效果。

该脚本允许您直接在用户浏览器上拍摄网页或其部分的“屏幕截图”。屏幕截图是基于DOM的,因此不可能100%准确到真实的表示,因为它没有生成实际的屏幕快照,而是基于页面上可用的信息构建屏幕快照。

5.使用:

     

0.4 -->    obj=dom对象(要转为图片的对象)

html2canvas(obj,  {
        //参数写这里
        useCORS: true, //使用跨域(当allowTaint为true时这段代码没什么用,下面解释)
        onrendered: function (canvas) {
           //相关操作写在这里。
            //canvas 对象已经画到了这个画布里面。可以对其进行操作
        }
    });


0.5 -->       可以用0.4的写法,也可以用1.0的写法  


1.0 -->  

    html2canvas(translation,
        {
           //参数写这里,参数数组。
           scale: 2,}
        ).then(function(canvas) {
           //相关操作,同上
        });

5.相关参数:

参数名默认介绍
allowTaintfalse是否允许图片跨域(跨域图片会使画布被污染,导致无法操作)
backgroundColortransparent生成的画布背景色,不设置则为透明图
canvasnull可用作绘画基础的存在性容器元素
foreignObjectRenderingfalse是否使用ForeignObject呈现(如果浏览器支持它)
imageTimeout15000加载图像的允许超时时间(以毫秒为单位).0为禁用超时。
ignoreElements(element) => falsePredicate function which removes the matching elements from the render.
loggingtrue为调试目的启用日志记录
onclonenull回调函数,该函数在复制文档以进行呈现时调用,可用于修改将呈现的内容而不影响原始源文档。
proxynull属性的URL。代理用于加载跨原点图像。如果左空,跨原点图像将不会被加载。
removeContainertrue是否清理已克隆的DOM元素-html2画布-临时创建
scalewindow.devicePixelRatio

用于渲染的比例。(值为number,为倍数)。画布宽高,是style中的宽高几倍

(常用于调整清晰度)

useCORSfalse是否尝试使用CORS从服务器加载映像
widthElement width生成画布的宽度
heightElement height生成画布的高度
xElement x-offset偏移量x
yElement y-offset偏移量y
scrollXElement scrollXThe x-scroll position to used when rendering element, (for example if the Element uses position: fixed)
scrollYElement scrollYThe y-scroll position to used when rendering element, (for example if the Element uses position: fixed)
windowWidthWindow.innerWidthWindow width to use when rendering Element, which may affect things like Media queries
windowHeightWindow.innerHeightWindow height to use when rendering Element, which may affect things like Media queries

 

遇到的坑:

1.图片跨域

       尽管不通过 CORS 就可以在画布中使用图片,但是这会污染画布。一旦画布被污染,你就无法读取其数据。例如,你不能再使用画布的 toBlob()toDataURL() 或 getImageData() 方法,调用它们会抛出安全错误。

这种机制可以避免未经许可拉取远程网站信息而导致的用户隐私泄露。

    解决方案:

  1. 是图片服务端设置允许跨域(返回 CORS 头)

  2.html2canvas设置useCORS:true,(图片跨域相关)

  3.allowTaint:false,//允许跨域(图片跨域相关);

 4.转base64

2.图片模糊

该插件绘制图片的时候会模糊,在高分屏下,绘制文字和线条都会出现模糊的现象

解决方案:

canvas的属性widthheight属性放大为2倍(或者设置为devicePixelRatio倍),最后将canvas的CSS样式width和height设置为原先1倍的大小。

例子:<canvas width="400" height="200" style="width: 200px; height: 100px"></canvas>

3.版本问题

0.4 版本,参数设置无效。相关画布属性,得通过dom元素 进行调节。

0.5版本,多次加载,由于换了另一种写法,运用了<iframe>标签进行清晰度优化。导致问题:很多静态资源会被重新request,                  原本10个request,调用一次会多几个request,我这里是惊人的30.调用一两次问题不明显,当需要批量操作时会 页面卡顿,越多越卡。

1.0,版本,同0.5。

解决方案:

批量的时候建议用0.4版本。

调用html2canvas 次数少。建议使用0.5.或者1.0.(推荐0.5,新版具有不稳定性)

 

不知跬步无以至千里。不积小流无以成江海。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值