在 H5 活动页开发中,有时候运营希望实现“截屏出图”进行朋友圈分享的功能,比如我们熟悉的“长按页面保存为图片”,那这时就可以使用html2canvas来实现了。
一. 基础介绍
是什么?
html2canvas 是一个 HTML 渲染器。该脚本允许你直接在用户浏览器截取页面或部分网页的“屏幕截屏”,屏幕截图是基于 DOM,因此生成的图片并不一定 100% 一致,因为它没有制作实际的屏幕截图,而是根据页面上可用的信息构建屏幕截图。
如何工作?
该脚本通过读取 DOM 以及应用于元素的不同样式,将当前页面呈现为 canvas 图像。
它不需要来自服务器的任何渲染,因为整个图像是在客户端上创建的。但是,由于它太依赖于浏览器,因此该库不适合在 nodejs 中使用。它也不会神奇地规避任何浏览器内容策略限制,因此呈现跨域内容将需要代理来将内容提供给相同的源。
该脚本仍然处理非常*实验状态,因此不建议在生产环境中使用它,也不建议使用它来构建应用程序,因为仍然会有重大更改。
浏览器兼容性?
该库应该可以在以下浏览器上正常工作
- Firefox 3.5+
- Google Chrome
- Opera 12+
- IE9+
- Safari 6+
*由于需要手动构建每一个 CSS 属性以支持,因此还有许多尚不支持的属性。
二. 安装及官方例子
安装
Install NPMnpm install --save html2canvas
Install Yarnyarn add html2canvas
使用方法
HTML
<div id="capture" style="padding: 10px; background: #f5da55">
<h4 style="color: #000; ">Hello world!</h4>
</div>
JavaScript
import html2canvas from 'html2canvas'
html2canvas(document.querySelector("#capture")).then(canvas => {
document.body.appendChild(canvas)
});
三. 移动端清晰度实践
// 源码提供者: dxy f2e 顾重
/**
* 根据window.devicePixelRatio获取像素比
*/
function DPR () {
if (window.devicePixelRatio && window.devicePixelRatio > 1) {
return window.devicePixelRatio
}
return 1
}
/**
* 将传入值转为整数
*/
function parseValue (value) {
return parseInt(value, 10)
}
/**
* 绘制canvas
*/
function drawCanvas (selector) {
// 获取想要转换的 DOM 节点
var dom = document.querySelector(selector)
var box = window.getComputedStyle(dom)
// DOM 节点计算后宽高
var width = parseValue(box.width)
var height = parseValue(box.height)
// 获取像素比
var scaleBy = DPR()
// 创建自定义 canvas 元素
var canvas = document.createElement('canvas')
// 设定 canvas 元素属性宽高为 DOM 节点宽高 * 像素比
canvas.width = width * scaleBy
canvas.height = height * scaleBy
// 设定 canvas css宽高为 DOM 节点宽高
canvas.style.width = width + 'px'
canvas.style.height = height + 'px'
// 获取画笔
var context = canvas.getContext('2d')
// 将所有绘制内容放大像素比倍
context.scale(scaleBy, scaleBy)
var x = width
var y = height
return html2canvas(dom, {
useCORS: true,
canvas: canvas
}).then(function () {
convertCanvasToImage(canvas, x, y)
})
}
/**
* 图片转base64格式
*/
function convertCanvasToImage (canvas, x, y) {
var image = new Image()
image.width = x
image.height = y
image.src = canvas.toDataURL('image/png')
image.className = 'imageFromCanvas'
document.body.appendChild(image)
return image
}
四. 不支持 CSS 属性整理
- transform
- border-style