[javascript] html2canvas로 영역 캡쳐하기 (scroll 영역부분이 캡쳐가 안된다면?)

2021. 12. 24. 10:49·과거의 이력/javascript

개념

화면의 일부 영역을 이미지 데이터로 변환하여 사용해야할 필요가 있어서

자바스크립트 브라우저 화면 캡쳐 라이브러리인 html2canvas 를 사용하기로 했다.

 

 

* 공식사이트

https://html2canvas.hertzen.com/

 

 

 

나는 버튼 클릭이벤트가 발생하면 특정 영역을 이미지로 따와야했기 때문에

해당 함수 호출부분에 아래와같은 코드를 추가하였다.

html2canvas(textArea, {
	}).then(canvas => {
	const textToImg = canvas.toDataURL()
})

 

 

나는 이미지를 서버에 저장할필요가 없이 변환된 데이터값만 필요했기때문에 textToImg 변수로 담아 사용하였다.

만약 서버에 이미지를 다운받아야 한다면, 아래와 같이 사용할 수 있다.

 

html2canvas(textArea, {
	}).then(canvas => {
	saveAs(canvas.toDataURL('image/png'),"capture01.png")
})

 

 


 

트러블슈팅

 

문제

 

나는 텍스트 파일이 그려진 화면을 캡쳐해야 했다.

구조는 대충 이런 형식이다.

<div id='parentDiv'>
	<pre id='textArea'>
		{{ 텍스트 데이터 내용이 담긴 부분 }}
	</pre>
</div>

 

문제는 화면이 보이는 영역보다 해당 텍스트 데이터(id='textArea')가 더 크기가 컸기때문에

하단 내용이 화면에서 잘리고 스크롤이 생긴다는 것이다.

 

이상황에서 html2canvas를 사용하여 캡쳐를 할 경우

렌더링 과정에서 스크롤 바깥부분은 잘린채로 캡쳐되는 문제가 있었다.

 

검색했을때 스크롤이동, 좌표값 할당 등 다양한 방법이 있었지만

해결책은 은근 간단했다.

 


 

해결방법

 

컨트롤 요소는 두가지이다.

1. 스크롤

2. 높이

 

 

1. 스크롤

우선 텍스트영역에 스크롤을 활성화 시켜줬다. (overflow: auto)

그 후 상위 div 태그에 스크롤을 비활성화 시켜준다. (overflow: hidden)

위의 코드에 적용하면 다음과 같다.

<div id='parentDiv' style="overflow: hidden;">
	<pre id='textArea' style="overflow: auto;"> // 이때 height값이 적용되어야 함.
		{{ 텍스트 데이터 내용이 담긴 부분 }}
	</pre>
</div>

 

 

2. 높이

그 후 우선 캡쳐를 하려는 텍스트영역의 높이값이 할당되어 있는지 확인해봐야한다.

100% 와 같은 상대값이 아닌, 500px 등과 같이 해당 텍스트영역의 절대값 높이가 할당되어 있어야 한다.

나는 html영역에서 css로 텍스트영역에 100%로 높이값이 설정되어있다고 가정하고

클릭이벤트 발생시 javascript로 높이값을 할당해주려고 한다.

 

코드는 다음과 같다.

 

*html

<div id='parentDiv' style="overflow: hidden;">
	<pre id='textArea' style="overflow: auto; height: 100%;"> // 이때 height값이 적용되어야 함.
		{{ 텍스트 데이터 내용이 담긴 부분 }}
	</pre>
</div>

 

*js (클릭이벤트가 발생하는 함수에 적용시킨다.)

const el = document.getElementById('textArea')
el.style.height = el.scrollHeight + 'px'

 

이렇게 하면 클릭이벤트 발생시 해당 텍스트 영역의 전체 높이가 pre태그 height로 할당되어

잘리는 부분 없이 이미지 변환값을 얻을 수 있다 ㅎㅎ!

'과거의 이력 > javascript' 카테고리의 다른 글

[javascript] 자바스크립트 객체(Object타입)란..?  (0) 2022.02.07
[javascript] 비동기함수 setTimeout, 비동기 작업단위 Promise  (0) 2022.02.04
[javascript] ES6 let의 블록스코프, 렉시컬환경 for문으로 알아보자!  (0) 2022.02.04
[javascript] error: Cannot read property '_wrapper' of undefined. (Vue.js 에러)  (0) 2022.01.24
[javascript] Array.forEach 자주하는 실수(some, every 사용하기)  (2) 2021.12.13
'과거의 이력/javascript' 카테고리의 다른 글
  • [javascript] 비동기함수 setTimeout, 비동기 작업단위 Promise
  • [javascript] ES6 let의 블록스코프, 렉시컬환경 for문으로 알아보자!
  • [javascript] error: Cannot read property '_wrapper' of undefined. (Vue.js 에러)
  • [javascript] Array.forEach 자주하는 실수(some, every 사용하기)
정많이 정만이
정많이 정만이
jeongmany
  • 정많이 정만이
    정많이 정만이
    정많이 정만이
  • 전체
    오늘
    어제
    • 분류 전체보기 (80)
      • 과거의 이력 (71)
        • CS (12)
        • 프론트엔드 (4)
        • javascript (21)
        • Vue.js (7)
        • bootstrap (1)
        • [그리드] ag-grid (3)
        • [그리드] vue-grid-layout (1)
        • HTML_CSS (5)
        • NPM (1)
        • [차트]highcharts (0)
        • JAVA (9)
        • 백엔드 (1)
        • 기본개념 (손필기) (5)
        • 프로그래머스 (1)
      • 알고리즘 (6)
      • 통계 (9)
        • 통계지식 (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자바스크립트
    HTML
    ubuntu
    webpack.config.js
    우분투
    aggrid
    공유메모리
    알고리즘
    cs
    vue.js
    반복문
    ES6
    개발자
    java
    Webpack
    js map
    JavaScript
    js
    vue.config.js
    CSS
    VirtualBox
    selectbox
    코딩테스트
    ubuntu설치
    bootstrap
    vue
    vuejs
    객체
    버추얼박스
    ag-grid
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
정많이 정만이
[javascript] html2canvas로 영역 캡쳐하기 (scroll 영역부분이 캡쳐가 안된다면?)
상단으로

티스토리툴바