【问题标题】:Scale texts of different lengths to fit container width缩放不同长度的文本以适应容器宽度
【发布时间】:2018-02-28 17:34:38
【问题描述】:

我有一个特定大小的元素,其中包含不同长度的单行或多行文本。现在我想缩放这些文本的字体大小,使最长的文本行完全适合容器的宽度。

例如,我想要这个标记

.container {
  width: 400px;
  border: 1px solid green;
  padding: .5em;
}

.container>div {
  border: 1px dotted gray;
}
<div class="container">
  <div>Lorem ipsum dolor sit amet.</div>
  <div>Lorem ipsum.</div>
  <div>Lorem ipsum dolor sit amet, consetetur sadipscing elitr,<br />sed diam nonumy eirmod tempor invidunt<br />ut labore et dolore magna aliquyam erat, sed diam voluptua.</div>
</div>

产生这样的东西:

我尝试使用relative font sizing unit,但最后总是手动调整每个子元素的font-size,这不是一个选项。

另外this post 关于动态缩放文本以适应视口也无济于事,因为我有多种不同的文本长度。

这可以用 CSS 解决吗?或者我是否必须采用 Javascript 方法来计算字母并相应地调整字体大小?但是如果我使用字母大小不同的字体呢?

【问题讨论】:

标签: javascript html css font-size


【解决方案1】:

这个怎么样?

$(document).ready(function() {
  var divEls = $('.container div');
  for(var i=0; i<divEls.length;i++){
    var span = $(divEls[i]).find('span');
    var fontSize = 16;
    while (span.width() < $(divEls[i]).width()) {
      span.css('font-size', fontSize++)
    }
    // wrap if span exceeds div width
    if (span.width() > $(divEls[i]).width()) {
      span.css('white-space', 'pre-wrap');
    }  
  }
  
});
.container {
  width: 400px;
  border: 1px solid green;
  padding: .5em;
}

.container>div {
  border: 1px dotted gray;
  white-space: pre;
}
<div class="container">
  <div><span>Lorem ipsum dolor sit amet.</span></div>
  <div><span>Lorem ipsum.</span></div>
  <div><span>Lorem ipsum dolor sit amet, consetetur sadipscing elitr,<br />sed diam nonumy eirmod tempor invidunt<br />ut labore et dolore magna aliquyam erat, sed diam voluptua .</span></div>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

你也可以试试这样的 ES6 解决方案 CodePen Demo


更新 - 根据下面的评论,这是一个响应式解决方案(另请参阅此 CodePen Demo):

function resizeFont() {
  var divEls = $(".container div");
  for (var i = 0; i < divEls.length; i++) {
    var span = $(divEls[i]).find("span");
    var fontSize = (span.css("font-size").match(/\d+/)[0]);
    while (span.width() < $(divEls[i]).width()) {
      span.css("font-size", fontSize++);
    }
    while (span.width() > $(divEls[i]).width()) {
      span.css("font-size", fontSize--);
    }
  }
}

$(document).ready(function() {
  resizeFont();
  $(window).on("resize", resizeFont);
});
body {
  margin: 0;
}

.container {
  max-width: 100vw;
  border: 1px solid green;
  padding: .5em;
}

.container>div {
  border: 1px dotted gray;
  white-space: pre;
}
<div class="container">
  <div><span>Lorem ipsum dolor sit amet.</span></div>
  <div><span>Lorem ipsum.</span></div>
  <div><span>Lorem ipsum dolor sit amet, consetetur sadipscing elitr,<br />sed diam nonumy eirmod tempor invidunt<br />ut labore et dolore magna aliquyam erat, sed diam voluptua .</span></div>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

【讨论】:

  • 很好,感谢您的解决方案!由于我不希望文本被换行,所以我可以稍等片刻:while (span.width() &gt; $(divEls[i]).width()) { span.css('font-size', fontSize--) }
  • 有没有机会让这种方法响应? IE。 .container 宽度为 100vw?
  • 当然 - 这是一个 CodePen Demo 使用响应式方法,.container 宽度为 100vw。我也在使用你的 sn-p 来减少字体。我也会把上面的代码贴出来。
  • 没问题 - 我很高兴它有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
相关资源
最近更新 更多