Html2canvas: λ³΄μ΄λŠ” κ²ƒλ§Œ λ Œλ”λ§

에 λ§Œλ“  2015λ…„ 06μ›” 25일  Β·  22μ½”λ©˜νŠΈ  Β·  좜처: niklasvh/html2canvas

κ²°κ³Ό 이미지 ν¬κΈ°λŠ” μ˜€λ²„ν”Œλ‘œλœ λ‚΄μš©μ„ ν¬ν•¨ν•˜μ—¬ λͺ¨λ“  μ°½ λ‚΄μš©λ§ŒνΌ 컀 λ³΄μ΄μ§€λ§Œ μ‹€μ œλ‘œλŠ” λ·°ν¬νŠΈμ—μ„œλ§Œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

이것은 λ‚΄κ°€ μ œκ±°ν•  수 μžˆλŠ” λͺ¨λ“  κ²ƒμ—μ„œ μ˜€λ²„ν”Œλ‘œλ₯Ό μ œκ±°ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ 이것을 λ°©ν•΄ν•˜λŠ” CSSλŠ” μ—†μŠ΅λ‹ˆλ‹€. 이미지에 ν¬ν•¨λœ 뷰포트 외뢀에 μžˆλŠ” μ½˜ν…μΈ λ₯Ό κ°€μ Έμ˜¬ 수 μžˆλ‚˜μš”? νŽ˜μ΄μ§€λ₯Ό μ•„λž˜λ‘œ μŠ€ν¬λ‘€ν•œ λ‹€μŒ λ‹€μ‹œ μ‹œλ„ν•˜λ”λΌλ„ κ²°κ³ΌλŠ” 슀크둀된 λ·°ν¬νŠΈμ— μžˆλŠ” λ‚΄μš©μ„ μ„ νƒν•˜μ§€ μ•Šκ³  λŒ€μ‹  슀크둀 높이 0에 μžˆλŠ” λ·°ν¬νŠΈμ— μžˆλŠ” λ‚΄μš©μ„ ν¬ν•¨ν•œλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.

campaignperformance 30

Needs More Information

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

μ΄μƒν•˜κ²Œλ„ 주어진 μš”μ†Œμ˜ ν˜„μž¬ λ³΄μ΄λŠ” 상단 κ²½κ³„μ—μ„œλ§Œ λ Œλ”λ§λ©λ‹ˆλ‹€.

https://jsfiddle.net/bianjp/bpc3nq69/1/λ₯Ό μ‹œλ„
버전 0.5.0.beta4 μ‚¬μš©.

해결책은 html2canvasλ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 $('html, body').scrollTop(0) (λ˜λŠ” λ Œλ”λ§ν•  μš”μ†Œμ˜ 상단을 보이게 ν•˜λŠ” λ‹€λ₯Έ 방법)λ₯Ό ν˜ΈμΆœν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

λͺ¨λ“  22 λŒ“κΈ€

어쩐지 ν™ˆνŽ˜μ΄μ§€μ— μžˆλŠ” μ˜ˆλ¬Έμ—μ„œλŠ” μ•ˆλ³΄μ΄λŠ” κ²ƒκΉŒμ§€ λͺΈμ— λ‹€ λ³΄μ—¬μ£Όλ„€μš”... μ–΄λ–»κ²Œ ν•œκ±°μ£ ?

κ°€λŠ₯ν•œ 쀑볡: https://github.com/niklasvh/html2canvas/issues/117

οΌŒνŠΉμ • μš”μ†Œλ₯Ό μΊ‘μ²˜ν•˜λŠ” 방법을 μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λˆ„κ΅¬μ—κ²Œ 해결책이 μžˆμŠ΅λ‹ˆκΉŒ?

@justein 이것을 μ‹œλ„ν•˜μ‹­μ‹œμ˜€

<div id="test-case">Test-me</div>
html2canvas(document.getElementById("test-case")).then(function(canvas) {
    document.body.appendChild(canvas);
});

μ΅œμ‹  λ²„μ „μ—μ„œ 이 λ™μž‘μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. μš”μ²­ν•œ 개체의 μ˜¬λ°”λ₯Έ 크기λ₯Ό λ Œλ”λ§ν•˜μ§€λ§Œ μ‹€μ œλ‘œ ν˜„μž¬ 뷰포트의 ν™”λ©΄ 밖에 μžˆλŠ” 것은 μΊ”λ²„μŠ€μ— λ Œλ”λ§ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ λ§Œμ•½

