как установить размер шрифта в зависимости от размера контейнера?

83

У меня есть контейнер с шириной и высотой%, поэтому он масштабируется в зависимости от внешних факторов. Я хочу, чтобы шрифт внутри контейнера имел постоянный размер относительно размера контейнеров. Есть ли хороший способ сделать это с помощью CSS? Он font-size: x%будет масштабировать шрифт только в соответствии с исходным размером шрифта (который будет составлять 100%).

FurtiveFelon
источник

Ответы:

29

Вы можете сделать это с помощью CSS3, используя вычисления, однако, скорее всего, будет безопаснее использовать JavaScript.

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

Используя JS, вы можете изменить высоту текста, а затем просто привязать этот же расчет к событию изменения размера, во время изменения размера, чтобы он масштабировался, пока пользователь вносит изменения, или, как бы то ни было, вы разрешаете изменение размера ваших элементов.

Мэтью Ричс
источник
Попробуйте использовать: window.onresize = function(event) { yourFunctionHere(); };также, таким образом, если пользователь решит изменить размер своей страницы после загрузки, ваш шрифт изменится соответствующим образом,
Генри Ховсон, 01
150

Если вы хотите установить размер шрифта в процентах от ширины области просмотра, используйте vwединицу:

#mydiv { font-size: 5vw; }

Другой альтернативой является использование SVG, встроенного в HTML. Это будет всего лишь несколько строк. Атрибут font-size для текстового элемента будет интерпретироваться как «пользовательские единицы», например те, в терминах которых определяется область просмотра. Таким образом, если вы определяете область просмотра как 0 0 100 100, тогда размер шрифта 1 будет составлять одну сотую размера элемента svg.

И нет, в CSS это невозможно сделать с помощью вычислений. Проблема в том, что проценты, используемые для font-size, включая проценты внутри вычислений, интерпретируются в терминах унаследованного размера шрифта, а не размера контейнера. CSS мог бы использовать bwдля этой цели единицу, называемую (ширина поля), можно сказать div { font-size: 5bw; }, но я никогда не слышал, чтобы это предлагалось.


источник
1
В каких браузерах работает vw? Я не могу заставить его работать в firefox.
lorefnon
1
@lorefnon, на этой странице caniuse.com/#feat=viewport-units говорится, что она будет работать в Firefox 19, а пока попробуйте Chrome.
@torazburo, хм, пробовал в FF 17.0. Отличная находка, кстати, понятия не имел, что существует что-то подобное.
lorefnon
Я собрал меньший фрагмент кода, который будет использовать vw там, где это возможно, и резервные предопределенные значения для различных медиа-запросов: gist.github.com/tnajdek/5143504
tnajdek
15
Обратите внимание, что это vwотносится к области просмотра, а не к размеру контейнера. Наверное, полезно во многих случаях, но у меня svg сработал лучше.
zelanix
68

Еще одна альтернатива js:

Рабочий пример

fontsize = function () {
    var fontSize = $("#container").width() * 0.10; // 10% of container width
    $("#container h1").css('font-size', fontSize);
};
$(window).resize(fontsize);
$(document).ready(fontsize);

Или, как указано в ответе torazaburo, вы можете использовать svg. В качестве доказательства концепции я собрал простой пример:

Пример SVG

<div id="container">
    <svg width="100%" height="100%" viewBox="0 0 13 15">
        <text x="0" y="13">X</text>
    </svg>
</div>
апаул
источник
Просто комментарий, посмотрите, как открывается firefox и отображает файл .pdf. Он изменяет размер содержимого с помощью JavaScript. Довольно тяжелый, но полностью рабочий.
Milche Patern 07
Это полностью работал для меня, теперь мне просто нужно центрировать текст по вертикали
Alejandro
7

Я использовал Fittext в некоторых своих проектах, и это похоже на хорошее решение такой проблемы.

FitText делает размеры шрифтов гибкими. Используйте этот плагин в своем гибком или адаптивном макете, чтобы получить масштабируемые заголовки, заполняющие ширину родительского элемента.

ElvinD
источник
Да, FitText великолепен и прост в настройке
Вспомогательный Джоэл
6

Это не может быть достигнуто с помощью CSS размера шрифта

Предполагая, что «внешние факторы», о которых вы говорите, могут быть уловлены медиа-запросами, вы можете их использовать - корректировки, вероятно, придется ограничить набором предопределенных размеров.

ов
источник
2

Вот функция:

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

Затем преобразуйте все размеры шрифта дочерних элементов ваших документов в em или%.

Затем добавьте что-то подобное в свой код, чтобы установить базовый размер шрифта.

document.body.setScaledFont(0.35);
window.onresize = function() {
    document.body.setScaledFont(0.35);
}

http://jsfiddle.net/0tpvccjt/

tnt-rox
источник
1

У меня была аналогичная проблема, но мне пришлось рассмотреть другие проблемы, которые не удалось решить в примере @ apaul34208. В моем случае;

  • У меня есть контейнер, размер которого менялся в зависимости от области просмотра с помощью медиа-запросов
  • Текст внутри создается динамически
  • Я хочу как увеличивать, так и уменьшать

Не самый элегантный из примеров, но мне он помогает. Рассмотрите возможность регулирования изменения размера окна ( https://lodash.com/ )

var TextFit = function(){
	var container = $('.container');
  container.each(function(){
    var container_width = $(this).width(),
     	width_offset = parseInt($(this).data('width-offset')),
        font_container = $(this).find('.font-container');
	
     if ( width_offset > 0 ) {
         container_width -= width_offset;
     }
                
    font_container.each(function(){
      var font_container_width = $(this).width(),
          font_size = parseFloat( $(this).css('font-size') );

      var diff = Math.max(container_width, font_container_width) - Math.min(container_width, font_container_width);
 
      var diff_percentage = Math.round( ( diff / Math.max(container_width, font_container_width) ) * 100 );
      
      if (diff_percentage !== 0){
          if ( container_width > font_container_width ) {
            new_font_size = font_size + Math.round( ( font_size / 100 ) * diff_percentage );
          } else if ( container_width < font_container_width ) {
            new_font_size = font_size - Math.round( ( font_size / 100 ) * diff_percentage );
          }
      }
      $(this).css('font-size', new_font_size + 'px');
    });
  });
}

$(function(){
  TextFit();
  $(window).resize(function(){
  	TextFit();
  });
});
.container {
		width:341px;
		height:341px;
		background-color:#000;
		padding:20px;
	}
	.font-container {
		font-size:131px;
		text-align:center;
		color:#fff;
	}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<div class="container" data-width-offset="10">
	<span class="font-container">£5000</span>
</div>

https://jsfiddle.net/Merch80/b8hoctfb/7/

Ричард Мерчант
источник
0

В этом ответе я дал более подробный ответ об использовании в vwотношении конкретного размера контейнера. , поэтому я не буду просто повторять здесь свой ответ.

Вкратце, однако, по сути, это вопрос факторинга (или контроля) того, каким будет размер контейнера относительно области просмотра, а затем разработка правильного vw размера на основе этого для контейнера, принимая во внимание то, что должно произойти. если что-то динамически изменяется.

Итак, если вам нужен 5vwразмер контейнера, равный 100% ширины области просмотра, то 75%вы, вероятно, захотите иметь размер в размере, равном ширине области просмотра (5vw * .75) = 3.75vw.

ScottS
источник
-2

Вы также можете попробовать этот чистый метод CSS:

font-size: calc(100% - 0.3em);
Энджи
источник
это вообще не сработает. все это устанавливает размер шрифта относительно размера шрифта контейнера. (минус 0,3 em)
Martijn Scheffer