html5 或 css 'smart text flow' 将句子或段落均匀分布在同样宽的行上?

html5 or css 'smart text flow' to evenly distribute a sentence or paragraph over equally wide lines?

假设我有一个动态 HTML 元素(spandiv 或其他),其中包含一个句子或一段文字,如下所示:

现在如果我把句子稍微长一点,它可能需要额外的一行,像这样:

注意最后一个词是如何在单独的一行上的。所以前两行已满。从某种意义上说,它们占据了这个元素中的全部可用空间。第三行只包含一个词,而且大部分都是空的。

我觉得这很令人不安,我想知道是否有技巧可以在所有行中更均匀地分配免费 space。我的意思是这样的:(注意这是完全相同的句子)

它应该根据字体和浏览器视图大小以及元素的宽度自动重新排列,这可能取决于屏幕分辨率。

是否有一些巧妙的 HTML5 或 CSS3 方法可以实现此目的?

在搜索和查看与此问题类似的主题时,我确实找到了我熟悉但并不是我真正要找的 text-align: justify 属性。
text-align: justify 倾向于通过增加单词之间的白色 space 来将所有行扩展到包含元素的完整位置。

相反,我真正在寻找的是重新分配单词的东西,这样所有的线都变窄了,即不占用所有水平元素 space。以某种方式导致所有线条都同样宽(或尽可能接近)。

所以我的意思不是这样:(text-align:justify 就是这样做的)

将此与上面的示例进行比较。

我知道您要求 CSS 解决方案,但我认为目前还没有。以下是我目前的 JS 解决方案。

        function createBetterLineBreaks(el) {
            var originalWidth = el.offsetWidth;
            var originalHeight = el.offsetHeight;
            for (let i = originalWidth - 1; i >= 0; i--) {
                el.style.width = `${i}px`;
                if (el.offsetHeight > originalHeight) {
                    el.style.width = `${i + 1}px`;
                    break;
                }
            }
        }
        // hover effects
        document.querySelector('.box').addEventListener('mouseenter', function () {
            createBetterLineBreaks(document.querySelector('.box .text'));
        });
        document.querySelector('.box').addEventListener('mouseleave', function () {
            document.querySelector('.box .text').style.width = 'unset';
        });
        .box {
            width: 300px;
            font-size: 30px;
            border: 1px solid black;
            border-radius: 5px;
            padding: 20px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
    <div class="box"><span class="text">hover this box to distribute the text more evenly</span></div>

您正在寻找 CSS Text Module 4 property text-wrap: balance. It has been proposed but unfortunately not yet implemented, so in the meantime, use this jQuery polyfill balance-text

balanceText();
.box {
  width: 300px;
  font-size: 30px;
  border: 1px solid black;
  border-radius: 5px;
  padding: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
}

.balance-text {
  text-wrap: balance;
}
<script src="//cdn.jsdelivr.net/npm/balance-text@3.3.0/balancetext.min.js"></script>
<div class="box"><span class="text balance-text">The words in this sentence cause it to require three lines.</span></div>