<div id="test-case">Test-me</div>

ν˜„μž¬ λΈŒλΌμš°μ €μ— ν‘œμ‹œλ˜μ–΄ 있으면 λ Œλ”λ§λ©λ‹ˆλ‹€. ν™”λ©΄ 밖에 μžˆλŠ” 경우 μΊ”λ²„μŠ€λŠ” λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€(κ·ΈλŸ¬λ‚˜ μ˜¬λ°”λ₯Έ ν¬κΈ°μž„). λΆ€λΆ„μ μœΌλ‘œ ν‘œμ‹œλ¨: λΆ€λΆ„μ μœΌλ‘œ λ Œλ”λ§λ©λ‹ˆλ‹€. 광산은 scrollHeight = 0처럼 μž‘λ™ν•˜μ§€ μ•ŠμœΌλ©° μ½”λ“œκ°€ 싀행될 λ•Œ λ³΄μ΄λŠ” λͺ¨λ“  것을 λ Œλ”λ§ν•©λ‹ˆλ‹€. (λ‚΄ λ²„νŠΌμ€ ν•˜λ‹¨μ— μžˆμŠ΅λ‹ˆλ‹€).

btmλ‹˜μ˜ λŒ“κΈ€μ²˜λŸΌ 예제 μ‚¬μ΄νŠΈμ—μ„œλŠ” μ–΄λ–»κ²Œ λ˜λŠ”μ§€ μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€. μ˜€ν”„ 슀크린 λ¦¬μ†ŒμŠ€λ₯Ό μ–»κΈ° μœ„ν•΄ Angular λ˜λŠ” Bootstrap의 무언가에 μ˜μ‘΄ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

@cchubb λ‚˜λŠ” Angleκ³Ό Bootstrap이 이것과 μ–΄λ–€ 관련이 μžˆλŠ”μ§€ μ΄ν•΄ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. John의 λ¬Έμ œλŠ” νŠΉμ • μš”μ†Œλ₯Ό λ Œλ”λ§ν•˜λŠ” 문제인 것 κ°™μŠ΅λ‹ˆλ‹€.

뷰포트 외뢀에 μžˆλŠ” λ Œλ”λ§μ„ μ›ν•˜λ©΄ λ‹€μŒμ„ μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.

html2canvas(document.body).then(function (canvas) {});

μš”μ†Œλ₯Ό "μ˜€λ²„ν”Œλ‘œ"둜 λ Œλ”λ§ν•˜λ €λ©΄ λŸ°νƒ€μž„μ— "μ˜€λ²„ν”Œλ‘œ"λ₯Ό μ œκ±°ν•˜κ³  λ‹€μŒκ³Ό 같이 className μΆ”κ°€λ₯Ό μœ„ν•΄ javascriptλ₯Ό μ‚¬μš©ν•˜μ—¬ ν”„λ‘œμ„ΈμŠ€ 후에 λ‹€μ‹œ μΆ”κ°€ν•©λ‹ˆλ‹€.

.no-scroll {
     overflow: visible !important;
}

#main {
     overflow: auto;
     height: 200px;
}

<div id="main">
test<br> test<br> test<br> test<br> test<br> test<br> test<br> test<br> 
test<br> test<br> test<br> test<br> test<br> test<br> test<br> test<br> 
test<br> test<br> test<br> test<br> test<br> test<br> test<br> test<br> 
</div>

document.getElementById("main").className = "no-scroll";
html2canvas(document.body).then(function (canvas) {
      document.getElementById("main").className = "";
});

λ˜λŠ” λ‹€μŒκ³Ό 같이 "overflow"λ₯Ό μ‚¬μš©ν•˜μ—¬ μš”μ†Œ λ‚΄μ˜ μš”μ†Œλ₯Ό λ Œλ”λ§ν•˜λ„λ‘ html2canvasλ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

#parent {
     overflow: auto;
     height: 200px;
}

