Hvis du vil ta et skjermbilde av deler av eller hele nettsiden din ved hjelp av JavaScript, kan det hende du sitter fast. Å lage et bilde fra et HTML-element kan virke som en utfordring, siden det ikke er noen direkte måte å gjøre det på i JavaScript.
Heldigvis er dette ikke en umulig oppgave og er faktisk ganske enkelt med de riktige verktøyene. Ved å bruke html-til-bilde-biblioteket er det like enkelt å lage bilder av DOM-noder som et enkelt funksjonskall.
Hvordan fungerer html-til-bilde?
De html-til-bilde biblioteket produserer et bilde i form av en base64-data-URL. Den støtter flere utdataformater, inkludert PNG, JPG og SVG. For å utføre denne konverteringen bruker biblioteket denne algoritmen:
- Lag en klone av HTML-målelementet, dets underordnede elementer og eventuelle vedlagte pseudoelementer.
- Kopier stylingen for alle klonede elementer og bygg inn stylingen på linje.
- Bygg inn relevante nettfonter, hvis det er noen.
- Bygg inn eventuelle bilder som finnes.
- Konverter den klonede noden til XML, og deretter SVG.
- Bruk SVG til å opprette en data-URL.
Forbehold og begrensninger
Selv om html-to-image er et flott bibliotek, er det ikke perfekt. Den har noen forbehold, nemlig:
- Biblioteket vil ikke fungere i Internet Explorer eller Safari.
- Hvis HTML-en du prøver å konvertere inneholder et forurenset lerretselement, vil biblioteket mislykkes. Som MDN forklarer, inkludert ikke-CORS-godkjente data i lerretselementet ditt vil skjemme det.
- Fordi nettlesere setter grenser for maksimal størrelse på en data-URL, er det grenser for størrelsen på HTML-en biblioteket kan konvertere.
Bruke biblioteket
For å prøve biblioteket, er det første du må gjøre å lage en prosjektkatalog på din lokale maskin. Deretter installerer du html-til-bilde i den katalogen med npm-pakkebehandleren. Her er terminalkommandoen for å installere den:
npm installere--lagre html-til-bilde
Du bør også installere en JavaScript-bunter, for å gjøre det litt enklere å bruke biblioteket. De esbuild bundler kan hjelpe med å pakke nodemoduler inn i webkompatible skript.
npm installere esbuild
Det er alt du trenger for å installere. Deretter oppretter du en fil som heter index.html i katalogen din, og server den med en webserver du velger. Sett inn følgende kode i index.html:
<!doctype html>
<html lang="no">
<hode>
<metategnsett="UTF-8">
<metanavn="viewport"
innhold="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-kompatibel" innhold="dvs. = kant">
<tittel>Dokument</title>
<stil>
.colorful-div {
polstring: 3rem;
farge: hvit;
bakgrunnsbilde: lineær gradient (til høyre, gul, rebeccapurple);
kantlinje: 1px helt svart;
margin: 1rem auto;
skriftstørrelse: 3rem;
font-familie: kursiv;
}
</style>
</head>
<kropp>
<div klasse="fargerik-div">
Jeg'jeg kommer til å være med på et skjermbilde!
</div>
<div klasse="lang tekst">
Jeg'm et eksempel på et tilstrekkelig detaljert avsnitt som
illustrerer at det å ta skjermbilder i JavaScript er
veldig enkelt, av følgende grunner:
<ul>
<li>Grunn 1</li>
<li>Grunn 2</li>
<li>Grunn 2</li>
</ul>
</div>
<script src="out.js"></script>
</body>
</html>
Denne koden lager to elementer på siden: en div med en gradientbakgrunn, og litt tekst og en uordnet liste inne i en annen div. Deretter skal du skrive JavaScript for å konvertere disse elementene til bilder. Legg inn følgende kode i en ny fil kalt script.js:
import * som htmlToImage fra "html-til-bilde";
const elems = ['.fargerike-div', '.lang tekst']
elems.for hver((elem, ind) => {
konst node = dokument.querySelector (elem)
htmlToImage.toPng(node)
.deretter(funksjon (dataUrl) {
la img = ny Bilde();
img.src = dataUrl;
dokument.kropp.appendChild(img);
})
.å fange(funksjon(feil){
console.error('Oops! Noe gikk galt!');
konsoll.log (feil)
});
})
Denne koden gjør et par ting:
- Importerer html-til-bilde-biblioteket.
- Oppretter en matrise laget av CSS-velgere rettet mot de to elementene.
- Oppretter et PNG-bilde i form av en data-URL fra hvert element i matrisen.
- Oppretter en img-tag og setter src-attributtet til data-URLen, og lager bildekopier av de to elementene.
Bruk nå esbuild for å generere den medfølgende filen (out.js) som index.html refererer til ved å kjøre følgende i terminalen din:
./node_modules/.bin/esbuild script.js --bundle --outfile=out.js
Slik skal index.html se ut i nettleseren din:
Selv om kopiene ser helt like ut som originalene, er de faktisk bildeelementer. Du kan bekrefte dette ved å åpne utviklerverktøyene dine og inspisere dem.
Dette biblioteket fungerer også med JavaScript-rammeverk. De html-til-bilde dokumentasjon inneholder instruksjoner om hvordan du genererer andre bildeformater. Den inneholder også et eksempel som viser hvordan du bruker biblioteket med React.
Det er enkelt å ta skjermbilder med JavaScript
Det er ingen innebygd JavaScript-metode for å lage bilder fra HTML-elementer eller ta skjermbilder av DOM. Men ved hjelp av biblioteker og tjenester som html-til-bilde, blir det en enkel oppgave.
Det finnes andre måter å oppnå lignende resultater på, for eksempel wkhtmltoimage-biblioteket. Du kan bruke dette åpen kildekodeverktøyet til å ta skjermbilder av en komplett nettside.