
html2canvas
์ง๋ ๋ฒ์ ์์ฑํ๋
https://velog.io/@fairytale779/TIL-html2canvas
๋ฅผ ์ด์ฉํด์ ์ฝ๊ฒ ๊ตฌํํ์๋ค
์ธํ ์ ์ ๊ฒ์๊ธ์ ์ ํ์์ผ๋ ๋์ด๊ฐ๊ณ , ํจ์๋ ๋ค์ ์ ์ด๋ณด์๋ฉด ์ด๋ ๋ค
const onFullCapture = () => {
html2canvas(document.querySelector(".App")).then(
(canvas) => {
const link = document.createElement("a");
link.download = "image";
link.href = canvas.toDataURL();
document.body.appendChild(link);
link.click();
}
);
};
const onFourCutCapture = () => {
html2canvas(document.querySelector(".container")).then((canvas) => {
const link = document.createElement("a");
link.download = "image";
link.href = canvas.toDataURL();
document.body.appendChild(link);
link.click();
});
};
querySelector๋ฅผ ์ด์ฉํด์ ๋ ๊ฐ์ง๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค
๊ทธ๋์ ๋ฒํผ์ ๋ง๋ค์ด ๋ ํจ์๋ค์ ๋ฃ์ด์ฃผ์์

css๋ ๋์ค์ ์๋ณด๊ธฐ๋ก ํ๊ณ ...
์ด๋ ๊ฒ ํด์ ์บก์ฒํ์ ๋, ๋ฌธ์ ๋ฅผ ์ง๋ฉดํ๋ค.. ๋ญํ๋ ์ฝ๊ฒ ๋๋๊ฒ ์๊ตฌ๋ ^__^

์ผ๋จ ๋ค์ปท ์ฌ์ง์... ๊ฐ์ด๋ฐ ์ฌ์ง๋ค์ด css๊ฐ ์ ์ฉ๋์ง ์์ ์ํ๋ก ์ถ๋ ฅ๋์๋ค ใ ใ

๊ทธ๋ฆฌ๊ณ ํํ๋ฉด์ App::before๋ง ์ ์ฉ๋? ์ํ๋ก ๋์ด.
์ด๊ฑด ์ฝ๋ ๋ถ๋ถ์ ์์ ํด๋ ์์ฉ์ด ์์๋ค ใ
ใ
๊ณ์ ์ ์ฒด์ ๋ถํฌ๋ช
๋๊ฐ ์
ํ์ง ์ํ๋ก ์ถ๋ ฅ ๋จ.
๊ทผ๋ฐ ๊ทธ๋ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค ๋ณด๋ ๋ญ ์ด์ฐํด์ผ ๋ ์ง ๋ชฐ๋ผ ํค๋งค๋ค๊ฐ ๋ค๋ฅธ ์บก์ฒ๋๊ตฌ๋ฅผ ๋ฐ๊ฑดํ๋ค.
html-to-image
์ html2canvas๋ณด๋ค html-to-image๊ฐ ๋ ์ข์๊ฐ? ํ๋ ๊ธ https://betterprogramming.pub/heres-why-i-m-replacing-html2canvas-with-html-to-image-in-our-react-app-d8da0b85eadf
๊ทผ๋ฐ ๊ตฌ๊ธ์ ์ ๋ณด๊ฐ ๋ง์ง ์๋ค..
๊ทธ๋์ ๊นํ ๋ ํฌ์งํ ๋ฆฌ๋ ๊พธ์ญ๊พธ์ญ ๋ค์ฌ๋ค๋ณด๋ฉด์
์ฌ์ง์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ง๋ค์๋๋ฐ ํ์
์คํฌ๋ฆฝํธ๋ก ์์๊ฐ ๋์์์ด์
ํฌ๊ฒ ์ด๋ ต๊ฒ ๊ณ ์น๊ฑด ์๋์์ง๋ง ๊ทธ๋๋ ์นญ์ผ์นญ์ผ~
const ref = useRef();
const onButtonClick = useCallback(() => {
if (ref.current === null) {
return;
}
toPng(ref.current)
.then((dataUrl) => {
const link = document.createElement("a");
link.download = "my-image-name.png";
link.href = dataUrl;
link.click();
})
.catch((err) => {
console.log(err);
});
}, [ref]);
<button className="capButton" onClick={onButtonClick}>
์ ์ฒดํ๋ฉด ์บก์ฒ
</button>
<div ref={ref}> ....
ํด์ฃผ์๋๋ ์ํ๋ ๋๋ก ์ถ๋ ฅ์ด ๋์๋ค!

์ฐ๋ฆฌ ๊ณ ์์ด ๊ท์ฌ์...