#child {
background-color: #fc0;
height: 600px;
}
<div id="parent">
<div id="main">
test<br> test<br> test<br> test<br> test<br> test<br> test<br> test<br> 
test<br> test<br> test<br> test<br> test<br> test<br> test<br> test<br> 
test<br> test<br> test<br> test<br> test<br> test<br> test<br> test<br> 
</div>
</div>

html2canvas(document.getElementById("main")).then(function (canvas) {});

정말 λ‚΄ κ΄€μ μ—μ„œ λΆˆν•„μš”ν•œ κΈ°λŠ₯에 λŒ€ν•œ λ§Žμ€ μ œμ•ˆμ΄ μžˆμŠ΅λ‹ˆλ‹€. λ‹¨μˆœνžˆ μ˜¬λ°”λ₯Έ DOM μš”μ†Œλ₯Ό λŒ€μƒμœΌλ‘œ ν•˜κ³  "CSS"λ₯Ό μœ λ¦¬ν•˜κ²Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

λ‚˜λŠ” 그것을 μ•Œμ•„. 0.5.0-alpha2μ—μ„œ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. 0.5.0-alpha1 버전을 μ‚¬μš©ν•˜λ©΄ ν΄λ¦¬ν•‘λ˜μ§€λ§Œ alpha2 버전은 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€. 릴리슀 νŽ˜μ΄μ§€κ°€ alpha1에 μ΄ˆμ μ„ λ§žμΆ”κ³  μžˆμ—ˆκΈ° λ•Œλ¬Έμ— alpha2λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 사싀쑰차 μ•Œμ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ alpha2와 ν•¨κ»˜ μž‘λ™ν•˜λŠ” 것을 λ³΄μ—¬μ£ΌλŠ” λ°”μ΄μ˜¬λ¦°μž…λ‹ˆλ‹€. https://jsfiddle.net/cchubb/fy7tw7ek/1/ μ™ΈλΆ€ λ¦¬μ†ŒμŠ€λ₯Ό λ‹€μ‹œ alpha1둜 λ³€κ²½ν•˜λ©΄ ν•˜λ‹¨ 링크λ₯Ό ν΄λ¦­ν•˜λ©΄ μž˜λ¦½λ‹ˆλ‹€. (λ‹€μš΄λ‘œλ“œ νŒŒμΌμ„ 보렀면 .png둜 μ €μž₯ν•΄μ•Ό ν•©λ‹ˆλ‹€. fiddlesμ—μ„œλŠ” 좜λ ₯ μ°½ hrefλ₯Ό λ°μ΄ν„°λ‘œ λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.)

@btm1 ,

@cchubb ν•œλ²ˆ 해보 κ² μŠ΅λ‹ˆλ‹€.

@cchubb 근본적인 λ¬Έμ œλŠ” μ•ŒνŒŒ 2μ—μ„œ μˆ˜μ •λ˜μ—ˆμœΌλ©° 잘 숨겨져 μžˆμ–΄ μ•ŒνŒŒ 2κ°€ μžˆλŠ” 쀄도 λͺ°λžμŠ΅λ‹ˆλ‹€.

흠, alpha2μ—μ„œλ„ μ—¬μ „νžˆ λ·°ν¬νŠΈμ—μ„œ "λ³΄μ΄λŠ”" μš”μ†Œμ˜ μΌλΆ€λ§Œ λ Œλ”λ§λ©λ‹ˆλ‹€. 데λͺ¨λŠ” http://jsfiddle.net/NPC42/ykvL6a17/ 을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€. html2canvasλŠ” 슀크둀된 ν–‰λ§Œ 뷰포트둜 λ‚΄λ³΄λƒ…λ‹ˆλ‹€(슀크둀된 μ»¨ν…Œμ΄λ„ˆ div에 ν‘œμ‹œλ˜λŠ”μ§€ 여뢀에 관계없이).

μ–΄λ–»κ²Œ λ“  html2canvasλ₯Ό 잘λͺ» ν˜ΈμΆœν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ? 데λͺ¨μš©μœΌλ‘œ λ§Œλ“  JSFiddle이 μ•„λ‹Œ μ‹€μ œ μ½”λ“œμ—μ„œ ν…ŒμŠ€νŠΈν•  λ•Œ 이 μ œμ•ˆμ€ 전체 μš”μ†Œλ₯Ό λ Œλ”λ§ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€. https://github.com/niklasvh/html2canvas/issues/650 라이브러리 해킹을 ν”Όν•˜κΈ° μœ„ν•΄.

