Open Aaaaaaaty opened 7 years ago
不错,html2canvas 我用的也是这个库
@skyshuilan 谢谢~ 本身还想着用canvas原生的方法把html弄进去导出图片,然而感觉好难233
html2canvas 在iphone的safari 截取带有渐变css 的文本 就出错了。但是在PC 跟安卓都没有问题。 是否有对这方面的研究~
@tishoy 嗯这个还真没有哈哈 感觉可能跟canvas只能绘制进一帧有关系,比如gif这种也绘制不进去。也许safari里面对渐变的实现也许会有类似“多帧”的操作~~ 哈哈纯属猜测
你好,我想请教一下,为什么我在Chrome上测试的时候,第一次截图后退出然后再截图的时候,第二次的截图会和第一的重叠
找到解决办法了,在确定点击事件最后一行加上$('body>canvas').remove();就行,每次得到图片后就删除掉canvas,不会引起图片重复
写在最前
记得以前在人人上看到一个分享,讲解基于js的截图方案,详细的不记得了,只记得还挺有意思的貌似用了canvas?所以这次打算自己写一个分享给大家作者的思路。这只是一个很简陋的小demo如有bug请提issues。按照惯例po代码地址;以及作者博客的github仓库,不定期更新中——
效果图
整体思路
1.设置开始/结束快捷键
由于快捷键可能导致的冲突故希望开始快捷键可以不限定快捷键数量,所以在第一个参数中采用了数组的形式进行传递。
2.将的DOM绘制成canvas来覆盖原始DOM界面
如果采用原生的方法可以参照MDN下对于在canvas中绘制DOM的介绍。里面最棘手的地方是你需要创建一个包含XML的SVG图像涉及到的元素为
<foreignObject>
。如何能计算出当前浏览器显示的DOM并且将其提取出来其实是最繁琐的。好的其实作者也没有好的思路手动实现一个=。=,所以选择了这个html2canvas库来完成这件事。大致调用方式如下:3.添加一张canvas模拟鼠标截图区域
这个地方的实现本来打算使用原生canvasAPI,但是里面涉及到一个问题就是在鼠标按下开始拖拽后,canvas要实时绘制,这里面就要引出一个类似于PS图层的概念,每当mousemove的时候都画出一个当前的截图框,但是当下一次触发mousemove的时候就删掉上一个截图框。以此来模拟实时的绘制过程。无奈作者没有找到使用canvas原生API的方法,如果有的话一定告诉我如何对画出的图做出标记。在这里作者使用了一个基于Jq的canvas的库叫做Jcanvas,里面给出了图层的概念,即在一个图层上只能画一张图,同时可以给图层标记名称。这就满足了作者的需求,实现如下:
4.添加一张canvas用来绘制鼠标截图区域对应的浏览器界面
其中通过
drawImage
截取了图像,再使用toDataURL
方法将图像转换为了base64编码5.保存截取的图像
其中用到了a标签的download属性,当用户点击之后就可以直接进行下载。
部署
依赖项
配置快捷键
最后
文中最恶心的地方(DOM写入canvas、canvas设置图层)分别采用了两个库来进行实现,后续作者还会陆续关注如何使用原生API来实现这些操作,虽然个人认为自己写还是有点。。