我今天在寻找答案时有类似的工作,但似乎没有任何直截了当的事情。
虽然我正在使用Array.reduce()
您应该能够使用Array.forEach()
您喜欢的任何其他迭代代码来执行此操作。
words.reduce(function(acc, value)
这是通过计算如果我们在实际渲染之前添加另一个单词,元素是否会溢出来完成的。这里的 hacky 是在其中添加另一个block
元素visibility: hidden
。
element.innerHTML = '<div style="visibility: hidden; height: 100%; width=100%">' + textToBeAdded + '</div>';
这样,block
元素仍然采用其父元素尺寸,并且可以检查父元素是否溢出。
检查溢出的方法是将元素的滚动高度与其高度进行比较:
if (element.scrollHeight > element.offsetHeight)
如果它溢出,我们保持原样并创建一个新元素并将当前value
(单词)放入迭代中。然后我们将它附加到与前一个元素相同的 DOM 树上(作为其父元素的子元素......就像有一个新兄弟)
var newPageEl = document.createElement('div');
newPageEl.classList = 'page';
newPageEl.textContent = word;
parentElement.appendChild(newPageEl);
希望这是有道理的。
var page = document.getElementsByClassName('page')[0];
if (page.scrollHeight > page.offsetHeight) {
// is overflowing
fixOverflow(page);
}
function fixOverflow(element) {
var words = element.textContent.split(' ');
// delete previous text content
element.textContent = '';
words.reduce(function(acc, value) {
// store current element's text
var currentElementText = element.textContent.toString().trim();
var textToBeAdded = currentElementText + ' ' + value;
element.innerHTML = '<div style="visibility: hidden; height: 100%; width=100%">' + textToBeAdded + '</div>';
if (element.scrollHeight > element.offsetHeight) {
// is overflowing with the new word
element.innerHTML = "";
// leave the last page element as is
element.textContent = currentElementText;
// create another element with the new value to be added
// ** IMPORTANT replace the memory of the previous element variable
element = createPageElement(value);
// add it to the same DOM tree as the previous page element
page.parentElement.appendChild(element); // could also be document.getElementById('page-container').appendChild(element);
} else {
// if not overflowing add another word
element.innerHTML = currentElementText + ' ' + value;
}
}, "");
}
function createPageElement(text) {
// create element with class page
var newPageEl = document.createElement('div');
newPageEl.classList = 'page';
newPageEl.textContent = text;
return newPageEl;
}