Html2canvas: 'overflowauto'divで非衚瀺郚分をいっぱいにレンダリングする方法

䜜成日 2012幎02月22日  Â·  34コメント  Â·  ゜ヌス: niklasvh/html2canvas

画像に倉換する必芁のあるすべおの芁玠を含むdivがありたす。 そしお、そのdivは ' overflowauto 'に蚭定されたす。 すべおの芁玠スクロヌルに隠されおいるものも含むを画像に゚クスポヌトする方法を知りたいです。 私はあなたのコメントず答えすべおに感謝し、歓迎したす......事前に感謝したす...

最も参考になるコメント

@ruthraprakash 、私は同様の問題を抱えおいたした。 これは、最新バヌゞョンでの私の単玔な目的で機胜したす。

function fullhtml2canvas(el) {
    return new Promise(resolve => {
        html2canvas(el, {
            width: el.scrollWidth,
            height: el.scrollHeight,
        }).then(canvas => {
            resolve(canvas);
        });
    });
}

党おのコメント34件

珟圚、特定のオプションを䜿甚しおペヌゞをレンダリングするオプションはありたせん。そのため、ペヌゞを倉曎しお、垌望どおりに衚瀺する必芁がありたす。

぀たり、高さ/幅の制限を削陀し、html2canvasを実行しおから、高さ/幅を元の倀に戻すず、目的の結果が埗られるはずです。

どうもありがずうございたした....私はあなたが蚀ったこずを詊しおみたす...

長い間詊しおみたしたが でも倧倉です おっしゃった通りにはいきたせんでした。 スクロヌルがあっおも「body」の堎合はうたくいくこずがわかりたした...スクロヌルのある芁玠を持぀divでも同じこずを達成したいず思いたす...この問題で私を助けるこずができれば私にずっお倧きな助けになりたす...私はあなたのコメントを楜しみにしおいたす...

@niklasvh 、私は同じ問題を抱えおいたす、そしお私がした唯䞀の回避策は、 html2canvas 垞にオプションではないを呌び出す前にタヌゲット芁玠の幅を瞮小するか、 html2canvasを呌び出すこずです同じ芁玠で2回続けお

http://jsfiddle.net/fMeRC/1/ この特定の䟋はChromeでのみ機胜したす。他のブラりザヌで問題を確認するには、幅をいじる必芁がありたす

これは基本的に、芁玠がりィンドりたたは(document.width - 8)よりも広い堎合にのみ発生したす。どちらがより重芁で盎接的な関連性があるかはわかりたせん。これは、他のブラりザで倉曎される可胜性がありたす。

おそらく関連しおいる199ず108。

childElementを詊したか、「overflow = visible」を蚭定しおから「overflow = auto | hidden | inherit」を蚭定したしたか

スタむルのないchildElement、オヌバヌフロヌのあるdivのコンテンツのみを受け取る

<div id="main"><!--// main div -->
<div class="mainContent"><!--// div without style (height: auto, width: auto, margin: 0, padding: 0) -->
...content...
html2canvas([$("#main div.mainContent").get(0)],...)

提案をありがずう、@ brcontainer。 overflow: visible -> html2canvas( ... ) -> overflow: [old overflow]アプロヌチを詊したしたが、非衚瀺/非衚瀺/非衚瀺のコンテンツのフラッシュが目立ちすぎたしたおそらくタヌゲット芁玠が原因です比范的耇雑です。 私は、その点で違いを生むように思われる回避策のわずかに最適化されたバリアントを思い぀いたばかりですが

html2canvas( targetElement, {
  onpreloaded: function(){ /* set parent overflow to visible */},
  onparsed: function(){  /* reset parent overflow */ },
  // ... onrendered, etc.
});

これにより、h2cがタヌゲットを適切に解析するのに必芁な最短時間私が思うにだけオヌバヌフロヌが「衚瀺」に蚭定されるため、少なくずも私の堎合は、フラッシュがほが完党に排陀されたす。 ぀たり、オヌバヌフロヌをリセット/再非衚瀺にする前に、キャンバスのレンダリング手順が終了するのを埅぀必芁がなくなりたした。 この倉曎されたアプロヌチがすべおの人に圹立぀かどうかはわかりたせんが、 html2canvas( ... ) 2回続けお呌び出すか、DOMに远加のものを远加しおタヌゲットコンテンツをラップするよりも良い回避策だず思いたす。

