vue按钮实现截屏
Vue 按钮实现截屏
使用 html2canvas 库
安装 html2canvas 库:
npm install html2canvas --save
在 Vue 组件中引入并使用:

<template>
<div>
<button @click="captureScreenshot">截屏</button>
<div ref="screenshotTarget">需要截屏的内容</div>
<img v-if="screenshot" :src="screenshot" alt="截屏结果"/>
</div>
</template>
<script>
import html2canvas from 'html2canvas';
export default {
data() {
return {
screenshot: null
};
},
methods: {
async captureScreenshot() {
const element = this.$refs.screenshotTarget;
const canvas = await html2canvas(element);
this.screenshot = canvas.toDataURL('image/png');
}
}
};
</script>
使用 dom-to-image 库
安装 dom-to-image 库:

npm install dom-to-image --save
在 Vue 组件中使用:
<template>
<div>
<button @click="captureScreenshot">截屏</button>
<div ref="screenshotTarget">需要截屏的内容</div>
<img v-if="screenshot" :src="screenshot" alt="截屏结果"/>
</div>
</template>
<script>
import domtoimage from 'dom-to-image';
export default {
data() {
return {
screenshot: null
};
},
methods: {
captureScreenshot() {
const element = this.$refs.screenshotTarget;
domtoimage.toPng(element)
.then(dataUrl => {
this.screenshot = dataUrl;
})
.catch(error => {
console.error('截屏失败:', error);
});
}
}
};
</script>
使用浏览器原生 API
如果仅需截取部分屏幕内容,可以使用浏览器原生 API:
<template>
<div>
<button @click="captureScreenshot">截屏</button>
</div>
</template>
<script>
export default {
methods: {
async captureScreenshot() {
try {
const stream = await navigator.mediaDevices.getDisplayMedia({
video: { mediaSource: 'screen' }
});
const track = stream.getVideoTracks()[0];
const image = new ImageCapture(track);
const bitmap = await image.grabFrame();
track.stop();
const canvas = document.createElement('canvas');
canvas.width = bitmap.width;
canvas.height = bitmap.height;
const ctx = canvas.getContext('2d');
ctx.drawImage(bitmap, 0, 0);
const dataUrl = canvas.toDataURL('image/png');
console.log(dataUrl); // 处理截屏数据
} catch (error) {
console.error('截屏失败:', error);
}
}
}
};
</script>
注意事项
- 跨域问题:如果截取的内容包含跨域资源(如图片),需确保资源支持 CORS。
- 性能优化:截屏操作可能消耗较多资源,建议对大型 DOM 结构进行优化。
- 样式兼容性:某些 CSS 属性可能无法正确渲染到画布中,需测试确认。