@NPC 그것은 당신이 μ•„λ¬΄κ²ƒλ„ν•˜μ§€ μ•Šκ³ λ³΄κΈ°μ—μ—†λŠ” 것을 λ Œλ”λ§ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. μ˜€λ²„ν”Œλ‘œκ°€ 보이도둝 λ³€κ²½ν•΄μ•Όν•©λ‹ˆλ‹€ ---> 정말 빨리 내보내기 ---> λ‹€μ‹œ μŠ€ν¬λ‘€ν•˜μ—¬ λ‹€μ‹œ λ³€κ²½ν•΄μ•Ό μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이상적인 IMOλŠ” μ•„λ‹ˆμ§€λ§Œ μž‘λ™ν•˜λ„λ‘ ν•˜λŠ” μ˜΅μ…˜μ΄ μžˆμ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ 적어도 μž‘λ™ν•©λ‹ˆλ‹€.

@btm1 , 예, 슀크둀된 μš”μ†Œ 내에 μžˆλŠ” μš”μ†Œλ₯Ό μ „λ‹¬ν•˜κΈ° λ•Œλ¬Έμ— μš”μ†Œ μžμ²΄μ— μ˜€λ²„ν”Œλ‘œ 트리밍이 μ—†μœΌλ―€λ‘œ μ˜λ„κ°€ μ•„λ‹ˆλΌκ³  κ°€μ •ν•©λ‹ˆλ‹€.

μ§€κΈˆμ€ λ‚΄ μ•±μ—μ„œ 전체 μš”μ†Œλ₯Ό 본문에 λ‹€μ‹œ μ—°κ²°ν•˜μ—¬ νŠΉμ • λ„ˆλΉ„/높이λ₯Ό μ μš©ν•΄μ•Ό ν•œλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€(μ ˆλŒ€ μœ„μΉ˜ μš”μ†Œκ°€ ν¬ν•¨λ˜μ–΄ 있기 λ•Œλ¬Έμ—). κ·Έ λ™μ•ˆ 전체 ν™”λ©΄ "내보내기 μ€€λΉ„ 쀑, html2canvasκ°€ λͺ¨λ‘ λ Œλ”λ§ν•˜λŠ” 데 10초 이상이 걸리기 λ•Œλ¬Έμ— "κΈ°λ‹€λ € μ£Όμ‹­μ‹œμ˜€." μ˜€λ²„λ ˆμ΄κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€. λ Œλ”λ§μ΄ μ™„λ£Œλœ ν›„ λ„ˆλΉ„/높이 섀정을 ν•΄μ œν•˜μ—¬ μ›λž˜ μœ„μΉ˜(슀크둀된 μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€)에 λ‹€μ‹œ λΆ€μ°©ν•©λ‹ˆλ‹€.

λ²ˆκ±°λ‘­μ§€λ§Œ μž‘λ™ν•©λ‹ˆλ‹€.

μ΄μƒν•˜κ²Œλ„ 주어진 μš”μ†Œμ˜ ν˜„μž¬ λ³΄μ΄λŠ” 상단 κ²½κ³„μ—μ„œλ§Œ λ Œλ”λ§λ©λ‹ˆλ‹€.

https://jsfiddle.net/bianjp/bpc3nq69/1/λ₯Ό μ‹œλ„
버전 0.5.0.beta4 μ‚¬μš©.

해결책은 html2canvasλ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 $('html, body').scrollTop(0) (λ˜λŠ” λ Œλ”λ§ν•  μš”μ†Œμ˜ 상단을 보이게 ν•˜λŠ” λ‹€λ₯Έ 방법)λ₯Ό ν˜ΈμΆœν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

μˆ˜μ • μ œμ•ˆμ— λŒ€ν•΄ @bianjp μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

μ΄μƒν•˜κ²Œλ„ 주어진 μš”μ†Œμ˜ ν˜„μž¬ λ³΄μ΄λŠ” 상단 κ²½κ³„μ—μ„œλ§Œ λ Œλ”λ§λ©λ‹ˆλ‹€.