いずれにせよ、これはただ本圓のバグであり、適切に修正しおもらいたいず思っおいたす。 特に、IE9ず10ではどちらの回避策も正しく機胜しないように思われるため、少なくずもIE11では詊しおいたせん。

_泚前述の回避策は、珟圚マスタヌにある最新バヌゞョンでは機胜したせん。 私はテストしおいたせんが、代わりにonclonedオプションを䜿甚する必芁があるようです。オヌバヌフロヌした芪のリセットは、 .then()ぞのコヌルバックで呌び出されたす。 クロヌンされたドキュメント内で芪のオヌバヌフロヌを排他的に衚瀺するこずも可胜であり、䜕もリセットする必芁はありたせん。_

なぜこのように䜿甚するのかわかりたせん。次のようにするずよいでしょう。

function SnapShotDOM(target,call){
    var data = {};

    //use jquery or getComputedStyle|style.overflow
    data.overflow = /*get overflow property*/;
    data.width = /*get width property*/;
    data.height = /*get height property*/;
    data.maxWidth = /*get maxWidth property*/;
    data.maxHeight = /*get maxHeight  property*/;

    target.style.overflow="visible !important";
    target.style.height="auto !important";
    target.style.maxHeight="auto !important";

    html2canvas(target, {
        "onrendered": function(canvas) {
            target.style.overflow = data.overflow;
            target.style.width = data.width;
            target.style.height = data.height;
            target.style.maxWidth = data.maxWidth;
            target.style.maxHeight = data.maxHeight;
            call(canvas);
        }
    });
}

SnapShotDOM(document.body,function(canvas){
    console.log(canvas);
});

たたはクラスを䜿甚したす。

<style>
*.html2canvasreset{
    overflow: visible !important;
    width: auto !important;
    height: auto !important;
    max-height: auto !important;
}
</style>
<script>
function SnapShotDOM(target,call){
    var data = target.className;
    target.className += " html2canvasreset";//set className - Jquery: $(target).addClass("html2canvasreset");
    html2canvas(target, {
        "onrendered": function(canvas) {
            target.className = data;//old className - Jquery: $(target).removeClass("html2canvasreset");
            call(canvas);
        }
    });
}

SnapShotDOM(document.body,function(canvas){
    console.log(canvas);
});
</script>

onrenderedにオヌバヌフロヌに関連するものを䜕も入れない理由は、解析ずレンダリングの間の時間が目立぀可胜性があり、オヌバヌフロヌをできるだけ早く぀たり、解析盎埌、レンダリング前にリセットするこずが望たしいためです。コンテンツの目に芋えるフラッシュを避けるため。 代わりに、オヌバヌフロヌリセットをonparsedに入れるず、これが実珟したす。

私は「オンプリロヌド」に぀いお蚀及しおいたした。

これを詊しお

function SnapShotDOM(target,call){
    var data = target.className;
    target.className += " html2canvasreset";//set className - Jquery: $(target).addClass("html2canvasreset");
    html2canvas(target, {
        "onparsed": function() {
            target.className = data;//old className - Jquery: $(target).removeClass("html2canvasreset");
        },
        "onrendered": function(canvas) {
            call(canvas);
        }
    });
}

SnapShotDOM(document.body,function(canvas){
    console.log(canvas);
});

私がonpreloadedを䜿甚するのも同じ理由です。これは、オヌバヌフロヌの非衚瀺郚分を解析ステップの盎前の可胜な限り最新の瞬間に移動できるようにする最適化であり、これにより、コンテンツは画面に完党に衚瀺されたす。 これがどのように機胜するかここのコヌドで確認できたす。

@niklasvh 、この問題はここにあるTODO options.useOverflow に関連しおいたすか

どのバヌゞョンを䜿甚したしたか..私のバヌゞョンでonparsedおよびonpreloadedメ゜ッドを芋぀けるこずができたす。
html2canvas-0.5.0-alpha1を䜿甚しおいるim

@ejlocopこの問題は以前のバヌゞョンで数幎前に提出されたものであり、ナヌスケヌス511ずは関係がない可胜性がありたす。

圌らは問題を解決したしたか パラア゜リュヌションガントチャヌトで䜕かを探しおいたす。完党にあなたが必芁です...
overflow

動いおいない。

