8

我带着一个棘手的问题来找你:

假设您有以下基本结构:

<div><p>hello</p></div>

现在假设 div 有display:block; and width:200px;. 使用 javascript,你将如何检查什么字体大小给你一个尽可能大的“你好”,而不会水平溢出(在一个单词的情况下)或在一个句子或一组单词的情况下跳转到第二行?

我想不出一种方法来测量文本占用的空间,以便随后可以对照父容器的空间来检查它,更不用说检查元素是否溢出或跳线了。

如果有办法,我相信这是正确的地方。

4

5 回答 5

4

看看FitText

它在 github 上也是开源的。

如果您对排版感兴趣,您可能想查看他们的另一个名为Lettering.js的项目

于 2013-03-15T01:14:03.427 回答
2

可能有一种方法不那么疯狂,但这应该尽可能精确。本质上,您有一个 div 用于测量其宽度并逐渐增加文本内容,直到它超过目标 div 的宽度。然后,将目标 div 的<p>字体大小更改为测量 div 的负 1:

http://jsfiddle.net/ExplosionPIlls/VUfAw/

var $measurer = $("<div>").css({
    position: 'fixed',
    top: '100%'
}).attr('id', 'measurer');
$measurer.append($("<p>").text($("p").text()));
$measurer.appendTo("body");

while ($measurer.width() <= $("#content").width()) {
    $("#measurer p").css('font-size', '+=1px');
    console.log($("#measurer").width());
}
$("#measurer p").css('font-size', '-=1px');
$("#content p").css('font-size', $("#measurer p").css('font-size'));
$measurer.remove();
于 2013-03-15T01:16:48.233 回答
1

又快又脏

小提琴

Setp的样式display: inline然后运行它

var dWidth = $("div").width();
var pWidth = $("p").width();
var starting = 1;
while (pWidth < dWidth) {
    $("p").css("font-size",starting+"em");
    pWidth = $("p").width();
    starting = starting + .1;
}
于 2013-03-15T01:22:39.287 回答
0

试试这个:

自动调整大小的动态文本以填充固定大小的容器

(function($) {
    $.fn.textfill = function(options) {
        var fontSize = options.maxFontPixels;
        var ourText = $('span:visible:first', this);
        var maxHeight = $(this).height();
        var maxWidth = $(this).width();
        var textHeight;
        var textWidth;
        do {
            ourText.css('font-size', fontSize);
            textHeight = ourText.height();
            textWidth = ourText.width();
            fontSize = fontSize - 1;
        } while ((textHeight > maxHeight || textWidth > maxWidth) && fontSize > 3);
        return this;
    }
})(jQuery);

$(document).ready(function() {
    $('.jtextfill').textfill({ maxFontPixels: 36 });
});

<div class='jtextfill' style='width:100px;height:50px;'>
    <span>My Text Here</span>
</div>
于 2013-03-15T01:15:22.290 回答
0

新的 jsFiddle 演示更新3/22/13)

我会一直增加字体大小,直到 clientWidth 或 clientHeight 改变。但是,当使用实际元素本身时,这变得不可靠。为了处理这种情况,可以动态创建跨度,然后监控跨度的尺寸,以便正确保留实际元素的原始尺寸。

js

var adjuster = document.getElementById("adjust");
adjuster.onclick = function(){
 var p = document.getElementById("p");
 var text = p.innerText;
 var s = document.createElement("span");
 s.innerText = text;
 p.innerHTML = "";
 p.appendChild(s);
 var h = p.clientHeight;
 var w = p.clientWidth;
 var size = 10;
 while(true){
  size++;
  s.style.fontSize = size + "px";
  if($(s).height() > h || $(s).width() > w){
   size-=2;//rollback to no height change
   s.style.fontSize = size + "px";
   break;
  }
 }
 p.style.fontSize = s.style.fontSize;
 p.removeChild(s);
 p.innerText = text;
};
于 2013-03-15T01:18:17.900 回答