JavaScript缩放文本以适应固定Div

Ste*_*ins 53 html javascript jquery text

在JavaScript/jQuery中,如何在固定宽度Div内缩放不等长度的文本行,以便一行总是适合Div(作为一行)?

谢谢.

swo*_*roc 70

这有点像黑客,但会做你想要的.

<div id="hidden-resizer" style="visibility: hidden"></div>
Run Code Online (Sandbox Code Playgroud)

将其放在页面底部,不会移动页面上的其他元素.

然后这样做:

var size;
var desired_width = 50;
var resizer = $("#hidden-resizer");

resizer.html("This is the text I want to resize.");

while(resizer.width() > desired_width) {
  size = parseInt(resizer.css("font-size"), 10);
  resizer.css("font-size", size - 1);
}

$("#target-location").css("font-size", size).html(resizer.html());
Run Code Online (Sandbox Code Playgroud)

  • 很棒的答案,+ 1.一个改进是使用jQuery添加`#incidden-resizer` div,以避免弄乱HTML的语义.`$('<div />',{id:'hidden-resizer'}).hide().appendTo(document.body);` (16认同)
  • 这种方法非常慢,每次元素字体大小更改时,元素都会被重绘,如果您定期使用它,这可能会冻结用户浏览器.我建议检查我的答案和我的jQuery插件,以更好的方式解决这个问题:https://github.com/DanielHoffmann/jquery-bigtext (6认同)
  • +1这很棒.此外,当人们证明事情不是不可能时,我喜欢它;-) (5认同)
  • -1 表示错误的 HTML 元素。您应该使用 &lt;span&gt; 而不是 &lt;div&gt;。&lt;span&gt; 的宽度将始终等于 &lt;span&gt; 内单词的实际宽度。如果未定义,&lt;div&gt; 的宽度将始终等于 &lt;body&gt; 的宽度,而不管 &lt;div&gt; 内单词的实际宽度。使用 &lt;span id="hidden-resizer" style="display: none;"&gt;&lt;/span&gt;。 (2认同)

Šim*_*das 30

HTML:

<div class="box" style="width:700px">This is a sentence</div>
<div class="box" style="width:600px">This is a sentence</div>
<div class="box" style="width:500px">This is a sentence</div>
<div class="box" style="width:400px">This is a sentence</div>
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

$( '.box' ).each(function ( i, box ) {

    var width = $( box ).width(),
        html = '<span style="white-space:nowrap"></span>',
        line = $( box ).wrapInner( html ).children()[ 0 ],
        n = 100;

    $( box ).css( 'font-size', n );

    while ( $( line ).width() > width ) {
        $( box ).css( 'font-size', --n );
    }

    $( box ).text( $( line ).text() );

});
Run Code Online (Sandbox Code Playgroud)

现场演示: http ://jsfiddle.net/e8B9j/2/show/

从URL中删除"/ show /"以查看代码.

  • 而不是使用while循环,直接计算比例:$(box).css('font-size',width/$(line).width()*100-1); http://jsfiddle.net/e8B9j/411/ (3认同)

Mic*_*ono 13

我写了一个jQuery插件来做到这一点:

http://michikono.github.com/boxfit

该插件将文本水平和垂直缩放到框内的最大可用大小,然后居中.

您唯一需要做的就是在其中定义一个带有文本的div:

<div id="scale">some text</div>
Run Code Online (Sandbox Code Playgroud)

然后打电话:

$('#scale').boxfit()
Run Code Online (Sandbox Code Playgroud)

该方法将接受一些参数来禁用/启用文本换行和居中对齐.


Ben*_*min 8

对于新的浏览器,您可以使用Inline-SVG.这可以通过CSS缩放像图像..!(width: 100%;)

  • 您介意提供一个例子吗?谢谢 (2认同)

cas*_*nca 5

我不知道确切的方法,但这是一个近似值:

var factor = 1/3;  // approximate width-to-height ratio
var div = $('#mydiv');
div.css('font-size', div.width() / (div.text().length * factor) + 'px');
Run Code Online (Sandbox Code Playgroud)

您将需要factor根据您使用的字体进行调整。1/3 似乎适用于 Times New Roman。

  • +1 我喜欢这种技术以获得*好的*近似值。对性能敏感的应用程序(相对于循环)会派上用场。 (2认同)

Hof*_*ann 5

大多数其他答案都使用循环来减小字体大小,直到它适合div为止,这非常慢,因为每次字体更改大小时页面都需要重新渲染元素.我最终不得不编写自己的算法,使其以允许我定期更新其内容而不冻结用户浏览器的方式执行.我添加了一些其他功能(旋转文本,添加填充)并将其打包为jQuery插件,您可以在以下位置获取:

https://github.com/DanielHoffmann/jquery-bigtext

简单地打电话

$("#text").bigText();
Run Code Online (Sandbox Code Playgroud)

它很适合你的容器.

在这里看到它:

http://danielhoffmann.github.io/jquery-bigtext/

目前它有一些限制,div必须具有固定的高度和宽度,并且它不支持将文本包装成多行.

Edit2:我现在已经解决了这些问题和限制,并添加了更多选项.您可以设置最大字体大小,也可以选择使用宽度,高度或两者来限制字体大小(默认为两者).我将努力接受包装器元素中的max-width和max-height值.