http://jsfiddle.net/fMeRC/368/

@pkpatelsなぜ機胜しないのですか 私はあなたのフィドルを走らせたした、そしお、文は途切れるこずなくレンダリングされたした...
私もこの問題を抱えおいたした、そしお私のために働いた解決策はで提案されたものです117

@uriklar垂盎スクロヌルではなく、氎平スクロヌルで機胜したす。 私のdivをチェックアりトしおください。 そこには3぀の異なる芁玠がありたす。

@uriklar divを䞋にスクロヌルしお完党に衚瀺をクリックするず、提案する゜リュヌションも機胜したせん。
screen shot 2016-03-16 at 1 41 09 pm

レンダリング前に#textdivの高さをautoに蚭定し、レンダリング埌にリセットするのはどうですか それはうたくいくでしょう。

最新のリリヌス0.5.0-beta4ではただオヌバヌフロヌの問題がありたした。 @usmonsterの回避策を採甚し、h2cずPromisesぞの最近の倉曎に適合させたした @usmonsterのメモで説明されおい

泚前述の回避策は、珟圚マスタヌにある最新バヌゞョンでは機胜したせん。 私はテストしおいたせんが、代わりにonclonedオプションを䜿甚する必芁があるようで、オヌバヌフロヌの芪リセットが.thenぞのコヌルバックで呌び出されるようになりたした。 クロヌンされたドキュメント内で芪のオヌバヌフロヌを排他的に衚瀺するこずも可胜であり、䜕もリセットする必芁はありたせん。

したがっお、Webペヌゞの実際のDOMを倉曎せずに、 oncloneコヌルバックを利甚しお、h2cによるレンダリングに䜿甚される耇補されたドキュメントを倉曎できたす。 実際には非垞に簡単です。これが私のh2c呌び出しです。

var renderingPromise = html2canvas($(item), {
    width: item.clientWidth,
    height: item.clientHeight,
    onclone: function(clone) {
            $(clone).find('.grid-stack-item-content')
                .css('overflow-x', 'auto')
                .css('overflow-y', 'auto');
        return true;
    }
}).then(
    function(c) {/* success */},
    function() {/* fail */}
);

私にずっおうたくいったのは、キャンバスをiframeに配眮し、その䞭でhtml2canvasを呌び出し、キャンバスでtoDataURLを呌び出し、コヌルバックを䜿甚しおその画像をトップりィンドりに戻すこずだけでした。 キャンバスオブゞェクトを返すこずもできるず思いたす。

return renderDocument(node.ownerDocument, options, node.ownerDocument.defaultView.innerWidth, node.ownerDocument.defaultView.innerHeight, index).then(function(canvas) { if (typeof(options.onrendered) === "function") { log("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas"); options.onrendered(canvas); } return canvas; });
ぞの倉曎
var width = options.width != null ? options.width : node.ownerDocument.defaultView.innerWidth; var height = options.height != null ? options.height+node.ownerDocument.defaultView.innerHeight : node.ownerDocument.defaultView.innerHeight; return renderDocument(node.ownerDocument, options, width, height, index).then(function (canvas) { if (typeof(options.onrendered) === "function") { log("options.onrendered is deprecated, html2canvas returns a Promise containing the canvas"); options.onrendered(canvas); } return canvas; });

これは、画面のオヌバヌフロヌ幅ず高さの䞡方に関する質問を解決するこずができたす

xzw123には悪い解決策がありたす。 ownerDocument.defaultView.innerHeight手動で蚭定するず、実際のりィンドりサむズ蚭定むベントからバむンドが解陀されたす。 これはiframeで行うのが最善だず思いたす。 私はゞョヌダンの解決策を詊すこずに熱心です。

ゞョヌダン、どうやっおiframeでキャンバスを䜿うこずになったのですか 私は今それを詊みおいたす。 これがhtml2canvasの最終的な解決策になるず思いたす... iframe通信をAPIの倖郚で非衚瀺にする必芁がありたす。

はい、 window.postMessage(myData, ... )しおiframeで実行するずうたくいきたす。 レンダリングされたピクセルのデヌタURL党䜓をポストバックできたす。 レンダリングコヌドをiframeのHTMLに配眮し、HTML゜ヌスのレンダリングに必芁なデヌタを枡しお、キャンバスにレンダリングしおから、toDataUrlデヌタを吐き出したす。

+1

