Мне трудно разобраться с масштабированием шрифтов.
В настоящее время у меня есть этот сайт с телом font-size
100%. 100% чего хотя? Это, кажется, вычислить в 16 пикселей.
У меня сложилось впечатление, что 100% будет как-то относиться к размеру окна браузера, но, видимо, не потому, что это всегда 16 пикселей, независимо от того, уменьшено ли окно до ширины мобильного устройства или полноэкранного рабочего стола.
Как я могу сделать текст в моем масштабе сайта относительно его контейнера? Я пытался использовать em
, но это не масштабируется либо.
Мои рассуждения , что такие вещи , как мое меню становится искаженными при изменении размеров, так что мне нужно , чтобы уменьшить px
font-size
из .menuItem
числа других элементов по отношению к ширине контейнера. (Например, в меню на большом рабочем столе 22px
работает отлично. Переместитесь вниз до ширины планшета и 16px
больше подойдет.)
Я знаю, что могу добавить точки останова, но я действительно хочу, чтобы текст масштабировался, а также имел дополнительные точки останова, в противном случае я получу сотни точек останова на каждые 100 пикселей уменьшения ширины для управления текстом.
источник
font-size: 100%;
означает 100% размера текста (т.е. тот, который он наследует от своего родителя). По умолчанию это 16px. Так что, если бы вы использовали 50%, это был бы размер шрифта: 8pxОтветы:
РЕДАКТИРОВАТЬ: Если контейнер не является телом CSS Tricks охватывает все ваши параметры в Подгонка текста к контейнеру .
Если контейнер является телом, то вы ищете длины просмотра в процентах :
Значения:
vw
(% от ширины области просмотра)vh
(% от высоты окна просмотра)vi
(1% от размера области просмотра в направлении встроенной оси корневого элемента)vb
(1% от размера области просмотра в направлении оси блока корневого элемента)vmin
(меньшее изvw
илиvh
)vmax
(больше илиvw
илиvh
)1 v * равно 1% исходного содержащего блока.
Использование выглядит следующим образом:
Как вы можете видеть, когда ширина области просмотра увеличивается, то же самое происходит
font-size
и без использования медиа-запросов.Эти значения являются единицами измерения, такими же, как
px
илиem
, поэтому их можно использовать для определения размера других элементов, таких как ширина, поле или отступ.Поддержка браузеров довольно хорошая, но вам, вероятно, понадобится запасной вариант, такой как:
Проверьте статистику поддержки: http://caniuse.com/#feat=viewport-units .
Кроме того, ознакомьтесь с CSS-хитростями для более широкого взгляда: Viewport Sized Typography
Вот хорошая статья о настройке минимальных / максимальных размеров и осуществлении большего контроля над размерами: Точный контроль над отзывчивой типографикой
А вот статья о настройке размера с помощью calc (), чтобы текст заполнял область просмотра: http://codepen.io/CrocoDillon/pen/fBJxu
Также, пожалуйста, просмотрите эту статью, которая использует технику, названную «расплавленный отвод», чтобы также отрегулировать высоту линии. Расплавленный Лидер в CSS
источник
FitText.js
альтернативу, представленную внизу статьи @jbenjohnson.Но что, если контейнер не является окном просмотра (телом)?
Этот вопрос задается в комментарии Алекса под принятым ответом .
Этот факт не означает, что не
vw
может быть использован в некоторой степени для размера этого контейнера. Теперь, чтобы увидеть какие-либо изменения, нужно предположить, что контейнер каким-то образом является гибким по размеру. Будь то прямой процентwidth
или 100% минус поля. Дело становится «спорными» , если контейнер всегда устанавливается, скажем, в200px
ширину - тогда просто установить ,font-size
что работает для этой ширины.Пример 1
Однако с контейнером с гибкой шириной необходимо понимать, что каким-то образом размер контейнера все еще находится вне области просмотра . Таким образом, речь идет о настройке
vw
параметра на основе этой разницы в процентах по размеру для окна просмотра, что означает учет размеров родительских оболочек. Возьмите этот пример :Предполагая, что здесь
div
является потомкомbody
, он имеет50%
ту100%
ширину, которая является размером области просмотра в этом базовом случае. По сути, вы хотите установить,vw
что будет выглядеть хорошо для вас. Как вы можете видеть из моего комментария в приведенном выше контенте CSS, вы можете «обдумать» это математически относительно полного размера области просмотра, но вам не нужно этого делать. Текст будет «сгибаться» с контейнером, потому что контейнер сгибается с изменением размера области просмотра. ОБНОВЛЕНИЕ: вот пример двух разных размеров контейнеров .Пример 2
Вы можете помочь в определении размера области просмотра, форсируя вычисления, основанные на этом. Рассмотрим этот пример :
Размер по-прежнему зависит от области просмотра, но по сути настраивается исходя из самого размера контейнера.
Должен ли размер контейнера динамически меняться ...
Если размер элемента контейнера заканчивался динамическим изменением его процентного отношения либо через
@media
точки останова, либо через JavaScript, то какой бы ни была базовая «цель», потребовался бы пересчет, чтобы сохранить те же «отношения» для определения размера текста.Возьмите пример № 1 выше. Если бы он
div
был переключен на25%
ширину либо с помощью@media
JavaScript, либо в то же самое время,font-size
то необходимо было бы настроить либо в медиа-запросе, либо с помощью JavaScript новый расчет5vw * .25 = 1.25
. При этом размер текста будет таким же, как если бы «ширина» исходного50%
контейнера была уменьшена вдвое от размера окна просмотра, но теперь была уменьшена из-за изменения его собственного процентного расчета.Вызов
При использовании
calc()
функции CSS3 стало бы трудно настраивать динамически, поскольку эта функцияfont-size
в настоящее время не работает для целей. Таким образом, вы не можете выполнить чистую настройку CSS 3, если ваша ширина меняетсяcalc()
. Конечно, небольшая корректировка ширины полей может быть недостаточной, чтобы оправдать любые измененияfont-size
, поэтому это может не иметь значения.источник
@media
точку останова, чтобы изменить размер шрифта в этой точке (по сути, придав ему фиксированный размер при достиженииmax-width
) , Просто мысль поработать сmax-width
ситуацией.Решение с SVG:
https://jsfiddle.net/qc8ht5eb/
Решение с SVG и переносом текста с использованием
foreignObject
:https://jsfiddle.net/2rp1q0sy/
источник
В одном из моих проектов я использую «смесь» между vw и vh, чтобы настроить размер шрифта в соответствии со своими потребностями, например:
Я знаю, что это не отвечает на вопрос ОП, но, возможно, это может быть решением для кого-либо еще.
источник
vmin
и / илиvmax
вместо этого.Чисто-CSS решение с
calc()
, CSS-единицы и математикаЭто точно не то, что просит OP, но может сделать чей-то день. Этот ответ не просто кормить с ложечки и требует некоторого изучения на стороне разработчика.
Наконец-то я пришел, чтобы получить решение для чистого CSS для этого с использованием
calc()
разных модулей. Вам нужно некоторое базовое математическое понимание формул, чтобы проработать ваше выражениеcalc()
.Когда я решил это, я должен был получить отзывчивый заголовок на всю ширину страницы с некоторыми дополнениями в DOM. Я буду использовать мои значения здесь, замените их своими.
Математике
Тебе понадобится:
padding: 3em
и полная ширина, так что это добралось до100wv - 2 * 3em
X - ширина контейнера, поэтому замените его собственным выражением или измените значение, чтобы получить полностраничный текст.
R
это соотношение у вас будет. Вы можете получить его, откорректировав значения в некотором окне просмотра, проверив ширину и высоту элемента и заменив их своими собственными значениями. Кроме того, этоwidth / heigth
;)И взрыв! Это сработало! я написал
в мой заголовок, и он корректно настроен в каждом окне просмотра.
Но как это работает?
Нам нужны некоторые константы здесь.
100vw
означает полную ширину области просмотра, и моей целью было установить заголовок полной ширины с некоторыми отступами.Соотношение. Получив ширину и высоту в одном окне просмотра, я получил соотношение для игры, и с отношением я знаю, какой должна быть высота в других окнах. Вычисление их вручную заняло бы много времени и, по крайней мере, потребовало бы большой полосы пропускания, так что это не очень хороший ответ.
Вывод
Интересно, почему никто не понял этого, а некоторые люди даже говорят, что с CSS было бы невозможно повозиться. Я не люблю использовать JavaScript для настройки элементов, поэтому я не принимаю ответы JavaScript (и забываю о jQuery), не копая больше. В общем, хорошо, что это выяснили, и это один из шагов к реализации чистого CSS в дизайне сайта.
Я извиняюсь за любое необычное соглашение в моем тексте, я не являюсь носителем английского языка и также довольно новичок в написании ответов переполнения стека.
Следует также отметить, что в некоторых браузерах есть злые полосы прокрутки. Например, при использовании Firefox я заметил, что это
100vw
означает полную ширину области просмотра, простирающуюся под полосой прокрутки (где контент не может расширяться!), Поэтому текст полной ширины должен быть аккуратно размечен и желательно тестироваться во многих браузерах и устройствах.источник
x
составляет 640 пикселей и соотношениеr
16: 9, поэтому:x = 640px, r = 16 / 9, y = x / r = 640px / (16 / 9) = 360px
В этом вопросе есть большая философия.
Самое простое, что можно сделать, - это задать определенный размер шрифта для тела (я рекомендую 10), и тогда все остальные элементы будут иметь свой шрифт в
em
илиrem
. Я дам вам пример, чтобы понять эти единицы.Em
всегда относительно своего родителя:Rem
всегда относительно тела:И тогда вы можете создать скрипт, который будет изменять размер шрифта относительно ширины вашего контейнера. Но это не то, что я бы порекомендовал. Например, в контейнере шириной 900 пикселей у вас будет
p
элемент с размером шрифта 12 пикселей, скажем так. И по вашей идее это будет контейнер шириной 300 пикселей с размером шрифта 4 пикселя. Там должен быть нижний предел.Другие решения были бы с медиа-запросами, чтобы вы могли установить шрифт для различной ширины.
Но решения, которые я бы порекомендовал, это использовать библиотеку JavaScript, которая поможет вам в этом. И fittext.js, который я нашел до сих пор.
источник
rem
Устройство относительно корневой элемент, то естьhtml
элемент, а неbody
элемент. Корневым элементом в DOM являетсяhtml
тег. developer.mozilla.org/en-US/docs/Web/CSS/length ..rem
всегда относится кhtml
тегу, который является корневым элементом, а не тегом body ... но хороший ответ :)Вот функция:
Затем преобразуйте все размеры шрифтов дочерних элементов ваших документов в
em
s или%
.Затем добавьте что-то подобное в ваш код, чтобы установить базовый размер шрифта.
http://jsfiddle.net/0tpvccjt/
источник
return this
в конце функции. Для повышения производительности вы также можете отменить изменение размера, чтобы оно не перерисовывалось при перетаскивании. Это довольно простой код, поэтому кто-то может основать свое улучшенное решение на нем без особых усилий.Есть способ сделать это без JavaScript!
Вы можете использовать встроенное изображение SVG. Вы можете использовать CSS в SVG, если он встроенный. Вы должны помнить, что использование этого метода означает, что ваше изображение SVG будет реагировать на размер контейнера.
Попробуйте использовать следующее решение ...
HTML
CSS
Пример: https://jsfiddle.net/k8L4xLLa/32/
Хотите что-нибудь более роскошное?
Изображения SVG также позволяют делать классные вещи с формами и мусором. Проверьте этот отличный вариант использования для масштабируемого текста ...
https://jsfiddle.net/k8L4xLLa/14/
источник
vw
калибровкой. если вы измените текст, все выходит за рамки.Это может быть не очень практично, но если вы хотите, чтобы шрифт был прямой функцией родителя, без какого-либо JavaScript, который прослушивает / зацикливается (интервал) для чтения размера div / страницы, есть способ сделать это , Iframes.
Все в пределах iframe будет рассматривать размер iframe как размер области просмотра. Таким образом, хитрость заключается в том, чтобы просто создать iframe, ширина которого равна максимальной ширине, которую вы хотите, чтобы ваш текст, и высота которой равна максимальной высоте * соотношения сторон конкретного текста.
Если не принимать во внимание ограничение на то, что единицы видового экрана не могут также встречаться с боковыми родительскими единицами для текста (например, если размер% ведет себя как все остальные), единицы видового экрана предоставляют очень мощный инструмент: возможность получить минимальное / максимальное измерение , Вы не можете сделать это где-нибудь еще - вы не можете сказать ... сделайте высоту этого div равной ширине родительского * что-то.
При этом хитрость заключается в том, чтобы использовать vmin и установить размер iframe таким образом, чтобы [фракция] * общая высота была хорошим размером шрифта, когда высота является ограничивающим размером, и [дробь] * общая ширина, когда ширина является предельное измерение. Вот почему высота должна быть произведением ширины и соотношения сторон.
Для моего конкретного примера у вас есть
Небольшое неудобство с этим методом заключается в том, что вам нужно вручную установить CSS для iframe. Если вы прикрепите весь CSS-файл, это займет много трафика для многих текстовых областей. Итак, что я делаю, это присоединяю правило, которое я хочу, прямо из моего CSS.
Вы можете написать небольшую функцию, которая получает правило CSS / все правила CSS, которые будут влиять на текстовую область.
Я не могу придумать другой способ сделать это без некоторого зацикливания / прослушивания JavaScript. Реальным решением было бы для браузеров предоставить способ масштабирования текста в зависимости от родительского контейнера и также обеспечить ту же функциональность типа vmin / vmax.
JSFiddle: https://jsfiddle.net/0jr7rrgm/3/ (нажмите один раз, чтобы заблокировать красный квадрат для мыши, и нажмите еще раз, чтобы отпустить)
Большая часть JavaScript в скрипте - это просто моя пользовательская функция перетаскивания мышью.
источник
srcdoc
: jsfiddle.net/wauzgob6/3Использование
vw
,em
& Ко. работает точно, но IMO всегда нуждается в человеческом прикосновении для тонкой настройки.Вот скрипт , я просто написал на основе @ тротил-ROX» ответ , который пытается автоматезированным прикосновение этого человека в:
Это в основном уменьшает размер шрифта до,
1em
а затем начинает увеличиваться на 0,1, пока не достигнет максимальной ширины.JSFiddle
источник
ems
требует человеческого прикосновения, а вертикальный ритм - не какое-то колдовство.100% по отношению к базовому размеру шрифта, который, если вы его не установили, будет по умолчанию пользовательским агентом браузера.
Чтобы получить желаемый эффект, я бы использовал фрагмент кода JavaScript для настройки базового размера шрифта относительно размеров окна.
источник
Внутри вашего CSS, попробуйте добавить это внизу, изменяя ширину 320 пикселей, где ваш дизайн начинает ломаться:
Затем укажите желаемый размер шрифта в «px» или «em».
источник
Мое собственное решение, основанное на jQuery, работает за счет постепенного увеличения размера шрифта до тех пор, пока контейнер не увеличится в размерах (что означает, что он получил разрыв строки).
Это довольно просто, но работает довольно хорошо, и это очень легко использовать. Вам не нужно ничего знать об используемом шрифте, браузер позаботится обо всем.
Вы можете поиграть с ним на http://jsfiddle.net/tubededentifrice/u5y15d0L/2/
Волшебство происходит здесь:
источник
Этот веб-компонент изменяет размер шрифта, чтобы ширина внутреннего текста соответствовала ширине контейнера. Проверьте демо .
Вы можете использовать это так:
источник
Возможно, вы ищете что-то вроде этого:
http://jsfiddle.net/sijav/dGsC9/4/
http://fiddle.jshell.net/sijav/dGsC9/4/show/
Я использовал flowtype , и он отлично работает (однако это JavaScript, а не просто решение CSS):
источник
Я подготовил простую функцию масштабирования, используя CSS-преобразование вместо font-size. Вы можете использовать его внутри любого контейнера, вам не нужно задавать медиа-запросы и т. Д. :)
Сообщение в блоге: масштабируемый заголовок CSS и JS полной ширины
Код:
Рабочая демонстрация: https://codepen.io/maciejkorsan/pen/BWLryj
источник
Используйте CSS-переменные
Никто еще не упомянул CSS-переменные, и этот подход работал лучше всего для меня, поэтому:
Допустим, на вашей странице есть столбец, который на 100% ширины экрана мобильного пользователя, но имеет
max-width
800 пикселей, поэтому на рабочем столе по обе стороны от столбца есть место. Поместите это в верхней части вашей страницы:И теперь вы можете использовать эту переменную (вместо встроенного
vw
модуля), чтобы установить размер шрифта. НапримерЭто не чисто CSS-подход, но он довольно близок.
источник
Попробуйте http://simplefocus.com/flowtype/ . Это то, что я использую для своих сайтов, и это сработало отлично.
источник
Моя проблема была похожа, но связана с масштабированием текста внутри заголовка. Я попробовал Fit Font, но мне нужно было включить компрессор, чтобы получить какие-либо результаты, так как он решал немного другую проблему, как Text Flow.
Поэтому я написал свой собственный небольшой плагин, который уменьшал размер шрифта, чтобы он соответствовал контейнеру, предполагая, что у вас есть,
overflow: hidden
иwhite-space: nowrap
поэтому, даже если сокращение шрифта до минимума не позволяет отображать полный заголовок, он просто обрезает то, что может показать.источник
С художественной точки зрения, если вам нужно разместить две или более строки текста на одной ширине независимо от количества символов, у вас есть хорошие варианты.
Лучше всего найти динамическое решение, чтобы любой введенный текст получился с хорошим отображением.
Посмотрим, как мы можем подойти.
Все, что мы делаем, это получаем ширину (
els[0].clientWidth
) и размер шрифта (parseFloat(window.getComputedStyle(els[0],null).getPropertyValue("font-size"))
) первой строки в качестве ссылки, а затем просто вычисляем размер шрифта последующих строк соответственно.источник
Попробуйте использовать плагин fitText , потому что размеры Viewport не являются решением этой проблемы.
Просто добавьте библиотеку:
И измените размер шрифта для правильной настройки параметров текста:
Вы можете установить максимальные и минимальные значения текста:
источник
Взгляните на мой код. Это делает
font size smaller
Tofit
то , что там.Но я думаю, что это не приводит к хорошему пользовательскому опыту
источник
В качестве резервного JavaScript (или единственного решения) вы можете использовать мой плагин jQuery Scalem , который позволяет вам масштабировать относительно родительского элемента (контейнера), передавая
reference
опцию.источник
В случае, если это кому-нибудь пригодится, большинство решений в этой теме заключалось в переносе текста в несколько строк в форме e.
Но потом я нашел это, и это сработало:
https://github.com/chunksnbits/jquery-quickfit
Пример использования:
$('.someText').quickfit({max:50,tolerance:.4})
источник
Всегда имейте свой элемент с этим атрибутом:
JavaScript:
element.style.fontSize = "100%";
или
CSS:
style = "font-size: 100%;"
Когда вы идете в полноэкранном режиме, вы уже должны иметь масштаб переменной вычисляется (масштаб> 1 или масштаб = 1). Затем на весь экран:
Это работает хорошо с небольшим кодом.
источник
Для динамического текста этот плагин весьма полезен:
http://freqdec.github.io/slabText/
Просто добавьте CSS:
И сценарий:
источник
Это сработало для меня:
Я пытаюсь приблизить размер шрифта на основе ширины / высоты, полученной из установки `font-size: 10px`. По сути, идея заключается в том, что «если у меня ширина 20 пикселей и высота 11 пикселей с параметром« font-size: 10px », то какой будет максимальный размер шрифта для вычисления контейнера шириной 50 пикселей и высотой 30 пикселей?»
Ответ - система двойной пропорции:
{20: 10 = 50: X, 11: 10 = 30: Y} = {X = (10 * 50) / 20, Y = (10 * 30) / 11}
Теперь X - это размер шрифта, который будет соответствовать ширине, а Y - это размер шрифта, который будет соответствовать высоте; принять наименьшее значение
NB: аргумент функции должен быть элементом span или элементом, который меньше, чем его родитель, иначе, если у дочерних элементов и родительских функций одинаковая ширина / высота, произойдет сбой.
источник
Я не вижу никакого ответа со ссылкой на CSS flex-свойство, но оно может быть очень полезным.
источник
Чтобы размер шрифта соответствовал его контейнеру, а не окну, посмотрите
resizeFont()
функцию, которой я поделился в этом вопросе (комбинация других ответов, большинство из которых уже связаны здесь). Это вызвано использованиемwindow.addEventListener('resize', resizeFont);
.Vanilla JavaScript: измените размер шрифта, чтобы вместить контейнер
JavaScript:
Возможно, вы можете использовать vw / vh как запасной вариант, поэтому вы динамически назначаете
em
илиrem
единицы с помощью JavaScript, гарантируя , что шрифты делают масштаб в окне , если JavaScript отключен.Примените
.resize
класс ко всем элементам, содержащим текст, который вы хотите масштабировать.Запустите функцию перед добавлением слушателя события изменения размера окна. Затем любой текст, который не помещается в его контейнер, будет уменьшен при загрузке страницы, а также при ее изменении.
Примечание: по умолчанию
font-size
должно быть установлено либоem
,rem
или%
для достижения соответствующих результатов.источник
HTML
Код JavaScript для максимизации размера шрифта:
источник