在 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 * scaleBycanvas.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 = widthvar y = heightreturn html2canvas(dom, {useCORS: true,canvas: canvas}).then(function () {convertCanvasToImage(canvas, x, y)})}/*** 图片转base64格式*/function convertCanvasToImage (canvas, x, y) {var image = new Image()image.width = ximage.height = yimage.src = canvas.toDataURL('image/png')image.className = 'imageFromCanvas'document.body.appendChild(image)return image}
四. 不支持 CSS 属性整理
- transform
- border-style
