我正在尝试制作一个简单的wyswyg原型,该原型使用contentEditable div来模仿A4页面的概念。 所以我当前的代码是这样的:
HTML:
<div id="editor">
<div contenteditable="true" class="page" id="page-1">
<b>hello</b>
</div>
</div>
CSS:
#editor{
background-color: gray;
border: 1px black;
padding: 1em 2em;
}
.page{
background-color: white;
border: solid black;
padding: 1em 2em;
width:595px;
height:841px;
word-wrap: break-word;
overflow-wrap: break-word;
white-space: normal;
}
JS:
//force br
document.execCommand("DefaultParagraphSeparator",false,"br");
const a4 = {
height: 841,width: 595
};
document.getElementById('editor').addEventListener('input',function(e) {
let getchildrenHeight = function(element) {
total = 0;
if (element.childNodes) {
for (let child of element.childNodes) {
switch (child.nodeType) {
case Node.ELEMENT_NODE:
total += child.offsetHeight;
break;
case Node.TEXT_NODE:
let range = document.createRange();
range.selectNodeContents(child);
rect = range.getBoundingClientRect();
total += (rect.bottom - rect.top);
break;
}
}
}
return total;
};
let pages = document.getElementsByClassname('page');
for (let i in pages) {
let page = pages[i];
//remove empty page
if (page.offsetHeight == 0 && i > 1) {
page.remove();
}
let childrenHeight = getchildrenHeight(page);
while (childrenHeight > a4.height) {
//recursively try to fit elements on max size
//removing/pushing excedents elements to the next div (aka page)
let excedents = [];
let children = page.childNodes;
let children_length = children.length - 1;
let backup = children[children_length].cloneNode(true);
children[children_length].remove();
if (pages.item(i + 1) === null) {
var newPage = page.cloneNode(true);
newPage.innerHTML = '';
newPage.appendChild(backup);
page.parentNode.appendChild(newPage);
} else {
page.item(i + 1).insertBefore(backup,page.item(i + 1).childNodes[0]);
}
//console.log(children[i].innerHTML);
}
}
});
不幸的是,结果与我预期的不同。 当超过一页的高度时,首页上的所有内容都会被删除,而不是我想要的:
- 多余的部分将移至下一页。
- 并且当某个页面没有孩子时,该页面将被删除。
类似于非常原始的microsoft Word多页编辑器。
该怎么做? 提前致谢 塞尔索(Celso)