html2canvas原理


html2canvas有2種模式,一種是利用foreignObject,一種是純canvas繪制

1.foreignObject到canvas

步驟:

  1.把要截圖的dom克隆一份,過程中把getComputedStyle附上style

  2.放到svg的foreignObject中

  3.把svg序列化成img的src(SVG直接內聯):

img.src = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(new XMLSerializer().serializeToString(svg));

  4.ctx.drawImage(img, ....)

2.純canvas

步驟:

  1.把要截圖的dom克隆一份,過程中把getComputedStyle附上style

  2.把克隆的dom轉成類似VirtualDom的對象

  3.遞歸這個對象,根據父子關系、層疊關系來計算出一個renderQueue

  4.每個renderQueue Item都是一個虛擬dom對象,根據之前getComputedStyle得到的style信息,調用ctx的各種方法

 

總結:

  性能:如果文本多,節點少,svg foreignObject的方式往往性能更高;文本少,節點多的時候,canvas反而性能更高

  准確性:純canvas方式往往更准確的還原dom的表現;svg foreignObject在比較復雜的情況下會出現截圖不准確的問題

綜上所述,建議使用純canvas方式,但是注意要對文本進行限流!

 

類似的庫:rasterizeHTML

參考文章:https://juejin.im/entry/58b91491570c35006c4f7fdf

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM