Google Chrome印刷の改ページ


110

Google Chromeで改ページを実行しようとしています。

Chromeでpage-break-after: always;有効な多数のWebサイトから通知を受けましたが、非常に単純な例でも機能しないようです。クロムで印刷するときに改ページを強制する方法はありますか?


これは比較的最近(2014年2月)に(古い2005バグチケットで)webkitバグトラッカーbugs.webkit.org/show_bug.cgi?id=5097
Alex KeySmith

回答:


134

私は、Chromeを含むすべての主要なブラウザで次のアプローチをうまく使用しています。

<!DOCTYPE html>

<html>
  <head>
    <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
    <title>Paginated HTML</title>
    <style type="text/css" media="print">
      div.page
      {
        page-break-after: always;
        page-break-inside: avoid;
      }
    </style>
  </head>
  <body>
    <div class="page">
      <h1>This is Page 1</h1>
    </div>
    <div class="page">
      <h1>This is Page 2</h1>
    </div>
    <div class="page">
      <h1>This is Page 3</h1>
    </div>
  </body>
</html>

これは簡単な例です。実際のコードでは、各ページのdivにはさらに多くの要素が含まれています。


4
ああ、私は私の問題を考えています。私は<br/>タグでそれを使用しようとしました
マイクヴァルスター

@マイク問題を解決してくれてありがとう。brが機能せずdivが機能しない理由はわかりませんが、それでも簡単な変更です。
ジェフデイビス

これは、親ページで使用しようとすると機能しますが、iframeから印刷するときは(もちろん、クロムで)機能しません。
VJ

以下の@peterの回答も読んでください。彼はまた、良い点もありましたposition: relative
doub1ejack 2014年

6
仕様によるbreak-afterbreak-beforeのみに適用されますblock-level elements, table row groups, table rows (but see prose)drafts.c​​sswg.org/css-break-3/#break-between -それは何の山車や任意の空想の位置決めトリックを意味しません。
ミッコランタライネン2016年

34

実際、(Phil Rossから)承認されたものとして選択された回答には、1つの詳細がありません。

それはDOES Chromeで仕事をし、解決策は本当に愚かな

親と改ページを制御する要素の両方を次のように宣言する必要があります。

position: relative

このフィドルをチェックしてください:http : //jsfiddle.net/petersphilo/QCvA5/5/show/

これは次の場合に当てはまります。

page-break-before
page-break-after
page-break-inside

ただし、Safariで改ページの制御が機能しません(少なくとも5.1.7では)。

これが役に立てば幸いです!!!

PS:以下の質問は、Chromeの最近のバージョンでは、次の位置であってもこれを尊重しないという事実を明らかにしました。騙す。しかし、彼らは尊敬しているようです:

-webkit-region-break-inside: avoid;

このフィドルを参照してください:http : //jsfiddle.net/petersphilo/QCvA5/23/show

だから今すぐ追加する必要があると思う...

お役に立てれば!


Chromeで機能するかどうかは、使用するWebKitのバージョンによって異なります。Safari 5.1.7では機能しないとおっしゃっていたので、馬鹿げているとは思いません。テストしたWKのバージョンは、テストしたものと異なる場合があります。
Joel Peltonen 2012

そのページはChrome 26.0.1410.65では機能しません。3ページあり、最後のページには1語しかありません)。また、ルールを適用する要素とその親の両方が自分のページにposition:relativeであることを確認しましたが、それでも印刷時に改ページが追加されません。それで、これはChromeで出入りする機能ですか?
Joe Dyndale、2013年

その通りです...最近のバージョンのChromeでは動作しないようです。ただし、次のものに置き換えることができます。-webkit-region-break-inside:回避。(これを参照してください:jsfiddle.net/QCvA5/22/show
Peter

@ピーターここで更新はありますか?が使用している状況を修正しようとするバウンティでSOの質問を投稿しましたpage-break-inside。何か助けは?
Zach Saucier

1
これは私にとって奇妙なことに1つ動作しました。スタイルをインラインに配置し、別のcssファイルに配置しない場合にのみ機能します。私はそれをh7要素で使用しています。Chromeのバージョンは38.0.2125.111 mです。<h7 class="page-breaker" style="display: block;position: relative;page-break-before:always">Grade <?php echo $grade;?></h7>
Gavin Simpson、

16

ここで、Chromeはフローティングされたdivの改ページ* css設定も無視することに注意したいと思います。

私はCSS仕様のどこかにこれについて正当な根拠があると思うが、いつか誰かを助けるかもしれないと気づいた;-)

もう1つの注意:IE7は、前のブロック要素の明示的な高さがなければ、改ページ設定を確認できません。

http://social.msdn.microsoft.com/forums/en-US/iewebdevelopment/thread/fe523ec6-2f01-41df-a31d-9ba93f21787b/


2
要素をフロートさせると、要素の絶対配置と同じ方法で要素がドキュメントフローから取り出されるためです。position:absoluteを持つ要素は、改ページ*では機能しません。
Joe Dyndale、2013年

