CSS印刷:ページ間のDIVの半分を避けますか?


199

アイテムの大きなコレクションを取得し、それらをCocoaのWebViewのHTMLにポップするソフトウェアのプラグインを作成しています(WebKitをレンダラーとして使用しているため、基本的にこのHTMLファイルがサファリ)。

それが作成するDIVは動的な高さですが、あまり変化しません。通常は約200pxです。とにかく、ドキュメントごとにこれらのアイテムが約600あり、印刷するのに非常に時間がかかっています。運がよければ、各ページの下と上に半分に切り刻まれたエントリーがあり、実際にプリントアウトを使用するのは非常に困難です。

page-break-before、page-break-after、page-break-inside、およびこれら3つの組み合わせを試してみましたが、役に立たなかった。WebKitが命令を適切にレンダリングしていないか、それとも使い方の理解が足りないのかもしれません。とにかく、私は助けが必要です。印刷時にDIVの半分をカットしないようにするにはどうすればよいですか?


あなたが見ている問題のサンプルドキュメントを提供してください。
X-Istence 2009年

私はここでdivを半分にカットしないことについて非常によく似た質問に答えました:stackoverflow.com/a/14348953/1026459
Travis J

1
注:このプロパティは、絶対配置(およびインラインブロックでも)要素に使用することはできません。
Ujjwal Singh 2018

回答:


336

これはうまくいくはずです:

@media print  
{
    div{
        page-break-inside: avoid;
    }
}

現在のブラウザーサポート(12-03-2014)に注意してください。

  • Chrome-1.0以降
  • Firefox(Gecko)-19.0以降
  • Internet Explorer-8.0以降
  • Opera-7.0以降
  • Safari-1.3以​​降(312)

7
それはすべき仕事します。しかし、そうではありません。ブラウザのサポートについては、en.wikipedia.org / wiki /…を参照してください。
グレッグ

1
Safari 6で動作します:) これは現在、開発者プレビューにあります
LinusUnnebäck12年

1
Chrome V 27.0.1453.116で動作します
T.ブライアンジョーンズ

4
Netscapeでも動作します。ありがとう!

2
メディアプリントが必要な理由 メディア印刷が使用されておらず、ルールがdivに直接適用されている場合も同じですか?
FrenkyB 2016年

21

部分的なソリューションのみ:これをIEで機能させる唯一の方法は、各divを独自のテーブルにラップし、テーブルの改ページを設定して回避することでした。


@easwee:ありがとう。反対投票は、inquisitive_web_developerが質問に賞金を投じると同時に発生しました。私の推測では、彼/彼女はそれが好きではなかったのです。;)
NotMe

3
綺麗な!あなたはチャンピオンです。wkhtmltopdfでこれを行う方法を探していましたが、page-break-inside: avoid;正しくサポートされていません。最後に私はまともな回避策を持っています。
デイブ

2
バージョン0.11のwkhtmltopdfで改ページをテストし、動作しました。
cmc

wkhtmltopdf 0.12.2.1でテスト済み。テーブル内のDivは不要になり、改ページを挿入するだけです。DIVセレクターは避けてください。動作します!
Paul Marti

12

page-break-inside: avoid; wkhtmltopdfの使用に問題が発生しました。

テキストの区切りを回避するdisplay: table;には、テキストを含むdivのCSSに追加します。

これがあなたにも役立つことを願っています。JohnSに感謝します。


エレメントで使用page-break-before: always;するときに、あちこちに現れる説明のつかないスペースをあきらめようとしていました<div>。SO投稿、記事、公式ドキュメントなどの海を検索しました。何も役に立たなかった。しかし、私の友人であるあなたは、ついに私が正確に必要なものを手に入れました!感謝しきれないよ、男!私はあなたに少なくともコーヒーを手に入れたいと思っています、インドからの多くの愛!
ジェイダダニア2018

6

改ページ:避けてください。確かにwebkitでは機能しません。実際、5年以上前から既知の問題でしたhttps://bugs.webkit.org/show_bug.cgi?id=5097

私の研究が行っている限り、これを達成する既知の方法はありません(私は自分のハックを理解するために取り組んでいます)

私があなたに与えることができるアドバイスは、FFでこの機能を実現するために、不要なコンテンツをラップすることです;オーバーフローでDIV(または任意のコンテナー)内でこれ以上壊したくない:auto(奇妙なスクロールバーを引き起こさないように注意してください)コンテナのサイズが小さすぎると表示されます)。

悲しいことに、FFは私がこれを達成した唯一のブラウザーであり、webkitは私がもっと心配しているブラウザーです。


5

page-break-afterの可能な値は次のとおりです。 auto, always, avoid, left, right

絶対配置された要素にpage-break-afterプロパティを使用することはできないと思います。


1
どうやらそれはinline-blocksでも機能しません
Ujjwal Singh

5

同じ問題がまだ解決していません。page-break-insideはブラウザでは機能しませんが、Operaでは機能します。別の方法として、page-break-afterを使用することもできます。一緒に保つためにdivのすべての子要素に...しかし、私のテストでは、回避属性は機能しません。Firefoxで...

すべての一般的なブラウザで機能するのは、たとえば、強制改ページです。改ページ後:常に


これはWebkitで動作するはずです。ただし、page-break-after:alwaysを使用して、印刷用にスタイル設定された追加のdivをいくつか追加する必要がある場合があります。通常のdivの約6ダース後。
'

3

私が遭遇した1つの落とし穴は、 'overflow'属性が 'auto'に設定された親要素でした。これにより、印刷バージョンのpage-break-inside属性を持つ子div要素が無効になります。それ以外の場合は、page-break-inside: avoidChromeで正常に動作します。


2

私の場合、選択したdivをpage-break-inside:avoidに設定し、すべての要素をdisplay:inlineに設定することで、Webkitで改ページの問題を解決することができました。このように:

@media print{
* {
    display:inline;
}
script, style { 
    display:none; 
}
div {
    page-break-inside:avoid;
}

}

page-break-propertiesは(webkitの)インライン要素にのみ適用できるようです。必要な特定の要素にdisplay:inlineのみを適用しようとしましたが、これは機能しませんでした。機能したのは、すべての要素にインラインで適用することだけです。混乱を招くのは大きなコンテナーdivの1つだと思います。

たぶん誰かがこれを拡張できます。


1
@media print{
    /* use your css selector */    
    div{ 
        page-break-inside: avoid;
    }
}

すべての新しいブラウザでこのソリューションは機能します。caniuse.com/#search=page-break-insideを参照してください


1

page-break-inside: avoid;常に動作するとは限りません。コンテナ要素の高さと位置を考慮しているようです。

たとえばinline-block、ページよりも高い要素は切り取られます。

私はpage-break-inside: avoid;コンテナ要素を特定しdisplay: inline-blockて追加することで機能する機能を復元することができました:

@media print {
    .container { display: block; } /* this is key */

    div, p, ..etc { page-break-inside: avoid; }
}

これが「改ページが機能しない」と不平を言う人たちに役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.