Альтернатива для разрыва страницы: избегайте

У меня есть страница, которая генерирует купоны. Каждый купон - это div с высотой, изменяющейся в зависимости от содержимого. Я хочу печатать как можно больше купонов на каждой странице, но я не хочу, чтобы купоны были разделены на несколько страниц. Свойство CSS page-break-inside делает именно то, что мне нужно. Однако мне нужно это для работы в Firefox и/или Chrome. И это не поддерживается. Два года и год назад был задан тот же вопрос, и для этого не было хорошей альтернативы. Мы много разрабатываем CSS3/HTML5/общий браузер... есть ли альтернатива, чтобы заставить это работать?

Пример: http://jsfiddle.net/e3U66/2/

Предположим, что страница, при печати, измеряет 1000 пикселей. Я хочу, чтобы второй DIV появился на второй странице, потому что в противном случае он разделяется на первую и вторую. Этот код работает в Opera, но не в FF или Chrome.

Ответы

Ответ 1

Почему бы не после загрузки страницы содержимого использовать js для прокрутки содержимого и добавления высоты div s.

Как только вы достигнете 1000px или того, что вы определили как высоту страницы, вставьте пустой div стиль page-break-before перед последним div.

Ответ 2

Честно говоря, я бы просто посоветовал создавать изображения фактически купонов или генерировать pdf. Я предполагаю, что вы, вероятно, генерируете штрих-коды для всех купонов уже, поэтому генерация фактически изображений не должна быть сложной с использованием php (или, что бы там ни было, выбор кода).

Вот некоторая информация о создании образа php, но SO, вероятно, будет лучшим источником для примеров.

http://php.net/manual/en/function.imagecreate.php

Затем вы можете просто перечислить изображения.

<img src>
<img src>
<img src>
...

Нет смысла воссоздать колесо.

Ответ 3

Ниже решения, сделанного с помощью библиотеки Prototype (1.7)

<!DOCTYPE HTML>
<html>
<head>
<title>Title of the document</title>
<script type="text/javascript" src="js/prototype.js"></script>
<script type="text/javascript">
//page height in px
//thisPageTotal is the total of pixels on the current page, in px
pageHeight = 1000;
thisPageTotal = 0;

Event.observe(window, 'load', function(){
    $$('.coupon').each(function(el){
        var layout = el.getLayout();
        thisPageTotal += parseInt(layout.get('margin-box-height'));
        if(thisPageTotal > pageHeight) {
            thisPageTotal = parseInt(layout.get('margin-box-height'));
            var pageBreak = new Element('div', {
                'class': 'pagebreak'
            });
            el.insert({before: pageBreak});
        }
        //this shows the current amount of px on the current page
        el.update(thisPageTotal);
    });
});
</script>

<style type="text/css">
div {
    border: 1px solid #000;
    margin: 30px;
}

.pagebreak {
    page-break-after: always;   
}
</style>
</head>

<body>
    <div id="div_1" class="coupon" style="height: 500px"></div>
    <div id="div_2" class="coupon" style="height: 200px"></div>
    <div id="div_3" class="coupon" style="height: 500px"></div>
    <div id="div_4" class="coupon" style="height: 200px"></div>
    <div id="div_5" class="coupon" style="height: 200px"></div>
    <div id="div_6" class="coupon" style="height: 400px"></div>
    <div id="div_7" class="coupon" style="height: 300px"></div>
    <div id="div_8" class="coupon" style="height: 400px"></div>
    <div id="div_9" class="coupon" style="height: 500px"></div>
    <div id="div_10" class="coupon" style="height: 200px"></div>
</body>
</html> 

Возможно, это помогает

Ответ 4

установите float left для этих div и установите ширину как 100%. я не попробовал бы это., он может работать.