Я никогда не пробовал это, и, возможно, это безумие, но вместо всех (к сожалению, бесполезных) предложений, чтобы приблизиться к этому, изменяя размеры снова и снова, пока текст не подходит, возможно, вы можете попробовать только два очень разных размера шрифта (конечно, без обертки), например 10 и 100, а затем интерполировать или экстраполировать ожидаемое значение, предполагая, что отношение должно быть почти линейным? Я не знаю, стоит ли делать два макета, как это слишком дорого для вашего узкого места. Если это так, я не уверен, какая надежда у вас действительно есть, поскольку шрифты могут быть сложными. Но это может сработать.
Update: Я создал Fiddle, используя эту технику. Кажется, он работает достаточно хорошо. Соответствующий код:
var font_size_to_fit = (function() {
var $test = $("<span/>").appendTo("body").css({
visibility: "hidden",
border: 0,
padding: 0,
whiteSpace: "pre"
});
var minFont = 10, maxFont = 100;
return function(txt, fontFamily, size) {
$test.appendTo("body").css({fontFamily: fontFamily}).text(txt);
$test.css({fontSize: maxFont + "px"});
var maxWidth = $test.width();
$test.css({fontSize: minFont + "px"});
var minWidth = $test.width();
var width = (size - minWidth) * (maxFont - minFont)/
(maxWidth - minWidth) + minFont;
$test.detach();
return width + "px";
};
}());
Это, вероятно, также потребуется некоторые ошибки проверки, чтобы гарантировать, что мы не имеем никакого деления на ноль, что будет происходить, когда minWidth == maxWidth
, скорее всего, когда текст прилагается пуст. Это остается как упражнение для читателя.
Другое обновление: Это сломалось в какой-то момент. Я обновил Fiddle, чтобы включить это:
return (width - .1) + "px";
Это исправляет ошибку, отмеченную в комментариях. Но я понятия не имею, что изменилось, чтобы заставить его сломаться между ними.
Сделайте текст в другом контейнере/контейнере и проверьте его ширину до тех пор, пока она не совпадет. – NoLifeKing
Это сложнейшая проблема, чем на первый взгляд, поскольку большинство браузеров обеспечивают минимальный размер шрифта. Поэтому, если вы используете цикл для непрерывного сжатия шрифта, вам также нужно проверить, соответствует ли фактический размер шрифта тому же, что и указанный размер шрифта. Если это не так, вы достигли минимума и должны отменить свой цикл. – Blazemonger
Я ценю ввод, но это совсем другая ситуация.В этом вопросе предлагается метод динамически вписывать текст в элемент - это то, что делает решение, используя некоторое время. Я прошу функцию, которая ** рассчитает ** требуемую ширину. Моя функция будет помещена в узкую область, поэтому она должна быть быстрой математической формулой, а не итеративной манипуляцией DOM. – MaiaVictor