div内にoverflow-x:scrollを使用して長い線グラフを表示するWebページがあります。これは、グラフを前後にスクロールできるWebページとしてうまく機能します。
ただし、ページを印刷すると、スクロール位置はゼロにリセットされます。これを克服する方法はありますか?
div内にoverflow-x:scrollを使用して長い線グラフを表示するWebページがあります。これは、グラフを前後にスクロールできるWebページとしてうまく機能します。
ただし、ページを印刷すると、スクロール位置はゼロにリセットされます。これを克服する方法はありますか?
どういうわけかオーバーフローを削除する必要がある印刷用の代替CSSを指定する必要があると思います。
<link rel="stylesheet" type="text/css” href="sheet.css" media="print" />
しかし、JavaScriptやFlashを使ったアプローチがあるのではないでしょうか。私が正しく理解していれば、グラフの一部(ユーザーが「選択」したもの)だけを印刷し、完全なグラフは印刷したくないですか?プレーンなHTML/CSSではそれが不可能だと確信していますが、FlashまたはJavaScript / AJAX(一度に画像の一部のみをロードする)で解決できると強く信じています。
プレーン CSS ではこれを行うことはできません。必要なものを取得するには、選択した Javascript UI ライブラリを使用してスクロールを再実装する必要があります。
スクロールバーのユーザー状態は、印刷時には使用されません (考えてみてください。ページを 3 画面下にスクロールして「印刷」を押した場合、ブラウザーがドキュメントの一部のみを印刷するのは理にかなっていますか?当時の窓口?)ただし、実際に DOM を操作する JS を使用する場合 (つまり、CSS と同様に、人が右に 293 ピクセルスクロールした場合、x 位置オフセットを -293 に設定しますstyle="left: -293px; overflow: hidden;"
)、印刷されたドキュメントではそのまま表示されます。
私の提案は、グラフが非常に広い場合を除き、このナンセンスをすべてスキップして、グラフにプリンタースタイルシートを使用しwidth: 100%
て、グラフ<div>
がページ幅に縮小されるようにすることです。
簡単なアプローチは、「印刷の設定」のようなリンクでユーザーが選択したスクロール位置をページにポストバックする JavaScript を用意することです。overflow:hidden
次に、サーバー側は、グラフを適切にクリップするために、グラフがスクロール位置に相対的に配置されたページを返します。
もちろん、これは javascript が無効になっているユーザーには機能しません。これをサポートしたい場合は、テキスト入力要素や送信ボタンなどでスクロール位置を指定する必要があります。
親のスクロール位置を一時的に子の負のマージンに変更し、その親をoverflow:hiddenとして配置する必要があります。
Javascriptでそれを行う方法は次のとおりです(これが唯一の方法であり、cssはそれを行うことができません)
すべてを正常に復元するには、印刷後に printDone() を実行する必要があることに注意してください。たとえば、ユーザーがスクロールしようとしたときにのみ問題が発生するため、ホイールイベントでトリガーできます。または、私が行ったようにボタンを配置して、printGo() が呼び出されたときにのみ表示することもできます。
<html>
<head>
<style>
#wrapper {
width:800px;
overflow-x:scroll;
}
#content {
width:2000px;
border:2px solid red;
}
@media print { /* This overwrites the css when printing */
#wrapper {
overflow-x:hidden;
}
}
</style>
</head>
<body>
<a href="#" onclick="printGo()">Print</a><br>
<a href="#" onclick="printDone()">I'm done printing!</a>
<div id=wrapper>
<div id=content>
Hello this is my content.
</div>
</div>
<script>
var wrapper = document.getElementById('wrapper');
var content = document.getElementById('content');
var scrollPos;
function printGo(){
scrollPos = wrapper.scrollLeft; // Save scroll position
wrapper.scrollLeft = 0;
wrapper.style.overflowX = 'hidden'; // Optional since css does it
content.style.marginLeft = -scrollPos+'px'; // Put it as a negative margin of child instead
window.print();
}
function printDone(){
wrapper.scrollLeft = scrollPos; // Restore scroll position
wrapper.style.overflowX = 'scroll'; // Optional since css does it
content.style.marginLeft = '';
}
</script>
</body></html>