컨테이너 크기에 따라 글꼴 크기를 설정하는 방법은 무엇입니까?


82

너비와 높이가 % 인 컨테이너가 있으므로 외부 요인에 따라 확장됩니다. 컨테이너 내부의 글꼴이 컨테이너 크기에 비례하여 일정한 크기가되기를 원합니다. CSS를 사용하여이 작업을 수행하는 좋은 방법이 있습니까? 은 font-size: x%만 (100 %가 될 것이다) 원래 폰트 크기에 따른 폰트 크기를 조절한다.


답변:


29

계산을 사용하여 CSS3로이 작업을 수행 할 수 있지만 JavaScript를 사용하는 것이 더 안전 할 수 있습니다.

예 : http://jsfiddle.net/8TrTU/

JS를 사용하면 텍스트의 높이를 변경 한 다음 크기 조정 중에이 동일한 계산을 크기 조정 이벤트에 바인딩하여 사용자가 조정하는 동안 크기가 조정되거나 요소의 크기 조정을 허용 할 수 있습니다.


사용해보십시오 : window.onresize = function(event) { yourFunctionHere(); };뿐만 아니라, 이런 식으로 사용자가 귀하의 글꼴이 적절하게 크기를 조정합니다로드 된 후 자신의 페이지 크기를 조정하기로 결정하면
헨리 Howeson

150

글꼴 크기를 뷰포트 너비의 백분율로 설정하려면 다음 vw단위를 사용하십시오 .

#mydiv { font-size: 5vw; }

다른 대안은 HTML에 포함 된 SVG를 사용하는 것입니다. 몇 줄만 표시됩니다. 텍스트 요소에 대한 font-size 속성은 "사용자 단위"로 해석됩니다 (예 : 뷰포트가 정의되는 단위). 따라서 뷰포트를 0 0 100 100으로 정의하면 글꼴 크기 1은 svg 요소 크기의 100 분의 1이됩니다.

그리고 계산을 사용하여 CSS에서이를 수행 할 수있는 방법이 없습니다. 문제는 계산 내의 백분율을 포함하여 글꼴 크기에 사용되는 백분율이 컨테이너의 크기가 아니라 상속 된 글꼴 크기의 관점에서 해석된다는 것입니다. CSS는 bw이러한 목적으로 (box-width) 라는 단위를 사용할 수 있으므로라고 말할 수는 div { font-size: 5bw; }있지만이 제안을 들어 본 적이 없습니다.


1
vw는 어떤 브라우저에서 작동합니까? firefox에서 작동하도록 할 수 없습니다.
lorefnon

1
@lorefnon,이 페이지 caniuse.com/#feat=viewport-units 는 Firefox 19에서 작동한다고 말하면서 Chrome을 사용해보세요.

@torazburo, 흠, FF 17.0에서 시도했습니다. 위대한 발견 btw, 이와 같은 것이 존재하는지 전혀 몰랐습니다.
lorefnon

사용 가능한 경우 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 파일이 표시되는지 살펴보세요. 콘텐츠의 크기를 자바 ​​스크립트 방식으로 조정하고 있습니다. 상당히 무겁지만 완전히 작동합니다.
Milche Patern 2014

이것은 완전히 나를 위해 일한, 지금은 수직으로 텍스트를 중심으로 할 필요가
알레한드로

7

일부 프로젝트에서 Fittext 를 사용 했는데 이와 같은 문제에 대한 좋은 해결책 인 것 같습니다.

FitText는 글꼴 크기를 유연하게 만듭니다. 유동적이거나 반응 형 레이아웃에서이 플러그인을 사용하여 상위 요소의 너비를 채우는 확장 가능한 헤드 라인을 얻을 수 있습니다.


Yep FitText는 훌륭하고 설정이 간단합니다
Auxiliary Joel

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 % 크기 를 원하면 75%뷰포트 너비의 크기를 원할 것입니다 (5vw * .75) = 3.75vw.



-2

이 순수한 CSS 방법을 시도 할 수도 있습니다.

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

그것은 전혀 작동하지 않을 것입니다. 이 모든 작업은 컨테이너 글꼴 크기에 상대적으로 글꼴 크기를 설정하는 것입니다. (마이너스 0.3 em)
Martijn Scheffer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.