やあ。 解決策を探し、コヌドがどのように実行されるかを芳察した埌、私は独自のトリッキヌな解決策を曞きたす。

https://gist.github.com/simonmysun/c6da13ce2827a374e71ccf07d9f08e2d

それは私のために働きたす、そしお私はそれが必芁ずする誰かを助けるこずを願っおいたす。

ただし、将来的にはこのラむブラリでサポヌトされるこずを願っおいたす。

ただわかりたせんが、問題は画像が途切れるずいうこずです。 クロムバヌゞョン54.0.2840.99mを䜿甚する堎合
半分の画像はスクリヌンショットになりたしたが、残りの半分は黒い画面になりたした

// the timeline show up 100%, but cut off, cause its static and not dynamic.
// (its cut off from the screen,but the size, and picture show as normal, 100% show)
// after moving to the canvas, everthing that not in the screen will get blank in chrome  
// it depends to the user screen, if i zoom out my chrome, i get 100% image.

ただし、Mozilla 50.0.2を䜿甚しおいる堎合は、ズヌムアりトしなくおも正垞に機胜したす。 100画像、

理由はわかりたせん。

コヌド

var zenleft = $("#leftPanel").width();  //calculate left side
var zenright = $(".dataPanel").width();  //calculate right side
var after = zenright + zenleft + 250;  // add all

//add the css, even after add overflow still not working
$("#timelineTarget").css({"background-color":"white","width":after});   

 html2canvas(canvTimeline, {
    onrendered: function (canvas) {
            $("#previewImage").html(canvas);
            getCanvas = canvas;
   }
});

image

最埌に、远加しおこの問題を解決したす

$("body").css({"width": "+="+after}); //after is a total of the width of the element i want to view

それで

var zenleft = $("#leftPanel").width();  //calculate left side
var zenright = $(".dataPanel").width();  //calculate right side
var after = zenright + zenleft + 250;  // add all
$("body").css({"width": "+="+after});  //add the body

//add the css
$("#timelineTarget").css({"background-color":"white","width":after});   

 html2canvas(canvTimeline, {
    onrendered: function (canvas) {
            $("#previewImage").html(canvas);
            $("#timelineTarget").css({"background-color":"white","width":old});   //turn it back
            $("body").css({"width": "-="+after});   //turn it back
            getCanvas = canvas;
   }
});

それがあなた自身の問題を解決するこずを願っおいたす。

oncloneが正しい方法かもしれたせん。 cssを倉曎しお、必芁なものを取埗できたす。

こんにちはすべお、私はスクロヌル可胜なdivを持っおいたす。 div入力をcanvasパラメヌタヌずしお送信するず、ビュヌポヌトで䜿甚可胜なものがレンダリングされるだけです。 私はすべおの解決策を詊したした。 わかりたせんでした。 divのコンテンツ党䜓をスクリヌンショットずしお取埗する方法を誰かに教えおもらえたすか

@ruthraprakash 、私は同様の問題を抱えおいたした。 これは、最新バヌゞョンでの私の単玔な目的で機胜したす。

function fullhtml2canvas(el) {
    return new Promise(resolve => {
        html2canvas(el, {
            width: el.scrollWidth,
            height: el.scrollHeight,
        }).then(canvas => {
            resolve(canvas);
        });
    });
}

タむムラむンチャヌトのスクリヌンショットを撮るのに問題がありたす。 x軞の倀を取埗しおいたせん。 ティムラむンチャヌトの画像を䜜成しおいるだけです。
`demoFromHTMLe{
e.preventDefault;

  let input = window.document.getElementById('divToPDF');


  html2canvas(input)
  .then((canvas) => {

    const imgData = canvas.toDataURL('image/jpeg');

    const pdf = new pdfConverter("l", "pt");
    pdf.addImage(imgData, 'JPEG', 15, 110, 800, 250);
    pdf.save('test.pdf');
  });


}

`

長い間詊しおみたしたが でも倧倉です おっしゃった通りにはいきたせんでした。 スクロヌルがあっおも「body」の堎合はうたくいくこずがわかりたした...スクロヌルのある芁玠を持぀divでも同じこずを達成したいず思いたす...この問題で私を助けるこずができれば私にずっお倧きな助けになりたす...私はあなたのコメントを楜しみにしおいたす...

どうやっお䜓を動かしたのか教えおください

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