字体大小自动调整以适应

Posted

技术标签:

【中文标题】字体大小自动调整以适应【英文标题】:Font size auto adjust to fit 【发布时间】:2011-05-23 11:26:27 【问题描述】:

我正在努力按照标题所说的去做。我已经看到font-size 可以是一个百分比。所以我的猜测是font-size: 100%; 会这样做,但不会。

这里是一个例子:http://jsfiddle.net/xVB3t/

我能得到一些帮助吗?

(如果有必要用js以编程方式做到这一点没有问题)

【问题讨论】:

谢谢。任何想看的人都可以在这里看到它:jsfiddle.net/xVB3t/2 非常感谢您分享已解决的问题,这真的很有帮助,应该如何做+1! Auto-size dynamic text to fill fixed size container的可能重复 @ChrisBaker 链接的问题是询问 jQuery,这个问题不是,所以我不会将其标记为重复。 @PeterOlson 考虑到接受的答案的全部内容都链接到该答案,如果没有链接,这个接受的答案将 100% 无用,这是一个应该标记为的问题的完美示例重复。否则,这是“你的答案在另一个城堡”的一个很好的例子,这是一个当你看到它时要避免和消除的问题。 【参考方案1】:

这个问题可能会对你有所帮助,但我警告你,虽然这可以通过 jQuery 解决:

Auto-size dynamic text to fill fixed size container

祝你好运。

那个问题的OP做了一个插件,here is the link to it(&download)

顺便说一句,我建议使用 jQuery,因为 Gaby pointed out 仅通过 CSS 无法做到这一点,并且您说您愿意使用 js...

【讨论】:

我实际上在这里对这个答案做了一个总结:***.com/questions/4371003/…【参考方案2】:

不能用 CSS 完成。

100% 与计算的父元素的font-size 相关。

参考:http://www.w3.org/TR/CSS2/fonts.html#font-size-props

有关 jQuery 解决方案,请查看 Auto-size dynamic text to fill fixed size container

【讨论】:

谢谢@Gaby,现在我明白了font-size 的百分比:)。但仍在寻找答案。 @Diego,更新了答案,其中包含指向 SO 中另一个答案的链接。 @Akinator 也发布了它。 如此简单,我迷失在 javascript 解决方案中。普通的 CSS 解决了这个问题。谢谢。【参考方案3】:

我正在研究这个工作,我喜欢 tnt-rox 的回答,但我不禁注意到它有一些额外的开销可以减少。

document.body.setScaledFont = function()
    this.style.fontSize = (this.offsetWidth*0.35)+'%';
    return this;

document.body.setScaledFont();

如果您将其添加到 onresize 事件中,减少开销会使它运行得更快一些。

如果您只想将特定元素内的字体设置为调整大小以适应,您还可以执行以下操作

window.onload = function()
    var scaledFont = function(el)
            if(el.style !== undefined)
                el.style.fontSize = (el.offsetWidth*0.35)+'%';
            
            return el;
        
        navs = document.querySelectorAll('.container>nav'),
        i;
    window.onresize = function()
        for(i in navs)
            scaledFont(navs[i]);
        
    ;
    window.onresize();
;

我刚刚注意到 nicolaas 的回答也有一些额外的开销。我已经清理了一下。从性能的角度来看,我不太喜欢使用 while 循环并慢慢减小大小,直到找到合适的大小。

function setPageHeaderFontSize(selector) 
    var $ = jQuery;
    $(selector).each(function(i, el) 
        var text = $(el).text();
        if(text.length) 
            var span = $("<span>").css(
                    visibility: 'hidden',
                    width: '100%',
                    position: 'absolute',
                    'line-height': '300px',
                    top: 0,
                    left: 0,
                    overflow: 'visible',
                    display: 'table-cell'
                ).text(text),
                height = 301,
                fontSize = 200;
            $(el).append(span);
            while(height > 300 && fontSize > 10) 
                height = span.css("font-size", fontSize).height();
                fontSize--;
            
            span.remove();
            $(el).css("font-size", fontSize+"px");
        
    );

