javascript - 将 HTML 分页,拆分长段落

标签 javascript jquery html dom

嗯,我什至不确定我目前的方法是否可以做到这一点。我试图将 HTML 文档的内容放入当前视口(viewport)大小的页面中。我目前正在通过遍历文档的所有元素并检查它们的顶部偏移量是否在当前页面的边界内来执行此操作,如果不在,则此偏移量成为新页面的开始并将页面边界设置为此偏移量加上视口(viewport)的高度。

我面临的问题是,通常会有一个元素(例如一个段落)的高度大于视口(viewport)本身,所以即使算法将这个元素放在新页面的开头,它的内容会溢出。我试图找到一种方法来拆分这些元素,使第一个切片将占据页面的剩余部分。

这带来了进一步的困难。即使我能找到一种方法来确定有多少段落的文本仍然适合页面的剩余部分,并且这本身已被证明是相当困难的,我仍然会遇到 DOM 在拆分后没有立即更新的问题段落,这会打乱下一页的计算,或者至少迫使我打破递归,这会使算法更加复杂。

欢迎就如何以第一个切片占据页面剩余空间的方式拆分段落提出任何建议。到目前为止,这是我的代码:

编辑: 值得注意的是,这只适用于没有绝对定位或 float 元素的非常简单的 HTML。这对我来说不是问题。

var elementIndex = -1;
var pages = 1;
var pageBoundary = 0;
var pageBreaks = [];

function calculatePages() {
    //first page boundary is window height
    pageBoundary = $(window).height();
    //do calculations
    iterateElements($("body"));
    //print results
    console.log(pageBreaks);
}

function iterateElements(parent) {

    $.each($(parent).children(), function(i, e) {
        //increase current element index
        elementIndex = elementIndex + 1;
        //get element's top offset
        var offsetTop = $(e).offset().top;
        //get the last position that the element occupies
        var elementSpan = offsetTop + $(e).outerHeight();

        if ($(e).children().length == 0) { //only leaf nodes will be set as page breaks
            //element's start position is outside page boundary
            if (offsetTop >= pageBoundary) {
                //mark page start with red in order to visualize
                $(e).attr("style", "border-top: 1px solid red");

                //increase page count
                pages = pages + 1;
                //new page starts at element's top, next page boundary
                //is element's starting position plus the viewport's height
                pageBoundary = offsetTop + $(window).height();
                //store index of page break
                pageBreaks.push(elementIndex);
            }
            //element's start position is inside current page, but contents overflow
            else if (elementSpan >= pageBoundary) {
                //NO IDEA WHAT TO DO HERE
                //NEED A WAY TO SPLIT LARGE ELEMENTS
            }
        } 

        iterateElements(e);
    });
}

$(function() {
    calculatePages();
});

最佳答案

我做过类似的事情。我采取的方法是检查页面容器的高度。如果它大于最大值,我知道元素需要移动到下一页。

如果有多个元素,我可以将最后一个元素移动到下一页。

如果只有1个元素,需要拆分。我们称此元素为 X。因此您可以在下一页中创建一个新的段落/部分,我们称该元素为 Y。您现在可以将单词或字符从元素 X 的末尾移动到元素 Y 的开头,直到元素的高度X 适合页面。

在此之后您可以重复下一页。

关于javascript - 将 HTML 分页,拆分长段落,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15732742/

相关文章:

javascript - 根据显示 flexbox 中的子项设置父项高度/宽度

javascript - VueJS - 动态重复组件

javascript - 动态添加的行上的链式选择

jquery - 使用 AJAX 在 Laravel 中进行实时搜索

javascript - select2 onchange 加载前 5 个选定的标签到 div 1,其余的应该移动到 div 2

javascript - 打开浏览器菜单时隐藏 div

Javascript:onchange使用相同的div并从2个不同的id打印

javascript - 使用 $.getJSON 方法获取 'undefined' 值

javascript - 从表列中选择 Select Menu Jquery 的文本值

javascript - 在 Node.js 中更新页面上的值而不刷新