网页截图标注组件
一次编码,三端复用
对任意 DOM 元素截图并铺到画布上,直接在页面里圈画、写批注,一键导出带标注的 PNG。 引擎与样式在构建时内联进每个框架包,Vue 3 / React 18 / Angular 21 三端共用同一套能力与样式,只有组件外壳不同 —— 装一个包即可使用,无需额外依赖。
Vue 3
React 18
Angular 21
6 种标注工具
撤销 / 重做
高 DPI 清晰
TypeScript
它能做什么
截图即画布
用 snapdom 把目标元素截成图,铺在 Fabric 画布下层,标注直接画在真实页面内容上。
六种标注工具
矩形、椭圆、箭头、折线、画笔、文字;可改颜色、线宽、字号,文字支持二次编辑。
撤销 / 重做
绘制、拖拽缩放、样式提交都会生成撤销点,历史基于 Fabric 对象快照实现。
高分屏清晰
按 devicePixelRatio 渲染位图,导出图与屏幕一致,不会出现“放大后发虚”。
安装与最小用法
npm i @laoliangfe/annotation-overlay-vue
<script setup lang="ts">
import { ref } from 'vue';
import AnnotationOverlay from '@laoliangfe/annotation-overlay-vue';
import '@laoliangfe/annotation-overlay-vue/style.css';
const card = ref<HTMLElement>();
const overlay = ref<InstanceType<typeof AnnotationOverlay>>();
const open = () => overlay.value?.open(card.value!);
</script>
<template>
<div ref="card">要标注的内容</div>
<button @click="open">添加标注</button>
<AnnotationOverlay
ref="overlay"
@confirm="(p) => p && console.log(p.blob)"
/>
</template>
npm i @laoliangfe/annotation-overlay-react
import { useRef } from 'react';
import {
AnnotationOverlay,
type AnnotationOverlayRef,
} from '@laoliangfe/annotation-overlay-react';
import '@laoliangfe/annotation-overlay-react/style.css';
const card = useRef<HTMLDivElement>(null);
const overlay = useRef<AnnotationOverlayRef>(null);
<div ref={card}>要标注的内容</div>
<button onClick={() => overlay.current?.open(card.current!)}>
添加标注
</button>
<AnnotationOverlay
ref={overlay}
onConfirm={(p) => p && console.log(p.blob)}
/>
npm i @laoliangfe/annotation-overlay-angular // 1. angular.json → build.options.styles 里加一行: "node_modules/@laoliangfe/annotation-overlay-angular/style.css" // 2. 组件 imports 中加入 AnnotationOverlayComponent,模板: <div #card>要标注的内容</div> <button (click)="overlay.open(card)">添加标注</button> <annotation-overlay #overlay (confirm)="onConfirm($event)" />
三端都必须显式引入
style.css:包构建会把 CSS 抽成独立文件并从 JS 移除,
只引组件会出现「组件在、样式全丢」。
API 速查
| 能力 | Vue 3 | React 18 | Angular 21 |
|---|---|---|---|
| 打开并截取 | ref.open(el) |
ref.current.open(el) |
overlay.open(el) |
| 关闭并丢弃 | ref.close() |
ref.current.close() |
overlay.close() |
| 确认回调 | @confirm |
onConfirm |
(confirm) |
| 取消回调 | @cancel |
onCancel |
(cancel) |
| 截图前 / 后 | @beforeCapture / @afterCapture |
onBeforeCapture / onAfterCapture |
(beforeCapture) / (afterCapture) |
| 回调数据 | { base64: string; blob: Blob },截图或导出失败时为 null |
||
包结构
| 包 | 说明 |
|---|---|
@laoliangfe/annotation-overlay-vue |
Vue 3 组件 |
@laoliangfe/annotation-overlay-react |
React 18 组件 |
@laoliangfe/annotation-overlay-angular |
Angular 21 组件(standalone + signals,兼容 zoneless) |
三个包都是「装一个即可用」:引擎(core)与样式(ui)是仓库内部包,构建时已内联进各自产物,
不需要也不应该单独安装。
旧包
@laoliangfe/annotation-overlay(1.x 单文件 Vue 组件)已冻结在 1.1.7,
源码见 tag v1.1.7;新项目请用上表中的 -vue 包,
API 与旧包完全一致,迁移只需改 import 路径并补一行 style.css。
在线演示
演示页里的“添加标注”按钮会打开覆盖层:先选工具再画,右上角可撤销 / 重做,确认后标注图显示在下方预览区。
Vue 3 演示