Мне нужно отобразить введенный пользователем текст в div фиксированного размера. Я хочу, чтобы размер шрифта автоматически настраивался так, чтобы текст заполнял поле как можно больше.
Так что - если div 400 х 300 пикселей. Если кто-то входит в ABC, то это действительно большой шрифт. Если они введут абзац, то это будет крошечный шрифт.
Вероятно, я бы хотел начать с максимального размера шрифта - возможно, 32 пикселя, и, хотя текст слишком велик, чтобы вместить контейнер, уменьшите размер шрифта до его соответствия.
Ответы:
Спасибо Атака . Я хотел использовать jQuery.
Вы указали мне правильное направление, и вот чем я закончил:
Вот ссылка на плагин: https://plugins.jquery.com/textfill/
И ссылка на источник: http://jquery-textfill.github.io/
и мой HTML такой
Это мой первый плагин jquery, так что он, вероятно, не так хорош, как следовало бы. Указатели, безусловно, приветствуются.
источник
404
.Я не нашел ни одного из предыдущих решений достаточно адекватным из-за плохой производительности, поэтому я сделал свое собственное, которое использует простую математику вместо цикла. Должно работать нормально во всех браузерах.
Согласно этому тесту производительности это намного быстрее, чем другие решения, найденные здесь.
Если вы хотите внести свой вклад, я добавил это в Gist .
источник
.css("font-size")
в цикле. С чего взял? Мое решение, вероятно, быстрее, поскольку в нем нет ничего необычного, что вы добавили в свой плагин. Вы можете добавить свой плагин в jsperf, и мы увидим, какой из них самый быстрый;)Как бы мне ни нравились случайные отклики, которые я получаю за этот ответ (спасибо!), Это действительно не самый лучший подход к этой проблеме. Пожалуйста, ознакомьтесь с некоторыми другими замечательными ответами здесь, особенно те, которые нашли решения без зацикливания.
Тем не менее, для справки, вот мой оригинальный ответ :
А вот версия с классами :
источник
offsetWidth
, мне также пришлось создать переменную для размера, а затем добавить pxtextSpan.style.fontSize = size+"px";
В большинстве других ответов используется цикл для уменьшения размера шрифта до тех пор, пока он не уместится на элементе div, это ОЧЕНЬ медленно, поскольку страница должна повторно отображать элемент каждый раз, когда размер шрифта изменяется. В конце концов мне пришлось написать собственный алгоритм, чтобы он работал так, чтобы я мог периодически обновлять его содержимое, не останавливая работу браузера пользователя. Я добавил некоторые другие функции (вращение текста, добавление отступов) и упаковал его как плагин jQuery, вы можете получить его по адресу:
https://github.com/DanielHoffmann/jquery-bigtext
просто позвоните
и это будет хорошо вписываться в ваш контейнер.
Смотрите это в действии здесь:
http://danielhoffmann.github.io/jquery-bigtext/
На данный момент он имеет некоторые ограничения, div должен иметь фиксированную высоту и ширину, и он не поддерживает перенос текста в несколько строк.
Я буду работать над получением опции, чтобы установить максимальный размер шрифта.
Изменить: я обнаружил еще несколько проблем с плагином, он не обрабатывает другую блочную модель, кроме стандартной, и у div не может быть полей или границ. Я буду работать над этим.
Edit2: я теперь исправил эти проблемы и ограничения и добавил больше опций. Вы можете установить максимальный размер шрифта, а также можете ограничить размер шрифта, используя ширину, высоту или оба. Я постараюсь принять значения max-width и max-height в элементе оболочки.
Edit3: я обновил плагин до версии 1.2.0. Основная очистка кода и новые параметры (verticalAlign, horizontalAlign, textAlign) и поддержка внутренних элементов внутри тега span (например, разрывов строк или значков шрифта).
источник
Это основано на том, что GeekyMonkey опубликовал выше, с некоторыми изменениями.
источник
Вот улучшенный метод зацикливания, который использует бинарный поиск, чтобы найти максимально возможный размер, который вписывается в родительский элемент за наименьшее количество возможных шагов (это быстрее и точнее, чем переход к фиксированному размеру шрифта). Код также оптимизирован несколькими способами для повышения производительности.
По умолчанию будет выполнено 10 шагов двоичного поиска, которые получат в пределах 0,1% от оптимального размера. Вместо этого вы могли бы установить numIter на некоторое значение N, чтобы получить в пределах 1/2 ^ N от оптимального размера.
Назовите его с помощью селектора CSS, например:
fitToParent('.title-span');
источник
vAlign
иpadding
.vAlign == true
устанавливает высоту строки выбранного элемента равной высоте родительского элемента. Отступ уменьшает окончательный размер на переданное значение. По умолчанию это 5. Я думаю, что это выглядит очень хорошо.Я создал директиву для AngularJS - вдохновленный ответом GeekyMonkey, но без зависимости от jQuery.
Демонстрация: http://plnkr.co/edit/8tPCZIjvO3VSApSeTtYr?p=preview
наценка
<div class="fittext" max-font-size="50" text="Your text goes here..."></div>
директива
источник
resizeText
кажется, что она вызывается до того, какng-bind
фактически назначить текст элементу, что приводит к его размеру на основе предыдущего текста, а не текущего текста. Это не так уж плохо в приведенной выше демонстрации, где он вызывается несколько раз при вводе пользователем, но если он вызывается один раз, переходя от нуля к реальному значению (как в односторонней привязке), он остается в максимальном размере.Я добавил вышеприведенный скрипт от Маркуса Эквалла: https://gist.github.com/3945316 и настроил его в соответствии со своими предпочтениями, теперь он запускается при изменении размера окна, так что дочерний элемент всегда помещается в свой контейнер. Я вставил скрипт ниже для справки.
источник
Вот моя модификация ответа ОП.
Короче говоря, многие люди, которые пытались оптимизировать это, жаловались на то, что используется цикл. Да, хотя петли могут быть медленными, другие подходы могут быть неточными.
Поэтому мой подход использует бинарный поиск, чтобы найти лучший размер шрифта:
Это также позволяет элементу указывать минимальный и максимальный шрифт:
Кроме того, этот алгоритм не имеет единиц измерения. Вы можете указать
em
,rem
,%
и т.д. , и он будет использовать , что для его окончательного результата.Вот скрипка: https://jsfiddle.net/fkhqhnqe/1/
источник
У меня была точно такая же проблема с моим сайтом. У меня есть страница, которая отображается на проекторе, на стенах, на больших экранах ..
Поскольку я не знаю максимальный размер моего шрифта, я повторно использовал плагин выше @GeekMonkey, но увеличивая размер шрифта:
источник
Вот версия принятого ответа, которая также может принимать параметр minFontSize.
источник
Вы можете использовать FitText.js ( страница Github ) для решения этой проблемы. Действительно маленький и эффективный по сравнению с TextFill. TextFill использует дорогой цикл while, а FitText - нет.
Также FitText более гибок (я использую его в проекте с очень особыми требованиями и работает как чемпион!).
HTML:
Вы также можете установить параметры для него:
CSS:
И если вам это нужно, FitText также имеет версию no-jQuery .
источник
РЕДАКТИРОВАТЬ: Этот код был использован для отображения заметок в верхней части видео HTML5. Он изменяет размер шрифта на лету, когда размер видео изменяется (когда размер окна браузера изменяется.) Примечания были подключены к видео (так же, как заметки на YouTube), поэтому код использует экземпляры вместо дескриптора DOM непосредственно.
Согласно запросу я добавлю код, который я использовал для достижения этой цели. (Текстовые поля над видео HTML5.) Код был написан очень давно, и я откровенно считаю, что он довольно грязный. Поскольку на вопрос уже дан ответ, и ответ уже принят давно, я не перезаписываю его. Но если кто-то захочет немного упростить это, мы будем рады!
Возможно, вам придется настроить эти числа от font-family до font-family. Хороший способ сделать это - загрузить бесплатный визуализатор графиков под названием GeoGebra. Измените длину текста и размер поля. Затем вы вручную устанавливаете размер. Представьте результаты ручного анализа в систему координат. Затем вы вводите два уравнения, которые я выложил здесь, и изменяете числа, пока «мой» график не будет соответствовать вашим собственным точкам, построенным вручную.
источник
Предлагаемые итеративные решения могут быть значительно ускорены по двум направлениям:
1) Умножьте размер шрифта на некоторую константу, а не добавляя или вычитая 1.
2) Во-первых, ноль при использовании константы курса, скажем, удвоить размер каждой петли. Затем, имея приблизительное представление о том, с чего начать, проделайте то же самое с более точной настройкой, скажем, умножьте на 1,1. Хотя перфекционисту может потребоваться точный целочисленный размер пикселя для идеального шрифта, большинство наблюдателей не замечают разницы между 100 и 110 пикселями. Если вы перфекционист, повторите третий раз с еще более точной настройкой.
Вместо того, чтобы писать конкретную подпрограмму или плагин, который отвечает на точный вопрос, я просто полагаюсь на основные идеи и пишу варианты кода для решения всех видов проблем компоновки, а не только текста, включая подгонку элементов div, spans, images. ... по ширине, высоте, площади, ... в контейнере, соответствующем другому элементу ....
Вот пример:
источник
Это самое элегантное решение, которое я создал. Он использует бинарный поиск, делая 10 итераций. Наивным способом было сделать цикл while и увеличить размер шрифта на 1, пока элемент не начал переполняться. Вы можете определить, когда элемент начинает переполняться, используя element.offsetHeight и element.scrollHeight . Если scrollHeight больше, чем offsetHeight, у вас слишком большой размер шрифта.
Бинарный поиск - гораздо лучший алгоритм для этого. Он также ограничен количеством итераций, которые вы хотите выполнить. Просто вызовите flexFont и вставьте идентификатор div, и он будет регулировать размер шрифта от 8 до 96 пикселей .
Я потратил некоторое время на изучение этой темы и пробовал разные библиотеки, но в конечном итоге я думаю, что это самое простое и простое решение, которое действительно будет работать.
Обратите внимание, если вы хотите, вы можете изменить, чтобы использовать
offsetWidth
иscrollWidth
, или добавить оба к этой функции.источник
ReferenceError: lastSizeTooSmall is not defined
. Может быть, это нужно где-то определить?Я получил ту же проблему, и решение в основном заключается в использовании JavaScript для контроля размера шрифта. Проверьте этот пример на codepen:
https://codepen.io/ThePostModernPlatonic/pen/BZKzVR
Это пример только для высоты, может быть, вам нужно поставить некоторые, если о ширине.
источник
Мне понравилось
источник
Просто хотел добавить мою версию для contenteditables.
источник
Я нашел способ предотвратить использование циклов для сжатия текста. Он корректирует размер шрифта, умножая его на соотношение между шириной контейнера и шириной содержимого. Таким образом, если ширина контейнера составляет 1/3 содержимого, размер шрифта будет уменьшен на 1/3 и будет иметь ширину контейнера. Чтобы увеличить масштаб, я использовал цикл while, пока содержимое не будет больше контейнера.
Этот код является частью теста, который я загрузил на Github https://github.com/ricardobrg/fitText/
источник
Я пошел с решением GeekMonkey, но это слишком медленно. Что он делает, он устанавливает максимальный размер шрифта (maxFontPixels), а затем проверяет, подходит ли он внутри контейнера. иначе это уменьшает размер шрифта на 1 пиксель и проверяет снова. Почему бы просто не проверить предыдущий контейнер на высоту и передать это значение? (да, я знаю почему, но теперь я принял решение, которое работает только на высоте, а также имеет параметр min / max)
Вот гораздо более быстрое решение:
и это будет HTML:
Опять же: это решение ТОЛЬКО проверяет высоту контейнера. Вот почему эта функция не должна проверять, подходит ли элемент внутрь. Но я также реализовал минимальное / максимальное значение (40 мин, 150 макс), поэтому для меня это прекрасно работает (а также работает с изменением размера окна).
источник
Вот еще одна версия этого решения:
источник