UNPKG

@web-js/dom-screenshot

Version:

A lightweight DOM screenshot library based on @zumer/snapdom and html2canvas.

292 lines (215 loc) 7.82 kB
# DOM Screenshot 一个智能的 DOM 截图库,优先使用 @zumer/snapdom,失败时自动降级到 html2canvas,支持 ES 模块和 UMD 模块。 ## 特性 - 🚀 轻量级,双引擎支持(snapdom + html2canvas) - 🔄 智能降级机制,确保截图成功率 - 📦 支持 ES 模块和 UMD 模块 - 🎯 TypeScript 支持 - 🖼️ 多种输出格式(Canvas、Base64、Blob) - ⚙️ 丰富的配置选项 - 📱 支持移动端 ## 工作原理 本库采用智能双引擎截图策略: 1. **优先使用 @zumer/snapdom**:更快速、更准确的现代截图引擎 2. **自动降级到 html2canvas**:当 snapdom 失败时,自动切换到经过验证的 html2canvas 3. **错误处理**:提供详细的错误信息,帮助调试问题 ## 安装 ```bash npm install @web-js/dom-screenshot ``` 注意:本库依赖 `@zumer/snapdom` 和 `html2canvas`,它们会作为 peer dependencies 自动安装。 ## 使用方法 ### ES 模块 ```javascript import { screenshot, DomScreenshot } from '@web-js/dom-screenshot'; // 快速截图 - 返回 Base64 const element = document.getElementById('target'); const base64 = await screenshot(element); console.log(base64); // 使用类实例 const domScreenshot = new DomScreenshot(); const canvas = await domScreenshot.captureToCanvas(element); ``` ### UMD 模块(浏览器) ```html <!-- UMD 模块已包含所有依赖,无需额外引入 --> <script src="node_modules/@web-js/dom-screenshot/dist/dom-screenshot.umd.js"></script> <script> const element = document.getElementById('target'); DomScreenshot.screenshot(element).then(base64 => { console.log(base64); }); </script> ``` ## API 文档 ### 快速函数 #### `screenshot(element, options?)` 截取 DOM 元素为 Base64 字符串。 ```javascript const base64 = await screenshot(element, { quality: 0.8, format: 'jpeg', backgroundColor: '#ffffff' }); ``` #### `screenshotToCanvas(element, options?)` 截取 DOM 元素为 Canvas 对象。 ```javascript const canvas = await screenshotToCanvas(element); document.body.appendChild(canvas); ``` #### `screenshotToBlob(element, options?)` 截取 DOM 元素为 Blob 对象。 ```javascript const blob = await screenshotToBlob(element); const url = URL.createObjectURL(blob); ``` ### DomScreenshot 类 #### `captureToCanvas(element, options?)` 截取 DOM 元素为 Canvas。 #### `captureToBase64(element, options?)` 截取 DOM 元素为 Base64 字符串。 #### `captureToBlob(element, options?)` 截取 DOM 元素为 Blob 对象。 #### `downloadScreenshot(element, filename?, options?)` 直接下载 DOM 元素截图。 ```javascript const domScreenshot = new DomScreenshot(); await domScreenshot.downloadScreenshot(element, 'my-screenshot'); ``` ## 配置选项 ```typescript interface ScreenshotOptions { quality?: number; // 图片质量 (0-1),默认 1 format?: 'png' | 'jpeg' | 'webp'; // 图片格式,默认 'png' backgroundColor?: string; // 背景颜色,默认 '#ffffff' allowTaint?: boolean; // 是否允许跨域,默认 false useCORS?: boolean; // 是否使用 CORS,默认 true scale?: number; // 缩放比例,默认 1 width?: number; // 输出宽度 height?: number; // 输出高度 ignoreElements?: (element: Element) => boolean; // 忽略元素的函数 processSvg?: boolean; // 是否启用SVG元素预处理,默认 true processGradientText?: boolean; // 是否启用CSS渐变文本预处理,默认 true enginePriority?: 'snapdom' | 'html2canvas'; // 引擎优先级,默认 'snapdom' embedFonts?: boolean; // 是否内联字体以确保字体正确渲染,默认 true preCacheFonts?: boolean; // 是否预加载字体和资源,默认 true snapdomOptions?: object; // snapdom引擎的额外配置选项 html2canvasOptions?: object; // html2canvas引擎的额外配置选项 } ``` ## 示例 ### 基础用法 ```javascript import { screenshot } from '@web-js/dom-screenshot'; const element = document.querySelector('.screenshot-target'); const base64 = await screenshot(element); // 显示截图 const img = document.createElement('img'); img.src = base64; document.body.appendChild(img); ``` ### 自定义配置 ```javascript import { DomScreenshot } from '@web-js/dom-screenshot'; const domScreenshot = new DomScreenshot(); const element = document.querySelector('.target'); const canvas = await domScreenshot.captureToCanvas(element, { scale: 2, backgroundColor: 'transparent', format: 'png', quality: 1 }); ``` ### 下载截图 ```javascript import { DomScreenshot } from '@web-js/dom-screenshot'; const domScreenshot = new DomScreenshot(); const element = document.querySelector('.download-target'); // 直接下载 await domScreenshot.downloadScreenshot(element, 'my-page-screenshot', { format: 'jpeg', quality: 0.9 }); ``` ### 字体渲染优化 ```javascript import { screenshot } from '@web-js/dom-screenshot'; // 确保自定义字体正确渲染 const element = document.querySelector('.custom-font-element'); const base64 = await screenshot(element, { embedFonts: true, // 内联字体到截图中 preCacheFonts: true, // 预加载字体资源 enginePriority: 'snapdom' // 优先使用snapdom引擎 }); ``` ### 处理复杂元素 ```javascript import { screenshotToCanvas } from '@web-js/dom-screenshot'; // 处理包含SVG和渐变文本的复杂元素 const element = document.querySelector('.complex-element'); const canvas = await screenshotToCanvas(element, { processSvg: true, // 预处理SVG元素 processGradientText: true, // 处理CSS渐变文本 scale: 2, // 高分辨率截图 backgroundColor: 'transparent' }); ``` ### 错误处理 ```javascript import { screenshot } from '@web-js/dom-screenshot'; try { const element = document.querySelector('.target'); const base64 = await screenshot(element, { enginePriority: 'snapdom' }); console.log('截图成功:', base64); } catch (error) { console.error('截图失败:', error.message); // 库会自动尝试降级到备用引擎 } ``` ### 移动端适配 ```javascript import { screenshotToBlob } from '@web-js/dom-screenshot'; // 移动端截图优化 const element = document.querySelector('.mobile-content'); const blob = await screenshotToBlob(element, { scale: window.devicePixelRatio, // 适配设备像素比 format: 'jpeg', quality: 0.8, // 平衡质量和文件大小 useCORS: true }); ``` ## 常见问题 ### Q: 为什么字体在截图中显示不正确? A: 这通常是因为自定义字体未完全加载。解决方案: - 启用 `embedFonts: true` 将字体内联到截图中 - 启用 `preCacheFonts: true` 预加载字体资源 - 确保在截图前字体已加载完成 ### Q: 截图失败怎么办? A: 本库具有自动降级机制: - 默认优先使用 snapdom 引擎 - 失败时自动降级到 html2canvas - 查看控制台错误信息进行调试 ### Q: 如何处理跨域图片? A: 配置 CORS 相关选项: ```javascript const base64 = await screenshot(element, { useCORS: true, allowTaint: false }); ``` ### Q: 截图质量不佳怎么办? A: 尝试以下优化: - 增加 `scale` 值获得更高分辨率 - 启用 `processSvg` 和 `processGradientText` - 使用 PNG 格式保持最佳质量 ## 最佳实践 1. **字体处理**:对于包含自定义字体的元素,建议启用字体相关选项 2. **性能优化**:大型元素截图时适当降低 `scale` 和 `quality` 3. **错误处理**:始终使用 try-catch 包装截图调用 4. **移动端**:使用 `window.devicePixelRatio` 适配不同设备 5. **复杂元素**:启用预处理选项处理 SVG 和渐变文本 ## 许可证 MIT