Автоматическая настройка размера шрифта по размеру

Я пытаюсь сделать то, что говорит название. Я видел, что font-size может быть процентом. Так что я предполагал, что font-size: 100%; сделает это, но нет.

Вот пример: http://jsfiddle.net/xVB3t/

Могу ли я получить некоторую помощь, пожалуйста?

(Если необходимо сделать это программно с помощью js, нет проблем)


person Diego    schedule 10.12.2010    source источник
comment
Спасибо. Вот он для тех, кто хотел бы его увидеть: jsfiddle.net/xVB3t/2   -  person Diego    schedule 10.12.2010
comment
Большое спасибо за то, что поделились решенной проблемой, это действительно полезно, и именно так нужно делать +1!   -  person Trufa    schedule 10.12.2010
comment
@ChrisBaker Связанный вопрос касается jQuery, этого вопроса нет, поэтому я бы не стал помечать его как дубликат.   -  person Peter Olson    schedule 09.12.2014
comment
@PeterOlson Учитывая, что все содержание принятого ответа ссылается на этот ответ, а без ссылок этот принятый ответ был бы на 100% бесполезен, это прекрасный пример вопроса, который следует пометить как дубликат. В противном случае это хороший пример того, что ваш ответ находится в другом замке, что является проблемой, которую следует избегать и устранять всякий раз, когда вы ее видите.   -  person Chris Baker    schedule 09.12.2014


Ответы (7)


Этот вопрос может помочь вам, но я предупреждаю вас, хотя это решает его с помощью jQuery:

Автоматическое изменение размера динамического текста для заполнения контейнера фиксированного размера

Удачи.

ОП этого вопроса сделал плагин, вот ссылка на него (& скачать)

Кстати, я предлагаю jQuery, потому что, как указал Габи, это это невозможно сделать только с помощью CSS, и вы сказали, что готовы использовать js...

person Trufa    schedule 10.12.2010
comment
На самом деле я сделал краткий обзор этого ответа здесь: заполнить div"> stackoverflow.com/questions/4371003/ - person Trufa; 10.12.2010

Невозможно сделать с помощью CSS.

100% относится к вычисляемому font-size родительского элемента.

ссылка: http://www.w3.org/TR/CSS2/fonts.html#font-size-props

Для решения jQuery см. Автоматический размер динамического текста для фиксированного заполнения размер контейнера

person Gabriele Petrioli    schedule 10.12.2010
comment
Спасибо @Gaby, теперь я понимаю font-size с процентами :). Но все еще ищу ответ. - person Diego; 10.12.2010
comment
@Diego, обновленный ответ со ссылкой на другой ответ в SO. @Akinator также опубликовал это. - person Gabriele Petrioli; 10.12.2010
comment
так просто, и я потерялся в решениях JavaScript. Обычный css решил это. Спасибо. - person Idan Shechter; 20.07.2015

Я искал это для работы, и мне понравился ответ 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();
};

Я только что заметил, что у ответа Николааса также были дополнительные накладные расходы. Я его немного почистил. С точки зрения производительности, я не очень люблю использовать цикл 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();
});
person Eeems    schedule 09.12.2014

Немного поздно, но вот как я подхожу к этой проблеме:

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, и они будут масштабироваться пропорционально.

person tnt-rox    schedule 28.08.2014

здесь у меня есть решение 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();
person Karl Adler    schedule 07.06.2013

Вот еще одно решение 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");
person nicolaas thiemen francken    schedule 09.04.2015

Вот способ найти высоту текста, который вы используете. Это просто и использует только 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;
}
person Launch9    schedule 22.06.2018