1
また、改ページスタイルの要素のすべての親の間に、フローティング要素や絶対配置要素があってはなりません。ブートストラップ "col-xs-12"の親を持っていましたが、明示的に "float:none"を設定すると、改ページが機能し始めました!
Stalinko 2017年

12

これと同様の問題がありましたが、最終的に解決策を見つけました。私はオーバーフローxを隠していました。<html>タグに適用されるので、以下のDOMで何をしても、改ページは許可されません。オーバーフロー-xに戻すと、表示されます。それはうまくいきました。

うまくいけば、これが誰かを助けるでしょう。


特定のオーバーフロープロパティを持つ親要素があると、この問題が発生する可能性があることに注意してください。ルールを追加しました* { overflow-x: visible }
ギャレット、

10

私はこの問題を抱えています-私のページ区切りはChromeを除くすべてのブラウザーで機能します-そして、それを表のセルの中にあるpage-break-after要素に分離することができました。(CMSの古い、継承されたテンプレート。)

どうやらChromeはテーブルセル内のpage-break-beforeまたはpage-break-afterプロパティを尊重しないので、Philの例のこの変更されたバージョンは2番目と3番目の見出しを同じページに配置します。

<!DOCTYPE html>

<html>
  <head>
    <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
    <title>Paginated HTML</title>
    <style type="text/css" media="print">
      div.page
      {
        page-break-after: always;
        page-break-inside: avoid;
      }
    </style>
  </head>
  <body>
    <div class="page">
      <h1>This is Page 1</h1>
    </div>

    <table>
    <tr>
        <td>
            <div class="page">
              <h1>This is Page 2</h1>
            </div>
            <div class="page">
              <h1>This is, sadly, still Page 2</h1>
            </div>
        </td>
    </tr>
    </table>
  </body>
</html>

CSS仕様を前提として、Chromeの実装は(間違いなく)許可されています。詳しくは、http//www.google.com/support/forum/p/Chrome/thread? tid = 32f9d9629d6f6789&hl = jaをご覧ください。


これは私の問題でした-SharePoint 2007によるレイアウトにテーブルセルの使用を余儀なくされたため、Chromeは印刷スタイルシートのレイアウト宣言に従いました:(
Dexter

8

CSSに注意:display:inline-block印刷するとき。

テーブルがスタイルのdiv内にある場合、ChromeとFirefoxでは次のページに移動するCCSプロパティが機能しません display:inline-block

たとえば、次は機能しません。

<div style='display:inline-block'>
  <table style='page-break-before:always'>
    ...
  </table>
  <table style='page-break-before:always'>
    ...
  </table>
</div>

しかし、次の作業:

<div>
  <table style='page-break-before:always'>
    ...
  </table>
  <table style='page-break-before:always'>
    ...
  </table>
</div>

1
そして「フロート」も。親要素には「float」プロパティがあってはなりません。
ジンバタマン2015

2
同じdisplay: flex
マイケルシュミット

4

以前Chromeでこの問題に直面しましたが、その原因はdivの高さが値に設定されていることが原因でした。解決策は、次のように印刷中に最小高さをリセットすることでした:

@media print {
    .wizard-content{
        min-height: 0;
    }
}

3

2016年の更新:

まあ、私が持っていたときに私はこの問題を抱えていました

overflow:hidden

私のdivで。

作った後

@media print {
   div {
      overflow:initial !important
   }
}

すべてがうまく元気になりました


1
これにより、他に何もしない場合に問題が解決しました。ありがとう!
bstory

1

Bootstrap CssでChromeを使用している場合、グリッドのレイアウトを制御するクラス(例:col-xs-12など)は「float:left」を使用します。これは、他の人が指摘したように、改ページを壊します。これらをページから削除して印刷します。それは私のために働いた。(Chromeバージョン= 49.0.2623.87)


0

その問題があります。長い時間が経過します...ページのサイドフィールドがないと通常の改ページになりますが、フィールドが表示されると、ページと「改ページスペース」が拡大します。したがって、ドキュメント内の通常のフィールドでは、正しく表示されませんでした。セットで直します

    width:100%

そして使う

div.page
  {
    page-break-before: always;
    page-break-inside: avoid;
  }

最初の行で使用します。


0

私が知る限り、Google Chromeでテーブルの正しい改ページを取得する唯一の方法は、要素<tr>にプロパティdisplay:inline-table(またはdisplay:inline-block を与えることですが、テーブルではない他の場合により適しています)。プロパティ「page-break-after:always; page-break-inside:prevent;」も使用する必要があります。@Phil Rossによって書かれた

<table>
  <tr style="display:inline-table;page-break-after: always; page-break-inside: avoid;">
    <td></td>
    <td></td>
    ...
  </tr>
</table>

1
これをtds内のマージン/パディングを壊さないようにするヒントはありますか?
joeforker 2016

@joeforkerは、<tr>を "padding:0; margin:0;"とともに使用する必要があります。内に含まれる要素にマージンのプロパティを与えます。
Codekraft

-2

私が次のようなパディングを使用したとき、それは私のために働いていました:

<div style="padding-top :200px;page-break-inside:avoid;">
   <div>My content</div>
</div>

これはパディングのためにのみ機能し、改ページのためではありませんでした
Char
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.