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


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.