setPageHeaderFontSize("#MyDiv");

这是我之前使用 jquery 的代码示例。

$(function()
    var scaledFont = function(el)
            if(el.style !== undefined)
                el.style.fontSize = (el.offsetWidth*0.35)+'%';
            
            return el;
        ;
    $(window).resize(function()
        $('.container>nav').each(scaledFont);
    ).resize();
);

【讨论】:

【参考方案4】:

有点晚了,但这就是我解决这个问题的方法:

document.body.setScaledFont = function() 
    var f = 0.35, s = this.offsetWidth, fs = s * f;
    this.style.fontSize = fs + '%';
    return this

document.body.setScaledFont();

现在已设置基本文档字体。

对于 dom 中的其余元素,将字体大小设置为 % 或 em,它们将按比例缩放。

【讨论】:

【参考方案5】:

这里我有一个 mootools 解决方案:

Element.implement("fitText", function() 
                var e = this.getParent();
                var maxWidth = e.getSize().x;
                var maxHeight = e.getSize().y;
                console.log(maxWidth);
                var sizeX = this.getSize().x;
                var sizeY = this.getSize().y;
                if (sizeY <= maxHeight && sizeX <= maxWidth)
                    return;

                var fontSize = this.getStyle("font-size").toInt();
                while( (sizeX > maxWidth || sizeY > maxHeight) && fontSize > 4 ) 
                    fontSize -= .5;
                    this.setStyle("font-size", fontSize + "px");
                    sizeX = this.getSize().x;
                    sizeY = this.getSize().y;
                
                return this;
            );

            $$("span").fitText();

【讨论】:

【参考方案6】:

这是另一个 jQuery 解决方案...

/**
 * Resizes page header font-size for the text to fit.
 * basically we add a hidden span into the header,
 * put the text into it and then keep reducing the super large font-size
 * for as long as the height of the span exceeds the super
 * tall line-height set for the test (indicating there is more than one line needed
 * to show the text).
 */
function setPageHeaderFontSize(selectorString) 
    jQuery(selectorString).each(
        function(i, el) 
            var text = jQuery(el).text();
            var length = text.length;
            if(length) 
                var id = "TestToSeeLengthOfElement_" + i;
                jQuery(el).append("<span style='visibility: hidden; width: 100%; position: absolute; line-height: 300px; top: 0; left: 0; overflow: visible; display: table-cell;' id='"+id+"'>"+text+"</span>");
                var innerEl = jQuery("#"+id);
                var height = 301;
                var fontSize = 200;
                while(height > 300 && fontSize > 10) 
                    height = jQuery(innerEl).css("font-size", fontSize).height();
                    fontSize--;
                
                jQuery(innerEl).remove();
                jQuery(el).css("font-size", fontSize+"px");
            
        
    );


//you can run it like this... using any jQuery enabled selector string (e.g. h1.pageHeaders works fine). 
setPageHeaderFontSize("#MyDiv");

【讨论】:

【参考方案7】:

这是一种查找您正在使用的文本高度的方法。 它很简单,只使用 javascript。您可以使用它来相对于您想要的高度调整文本。

function getTextHeight(text, fontSize) 
    var numberOfLines = 0;
    var STL = text;
    for(var i = 0; i < STL.length; i++)
    if(STL[i] === '<')
        try
            if(STL[i + 1] === 'b' && STL[i + 2] === 'r' && STL[i + 3] === '>')
                numberOfLines++;
            
        
        catch(err)
            break;
        
    
    return (numberOfLines + 1) * fontSize;

【讨论】:

以上是关于字体大小自动调整以适应的主要内容,如果未能解决你的问题,请参考以下文章

Android 自定义TextView实现文本内容自动调整字体大小以适应TextView的大小

如何在 React Native for Android 中调整字体大小以适应视图?

调整字体大小以适应边界矩形?

为啥在 Interface Builder 中更改字体大小会阻止 UILabel 调整大小以适应内容?

Vanilla JavaScript:调整字体大小以适应容器

组合框没有正确调整大小以适应更大的字体大小