CSS-разрыв страницы не работает во всех браузерах

У меня возникли проблемы с тем, что эта работа работает в большинстве браузеров, за исключением IE (она работает корректно в IE6) и Opera.

Firefox отделяет divs правильно, но только печатает первую страницу.

Chrome и Safari применяет только разрыв страницы до последнего div.

Как я могу заставить это работать во всех браузерах правильно?

HTML:

<div id="leftNav">
  <ul>
    <!--links etc-->
  </ul>
</div>
<div id="mainBody">
 <div id="container">
  <div class="pageBreak">
   <!--content-->
  </div>
  <div class="pageBreak">
   <!--content-->
  </div>
  <div class="pageBreak">
   <!--content-->
  </div>
 </div>
</div>

Дивы с идентификаторами #leftNav и #mainBody установлены на float:left, поэтому они хорошо отображаются.

Я хочу только напечатать классы .pageBreak, скрывая #leftNav и остальную часть #mainBody с помощью CSS.

CSS:

@media print
{
 #leftNav
 {
  display:none;
 }
 #mainBody
 {
  border:none;
  margin:none;
  padding:none;
 }
}

Ответ 1

Родительские элементы не могут плавать на них.

Настройка float:none для всех родительских элементов делает работу page-break-before:always корректной.

Другими вещами, которые могут сломать разрыв страницы, являются: использование разбиения на страницы внутри таблиц, плавающих элементов, элементов встроенного блока и блоков с границами.

Ответ 2

Ради завершения, и для других, у кого есть такая же проблема, я просто хочу добавить, что мне также пришлось добавить overflow: visible в тег body, чтобы FireFox выполнял разрывы страниц и даже для печати не только первой страницы.

Ответ 3

Я обнаружил, что классы Twitter Bootstrap добавляют кучу материала на страницу, что затрудняет работу страниц. Firefox работал сразу, но мне приходилось следовать различным предложениям, чтобы заставить его работать в Chrome и, наконец, IE (11).

Я следил за предложениями здесь и в другом месте. Единственное свойство, которое я "обнаружил", которого я еще не видел, это "размер окна". Bootstrap может установить это свойство в "box-sizing: border-box", который сломал IE. IE-friendly параметр - "box-sizing: content-box". Меня привели к этому оговоркой о "блочных элементах с границами", сделанном Ричардом Парнаби-королем fooobar.com/questions/146065/....

Похоже, что это гонка вооружений, чтобы обнаружить следующее свойство, которое может сломать разрывы страниц.

Это настройка, которая работала для меня (Chrome, FF, IE 11). В принципе, он пытается переопределить все проблемные настройки во всех div на печатной странице. Конечно, это может также нарушить ваше форматирование, и это будет означать, что вам придется найти другой способ настройки страницы.

@media print {

    div { float: none !important; position: static !important; display: inline; 
          box-sizing: content-box !important;
    }

}

Ответ 4

"версии Firefox вплоть до 3.5, не поддерживающие значения" избегать "," левое "или" правое". Поддержка IE также является частичной вы можете достичь того, что нужно: page-break-before: always; который поддерживается во всех браузерах "но напечатайте только первую страницу": я не думаю, что это связано с CSS, я полагаю, что он находится в окне печати браузера:)

Ответ 5

Хотя это не задокументировано, следует отметить, что свойства разбиения на страницы не могут применяться к элементам таблицы. Если у вас есть какие-либо элементы с display: table; или display:table-cell;, примененные к ним (общие для многих шаблонов в классе clearfix), то содержащиеся элементы будут игнорировать правила разрыва страницы. Просто отмените правило в таблице стилей печати, и вы должны быть в порядке (после того, как поплавки также были удалены, конечно!).

Вот пример того, как это сделать для популярной проблемы с очисткой.

.clearfix:before, .clearfix:after{  
    display: block!important;
}

EDIT: Я забыл добавить, что другое место, в котором я столкнулся, - это когда шаблон объявил всю страницу (обычно называемую основной или основной оболочкой) с помощью display:inline-block;

Если раздел находится внутри встроенного блока, он не будет работать, чтобы ваши глаза не открывались для них. Изменение или перезапись display:inline-block; с помощью display:block должна работать.

Надеюсь, это поможет!

~ techdude

Ответ 6

У меня была position: absolute; в печати div, из-за которой это не сработало.

Ответ 7

что ваш код?
как это?:


<style>
@media print
{
table {page-break-after:always}
}
@media print
{
table {page-break-before:always}
}
</style>

Ответ 8

Существует решение, если родитель имеет float. Для элемента, к которому вы применили разрыв страницы, сделайте элемент overflow: hidden. Это все. Это сработало для меня.

<div style='float:left'>

<p style='overflow:hidden;page-break-before:always;'></p>

</div>