コンテナサイズに基づいてフォントサイズを設定する方法は?


82

幅と高さが%のコンテナがあるので、外部要因に応じてスケーリングします。コンテナ内のフォントは、コンテナのサイズに対して一定のサイズにしたいと思います。CSSを使用してこれを行う良い方法はありますか?font-size: x%のみ(100%であろう)元のフォントサイズに応じてフォントをスケーリングすることになります。


回答:


29

計算を使用してCSS3でこれを行うことができる場合がありますが、JavaScriptを使用する方が安全である可能性があります。

次に例を示します。 http //jsfiddle.net/8TrTU/

JSを使用すると、テキストの高さを変更してから、この同じ計算をサイズ変更イベントにバインドするだけで、サイズ変更中にユーザーが調整している間、または要素のサイズ変更を許可しているときにスケーリングされます。


使用してみてください:window.onresize = function(event) { yourFunctionHere(); };同様に、フォントをロードした後にユーザーがページのサイズを変更することを決定した場合、適切にサイズ変更されます
Henry Howeson 2017年

150

フォントサイズをビューポート幅のパーセンテージとして設定する場合は、次のvw単位を使用します。

#mydiv { font-size: 5vw; }

もう1つの方法は、HTMLに埋め込まれたSVGを使用することです。ほんの数行になります。text要素のfont-size属性は、「ユーザーユニット」として解釈されます。たとえば、ビューポートがで定義されているものです。したがって、ビューポートを0 0 100 100として定義すると、フォントサイズ1はsvg要素のサイズの100分の1になります。

いいえ、CSSで計算を使用してこれを行う方法はありません。問題は、計算内のパーセンテージを含む、フォントサイズに使用されるパーセンテージが、コンテナのサイズではなく、継承されたフォントサイズの観点から解釈されることです。CSSはbwこの目的のために(box-width)と呼ばれる単位を使用できるので、あなたは言うことができますdiv { font-size: 5bw; }が、私はこれが提案されたことを聞いたことがありません。


1
vwはどのブラウザで動作しますか?Firefoxで動作させることができません。
lorefnon 2012

1
@ lorefnon、このページcaniuse.com/#feat=viewport-unitsは、Firefox 19で動作することを示していますが、Chromeを試してください。

@ torazburo、うーん、FF17.0で試してみました。ところで、このようなものが存在することを知りませんでした。
lorefnon 2012

利用可能な場合はvwを使用し、さまざまなメディアクエリに事前定義された値をフォールバックするコードをハッキングしました:gist.github.com/tnajdek/5143504
tnajdek

15
これvwは、コンテナサイズではなく、ビューポートに関連していることに注意してください。おそらく多くの場合に役立ちますが、svgの方がうまくいきました。
zelanix 2014年

67

別の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 2014

これは完全に機能しました。テキストを垂直方向に中央
揃え

7

私はいくつかのプロジェクトでFittextを使用しましたが、このような問題に対する良い解決策のようです。

FitTextは、フォントサイズを柔軟にします。流動的またはレスポンシブレイアウトでこのプラグインを使用して、親要素の幅を満たすスケーラブルな見出しを実現します。


うん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/


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%のコンテナでのサイズが必要な場合は、ビューポート幅の1つで75%ある必要があります(5vw * .75) = 3.75vw



-2

この純粋なCSSメソッドを試すこともできます。

font-size: calc(100% - 0.3em);

それはまったく機能しません。これはすべて、コンテナのフォントサイズに対して相対的なフォントサイズを設定することです。(マイナス0.3 em)
Martijn Scheffer 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.