그것이 정상적인 ν–‰λ™μž…λ‹ˆκΉŒ ... 그것은 λ‚˜μ—κ²Œ 맀우 μ΄μƒν•˜κ²Œ λ³΄μž…λ‹ˆλ‹€!

+1

이 SO 닡변이 μ €μ—κ²Œ

html2canvasλ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 λ Œλ”λ§ν•˜λ €λŠ” μš”μ†Œλ₯Ό 뷰포트둜 μŠ€ν¬λ‘€ν•©λ‹ˆλ‹€.

const el = document.querySelector('#test')
el.scrollIntoView()
setTimeout(function () {
  html2canvas(el, {
    onrendered: function (canvas) {
      document.body.appendChild(canvas)
    },
    useCORS: true
  })
}, 10)

그것은 λ‚˜λ₯Ό μœ„ν•΄ μž‘λ™ν•©λ‹ˆλ‹€.
μ‚¬μš© 버전은 0.5.0-beta4μž…λ‹ˆλ‹€.

이것은 μ—¬μ „νžˆ v1.0.0 의 λ¬Έμ œμž…λ‹ˆκΉŒ? κ·Έλ ‡λ‹€λ©΄ jsfiddle에 λŒ€ν•œ 예λ₯Ό

이 ν˜ΈλŠ” μ›μ €μžμ˜ μΆ”κ°€ 정보 μš”μ²­μ— λŒ€ν•œ 응닡이 μ—†μ—ˆκΈ° λ•Œλ¬Έμ— μžλ™μœΌλ‘œ μ’…λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬ λ¬Έμ œμ— μžˆλŠ” μ •λ³΄λ§ŒμœΌλ‘œλŠ” 쑰치λ₯Ό μ·¨ν•˜κΈ°μ— μΆ©λΆ„ν•œ 정보가 μ—†μŠ΅λ‹ˆλ‹€. 더 쑰사할 수 μžˆλ„λ‘ ν•„μš”ν•œ 닡변이 μžˆκ±°λ‚˜ 찾으면 연락해 μ£Όμ‹­μ‹œμ˜€.

μ•ˆλ…•ν•˜μ„Έμš”, @niklashvh

λ˜ν•œ DOMμ—λ§Œ ν‘œμ‹œλ˜λŠ” μŠ€λƒ…μƒ·μ„ μ°λŠ” λ¬Έμ œμ— μ§λ©΄ν–ˆμŠ΅λ‹ˆλ‹€. 버전 0.5.0-beta4κ°€ μžˆμŠ΅λ‹ˆλ‹€.
λ”°λΌμ„œ @ziyoung μ†”λ£¨μ…˜μ— λ™μ˜ν•©λ‹ˆλ‹€. λ‚˜λŠ” κ·Έκ°€ μ œμ•ˆν•œ λŒ€λ‘œ λ˜‘κ°™μ΄ ν–ˆλ‹€.

           `$('html,body').scrollTop(0);

     html2canvas( $("#rectangular_div"), {
         useCORS: true,
         dpi: 200,

          onrendered:function(canvas) {

              var str = canvas.toDataURL("image/png");
              var contentType = 'image/png';
              console.log(str);
              b64Data =str;
              imgFrameSave();
          }
        })`

κ·Έλž˜μ„œ top 0 의 div μœ„μΉ˜λ₯Ό body 둜 μ„€μ •ν•˜κ³  html2canvas λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. λ”°λΌμ„œ λ‚΄ κ²½ν—˜μ— λ”°λ₯΄λ©΄ 이미지 pix-elation 문제λ₯Ό λ°©μ§€ν•˜κ³  DOMμ—μ„œ 전체 이미지λ₯Ό μΊ‘μ²˜ν•  수 μžˆλ„λ‘ @eKoopmans의 버전 0.5.0-beta4λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

λ°μŠ€ν¬ν†±μ—μ„œλŠ” μž‘λ™ν•˜μ§€λ§Œ λͺ¨λ°”μΌμ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‚΄κ°€ ν•œ 것은 htmltocanvas()λ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 window.scrolTo(0,0) μž…λ‹ˆλ‹€. ν™”λ©΄ 상단에 있으면 divκ°€ μ™„λ£Œλ‘œ μΈμ‡„λ©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