[javascript] Clipboard.js를 사용하여 웹페이지에서 특정 요소 복사 후 스크린샷 저장하기

웹 개발 중에 종종 사용자가 웹페이지의 특정 요소를 복사하여 저장하거나 공유하는 기능을 구현해야 할 때가 있습니다. 이번 블로그 포스트에서는 Clipboard.js를 이용하여 웹페이지에서 특정 요소를 클립보드에 복사한 후, 스크린샷으로 저장하는 방법을 알아보겠습니다.

Clipboard.js 소개

Clipboard.js는 클립보드에 텍스트 또는 HTML을 쉽게 복사할 수 있도록 도와주는 JavaScript 라이브러리입니다. 복사 기능은 클립보드 API를 사용하여 구현되며, 다양한 브라우저에서 지원됩니다.

필요한 패키지 설치하기

먼저 프로젝트에 Clipboard.js 패키지를 설치해야 합니다. npm을 사용하는 경우, 다음과 같이 명령어를 실행합니다:

npm install clipboard --save

HTML에서 클립보드 복사 기능 추가하기

웹페이지에서 특정 요소를 클립보드에 복사하기 위해 해당 요소에 클릭 이벤트를 추가해야 합니다. 예를 들어, 다음과 같은 HTML 요소가 있다고 가정해봅시다:

<button id="copy-button">클릭하여 복사</button>
<div id="copy-content">복사할 내용이 들어갈 요소입니다.</div>

이 경우, 버튼을 클릭하면 #copy-content 요소의 내용이 클립보드에 복사되도록 구현해보겠습니다. JavaScript 코드로 구현하면 다음과 같습니다:

const copyButton = document.getElementById('copy-button');
const copyContent = document.getElementById('copy-content');

copyButton.addEventListener('click', () => {
  const clipboard = new ClipboardJS(copyButton, {
    text: () => copyContent.innerText
  });

  clipboard.on('success', (e) => {
    alert('내용이 복사되었습니다!');
    e.clearSelection();
  });

  clipboard.on('error', (e) => {
    alert('복사 실패: ' + e.action);
  });

  clipboard.onClick(event);
});

위의 코드에서 new ClipboardJS(copyButton, { ... })를 사용하여 클립보드 인스턴스를 생성하고, text 콜백 함수에서 복사할 내용을 지정합니다. 이후 success 이벤트에서는 복사가 성공적으로 완료되었을 때 실행될 동작을, error 이벤트에서는 복사가 실패했을 때 실행될 동작을 정의합니다.

스크린샷으로 저장하기

웹페이지의 특정 요소를 클립보드에 복사한 다음, 이를 스크린샷 이미지로 저장할 수 있습니다. 이를 위해서는 HTML5 Canvas를 사용합니다. 다음은 스크린샷을 저장하는 JavaScript 코드입니다:

const saveScreenshot = () => {
  const canvas = document.createElement('canvas');
  const copyContent = document.getElementById('copy-content');
  const copyContentStyles = window.getComputedStyle(copyContent);

  canvas.width = copyContent.offsetWidth;
  canvas.height = copyContent.offsetHeight;

  const context = canvas.getContext('2d');
  context.fillStyle = copyContentStyles.backgroundColor;
  context.fillRect(0, 0, canvas.width, canvas.height);
  context.font = copyContentStyles.font;
  context.fillStyle = copyContentStyles.color;
  context.textAlign = 'left';

  const lines = copyContent.innerText.split('\n');
  let yOffset = 0;

  lines.forEach((line) => {
    context.fillText(line, 0, yOffset + parseInt(copyContentStyles.lineHeight, 10));
    yOffset += parseInt(copyContentStyles.lineHeight, 10);
  });

  const screenshotUrl = canvas.toDataURL();
  const link = document.createElement('a');
  link.href = screenshotUrl;
  link.download = 'screenshot.png';
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
};

위의 코드에서는 canvas 요소를 생성한 후, copy-content 요소의 스타일을 가져와 Canvas에 그립니다. 이후 canvas.toDataURL()을 사용하여 스크린샷을 이미지 URL로 변환하고, 이를 다운로드할 수 있는 링크를 생성합니다. link.click()을 사용하여 스크린샷을 다운로드합니다.

결론

이제 Clipboard.js를 사용하여 웹페이지에서 특정 요소를 클립보드에 복사한 후, 스크린샷으로 저장하는 방법을 알게 되었습니다. 이를 응용하여 사용자가 웹페이지의 컨텐츠를 쉽게 저장하거나 공유할 수 있는 기능을 구현할 수 있습니다. Clipboard.js는 다양한 기능과 설정 옵션을 제공하므로, 자세한 내용은 공식 문서를 참조해보세요.

참고 자료