js實(shí)現(xiàn)網(wǎng)頁(yè)截圖的兩種方案詳析
方案一:使用 html2canvas 庫(kù)(推薦)
原理:將 HTML DOM 元素轉(zhuǎn)換為 Canvas,再導(dǎo)出為圖片
特點(diǎn):兼容性好,支持大部分現(xiàn)代瀏覽器,但需注意 CSS 屬性兼容性
實(shí)現(xiàn)步驟:
1.安裝依賴(lài):
npm install html2canvas
2.基礎(chǔ)截圖代碼:
import html2canvas from "html2canvas"
//截取整個(gè)屏幕
const screenFn = () => {
const element = document.body
html2canvas(element).then((canvas) => {
const imgUrl = canvas.toDataURL("image/png")
const link = document.createElement("a")
link.download = "screenshot.png"
link.href = imgUrl
link.click()
})
}
//截取特定元素
const screenFn = () => {
const element = document.getElementById("version")
if (element) {
html2canvas(element, {
allowTaint: true, // 允許跨域圖片
useCORS: true, // 使用 CORS 加載圖片
scale: 2, // 提升截圖分辨率
logging: true, // 調(diào)試時(shí)查看日志
scrollY: -window.scrollY // 處理滾動(dòng)位置
}).then((canvas) => {
const imgUrl = canvas.toDataURL("image/png")
const link = document.createElement("a")
link.download = "screenshot.png"
link.href = imgUrl
link.click()
})
}
}方案二: 使用原生 API Window: getDisplayMedia()
原理:通過(guò)屏幕共享 API 捕獲當(dāng)前標(biāo)簽頁(yè)
特點(diǎn):需用戶(hù)授權(quán),適合需要交互式操作的場(chǎng)景
實(shí)現(xiàn)步驟:
const screenFn = async () => {
try {
const stream = await navigator.mediaDevices.getDisplayMedia({
video: { displaySurface: "browser" }
})
const videoTrack = stream.getVideoTracks()[0]
const imageCapture = new ImageCapture(videoTrack)
const bitmap = await imageCapture.grabFrame()
// 將 bitmap 繪制到 canvas
const canvas = document.createElement("canvas")
canvas.width = bitmap.width
canvas.height = bitmap.height
const ctx = canvas.getContext("2d")
ctx.drawImage(bitmap, 0, 0)
// 導(dǎo)出圖片
canvas.toBlob((blob) => {
const url = URL.createObjectURL(blob)
const a = document.createElement("a")
a.href = url
a.download = "screenshot.png"
a.click()
}, "image/png")
videoTrack.stop()
} catch (err) {
console.error("截圖失敗:", err)
}
}兩種方案優(yōu)缺點(diǎn):
1.方案一:html2canvas
優(yōu)點(diǎn):純前端實(shí)現(xiàn),靈活度高
缺點(diǎn):復(fù)雜頁(yè)面渲染可能有差異
2.方案二:getDisplayMedia
優(yōu)點(diǎn):原生 API,無(wú)需額外依賴(lài)
缺點(diǎn):需要用戶(hù)手動(dòng)選擇分享區(qū)域
總結(jié)
到此這篇關(guān)于js實(shí)現(xiàn)網(wǎng)頁(yè)截圖的文章就介紹到這了,更多相關(guān)js網(wǎng)頁(yè)截圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS使用ajax方法獲取指定url的head信息中指定字段值的方法
這篇文章主要介紹了JS使用ajax方法獲取指定url的head信息中指定字段值的方法,實(shí)例分析了Ajax操作URL中head信息的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
利用Javascript判斷操作系統(tǒng)的類(lèi)型實(shí)現(xiàn)不同操作系統(tǒng)下的兼容性
在通過(guò)Javascript實(shí)現(xiàn)客戶(hù)端和服務(wù)端的交互時(shí),有時(shí)候需要對(duì)操作系統(tǒng)進(jìn)行判斷,以便實(shí)現(xiàn)不同操作系統(tǒng)下的兼容性;從而實(shí)現(xiàn)網(wǎng)站在跨平臺(tái)瀏覽時(shí)候保持良好的用戶(hù)體驗(yàn),感興趣的朋友可以了解下啊,或許對(duì)你有所幫助2013-01-01
JavaScript通過(guò)代碼調(diào)用Flash顯示的方法
這篇文章主要介紹了JavaScript通過(guò)代碼調(diào)用Flash顯示的方法,實(shí)例分析了JavaScript通過(guò)flash插件swfobject.js調(diào)用flash顯示的具體操作技巧,需要的朋友可以參考下2016-02-02
Javascript設(shè)計(jì)模式之發(fā)布訂閱模式
發(fā)布---訂閱模式又叫觀察者模式,它定義了對(duì)象間的一種一對(duì)多的關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象,當(dāng)一個(gè)對(duì)象發(fā)生改變時(shí),所有依賴(lài)于它的對(duì)象都將得到通知2022-12-12
Js實(shí)現(xiàn)滾動(dòng)變色的文字效果
滾動(dòng)變色的文字js特效,可看到文字在交替變色顯示,以吸引人的注意,效果真心不錯(cuò)哦,需要的朋友可以參考下2014-06-06
解決layer.confirm選擇完之后消息框不消失的問(wèn)題
今天小編就為大家分享一篇解決layer.confirm選擇完之后消息框不消失的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
刪除條目時(shí)彈出的確認(rèn)對(duì)話(huà)框
這篇文章主要介紹用js的confirm實(shí)現(xiàn)的刪除條目時(shí)彈出的確認(rèn)對(duì)話(huà)框,詢(xún)問(wèn)是否要?jiǎng)h除這條記錄,需要的朋友可以參考下2014-06-06

