html5或css的“智能文本流”,以均匀地分布一个句子或段落在同样宽的行?

2g32fytz  于 10个月前  发布在  HTML5
关注(0)|答案(2)|浏览(93)

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


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



注意最后一个单词是如何在单独的一行上的。所以前两条线都满了。从某种意义上说,它们占据了这个元素中的全部可用空间。第三行只包含一个单词,并且大部分是空的。
我觉得这相当令人不安,我想知道是否有一个技巧,以更均匀地分配所有行之间的自由空间。我是说像这样:(注意这是完全相同的句子)



它应该根据字体和浏览器视图大小以及元素的宽度(可能取决于屏幕分辨率)自动重新流动。
有没有一些聪明的HTML5或CSS3的方法来实现这一点?
在搜索和查找类似于这个问题的主题时,我确实找到了text-align: justify属性,我很熟悉它,但它并不是我真正要找的。
text-align: justify倾向于通过增加单词之间的空格来将所有行扩展到包含元素的完整行。
相反,我真正在寻找的是重新分配的话,使所有的线是狭窄的,即。不占用所有水平元件空间。以一种导致所有线都相等宽(或尽可能接近)的方式。
我的意思不是这样的:(这就是text-align:justify所做的)



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

ttisahbt

ttisahbt1#

我知道你要求一个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>
yptwkmov

yptwkmov2#

您正在寻找CSS Text Module 4属性text-wrap: balance。它已经被提出,但不幸的是还没有实现,所以在此期间,使用这个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>

相关问题