javascript - 计算文本字体大小以用文本填充容器

标签 javascript jquery

<分区>

Possible Duplicate:
Auto-size dynamic text to fill fixed size container

如果容器只包含一个没有子元素的纯文本,那么下面的代码是一个可行的解决方案:

(function($) { 
  $.fn.textfill = function(options) { 
    return this.each(function() {
      var text = $(this).text();
      $(this).text('');
      var container = $('<span />').text(text).appendTo($(this));
      var min = 1, max = 200, fontSize;
      do {
        fontSize = (max + min) / 2;
        container.css('fontSize', fontSize);
        var multiplier = $(this).height()/container.height();
        if (multiplier == 1) { min = max = fontSize}
        if (multiplier >  1) { min = fontSize}
        if (multiplier <  1) { max = fontSize}
      } while ((max - min) > 1);
      fontSize = min;
      if ($(this).width() < container.width()) {
        min = 1;
        do {
          fontSize = (max + min) / 2;
          container.css('fontSize', fontSize);
          var multiplier = $(this).width()/container.width();
          if (multiplier == 1) { min = max = fontSize}
          if (multiplier >  1) { min = fontSize}
          if (multiplier <  1) { max = fontSize}
        } while ((max - min) > 1);
        fontSize = min;
      }
      container.remove();
      $(this).text(text);
      var minFontSize = options.minFontPixels;
      var maxFontSize = options.maxFontPixels;
      $(this).css('fontSize', 
                  minFontSize && (minFontSize > fontSize) ?
                  minFontSize :
                  maxFontSize && (maxFontSize < fontSize) ?
                  maxFontSize :
                  fontSize); 
    }); 
  }; 
})(jQuery);

查看演示 here .

但是如果容器包含子元素呢?假设:

<div><span class="c1">text1</span>main text<span class="c2">text2</span></div>

我们还想自动调整 child 的大小,使文本与作为文本节点的“主文本”保持相同的高度? child 可能有不同的font-family 或其他参数。

如何改进上述算法才能得到这样的结果?

最佳答案

我试了一下,在我看来我找到了解决方案。算法修改如下:

  • 首先你需要找到目标元素及其所有子元素(不仅是第一层)的旧字体大小
  • 然后你需要计算一个系数,即字体大小应该改变多少,系数的计算应该与新字体大小的计算并行进行
  • 并将该系数应用于目标及其所有子项的最终字体大小

这是工作 DEMO

更新

here是你需要的解决方案,前一个比你需要的多一点,我只是想保留它,也许其他人会觉得它有用。我还想注意到,除了系数部分外,第二个解决方案与第一个解决方案非常相似,在这种情况下这是不必要的。

关于javascript - 计算文本字体大小以用文本填充容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12820993/

相关文章:

javascript - 如何调用每个字段集的汇总值

javascript - 使用 jQuery 显示和隐藏 div 以及添加/清除 div 内容

javascript - Karma jasmine 和 Angular Controller 使用 'Controller as' 语法(这而不是 $scope)

javascript - 使用JS将毫秒转换为SRT时间

javascript - 使 slider 值出现在NoUISlider中

javascript - 直到使用 Lazy Load 插件滚动时图像才会显示

jquery - jsTree默认箭头/三 Angular 形图标配置

(document).ready() 中的 javascript 函数不执行

javascript - 根据从另一个 HTML 文件发送的变量替换 DIV 内容

javascript - Fancybox回调-点击函数