컨테이너 너비에 따른 글꼴 크기 조정


1186

글꼴 크기 조정에 어려움을 겪고 있습니다.

현재이 사이트 의 본문 font-size이 100 %입니다. 그래도 100 %? 이것은 16 픽셀에서 계산되는 것 같습니다.

나는 100 %가 브라우저 창의 크기를 어떻게 든 언급 할 것이라는 인상을 받았지만, 창의 너비가 모바일 너비 또는 풀 와이드 스크린 데스크톱으로 크기가 조정되는지 여부는 항상 16 픽셀이기 때문에 그렇지 않습니다.

내 사이트의 텍스트를 컨테이너와 관련하여 확장하려면 어떻게해야합니까? 을 사용해 보았지만 em크기가 조정되지 않았습니다.

내 추론은 크기를 조정할 때 메뉴와 같은 것들이 찌그러지기 때문에 컨테이너 너비와 관련하여 다른 요소 중 하나 를 줄여야한다는 것 px font-size입니다 .menuItem. (예를 들어, 큰 바탕 화면의 메뉴에서 22px완벽하게 작동합니다. 태블릿 너비로 이동하면 16px더 적합합니다.)

내가 중단 점을 추가 할 수 있습니다 알고 있어요,하지만 난 정말 규모에 텍스트로 원하는 아니라 모든 100pixels 텍스트를 제어하는 폭 감소에 대한 그렇지 않으면, 나는 중단 점의 수백으로 끝날 것 같은 데 추가 중단 점을.


34
font-size: 100%;텍스트의 크기가 100 %임을 의미합니다 (즉, 부모로부터 상속받은 것). 기본적으로 16px입니다. 따라서 50 %를 사용하면 글꼴 크기 : 8px
Andy

31
찾고있는 것을 반응 형 또는 뷰포트 크기의 타이포그래피라고합니다. css-tricks.com/viewport-sized-typography
gearsdigital

8
FitText 에 모양을 부여 하십시오 .
Patsy Issa

12
@Andy : 실제로 "기본적으로"는 사용자가 브라우저 텍스트 크기를 설정 한 값이며, 반드시 16px로 해석되지는 않습니다.
ScottS

답변:


1496

편집 : 컨테이너가 본문이 아닌 경우 CSS Tricks는 텍스트를 컨테이너맞추기의 모든 옵션을 다룹니다 .

컨테이너가 바디 인 경우 찾고있는 것은 뷰포트 백분율 길이입니다 .

뷰포트 백분율 길이 의 크기를 기준으로 초기 함유 블록 . 초기 포함 블록의 높이 또는 너비가 변경되면 그에 따라 크기가 조정됩니다. 그러나 루트 요소의 오버플로 값이 자동이면 스크롤 막대가 존재하지 않는 것으로 간주됩니다.

값은 다음과 같습니다.

  • vw (뷰포트 너비의 %)
  • vh (뷰포트 높이의 %)
  • vi (루트 요소의 인라인 축 방향으로 뷰포트 크기의 1 %)
  • vb (루트 요소의 블록 축 방향으로 뷰포트 크기의 1 %)
  • vmin( vw또는 중 작은 것 vh)
  • vmax(더 큰 또는 vw또는 vh)

1 v *는 초기 포함 블록의 1 %와 같습니다.

사용하면 다음과 같습니다.

p {
    font-size: 4vw;
}

보시다시피, 뷰포트 너비가 증가 font-size하면 미디어 쿼리를 사용할 필요없이을 증가시킵니다 .

이 값들은 px또는em 그들이 같은 폭 마진 또는 패딩 같이 크기뿐만 아니라 다른 요소들에 사용될 수 있도록.

브라우저 지원은 꽤 좋지만 다음과 같은 대체가 필요할 수 있습니다.

p {
    font-size: 16px;
    font-size: 4vw;
}

지원 통계를 확인하십시오 : http://caniuse.com/#feat=viewport-units .

또한 CSS-Tricks에서 더 넓은 모양을 확인하십시오. 뷰포트 크기의 타이포그래피

다음은 최소 / 최대 크기를 설정하고 크기를 조금 더 제어하는 ​​방법에 대한 유용한 기사입니다. 반응 형 타이포그래피에 대한 정확한 제어

다음은 텍스트가 뷰포트를 채우도록 calc ()를 사용하여 크기를 설정하는 방법에 대한 기사입니다. http://codepen.io/CrocoDillon/pen/fBJxu

또한, '높이 선도'라는 기술을 사용하여 선 높이를 조정하는이 기사를 참조하십시오. CSS의 녹은 점


547
그러나 컨테이너가 뷰포트 (본문)가 아닌 경우 어떻게해야합니까?
Alex

12
@Alex, 그것은 JS 영토입니다. FitText.js@jbenjohnson 제공 기사 하단에 제공된 대안을 사용해보십시오 .
Robbert

10
미디어 쿼리와 달리 요소 쿼리는 뷰포트가 아닌 포함 블록을 기준으로 크기를 조정합니다. 그러나 불행히도 아직 존재하지 않습니다. 그러나 관심있는 경우 일부 polyfill 및 개념 증명이 존재합니다 : coding.smashingmagazine.com/2013/06/25/…filamentgroup.com/lab/element_query_workarounds
jbenjohnson

139
이것이 질문에 대답하지 않기 때문에 다운 그레이드되었습니다. 그는 뷰포트가 아닌 컨테이너에 대해 물었습니다. 완전히 다른 유스 케이스.
SongBox

6
"초기 포함 블록"은 루트 요소를 나타냅니다. 이것은 질문에 대한 정답이 아닙니다.
글리프

319

그러나 컨테이너가 뷰포트 (본문)가 아닌 경우 어떻게해야합니까?

이 질문은 허용 된 답변 아래 Alex의 코멘트에 요청됩니다. .

그 사실은 vw해당 컨테이너의 크기를 어느 정도 사용할 수 없다는 것을 의미하지는 않습니다 . 이제 모든 변형을 확인하려면 컨테이너의 크기가 유연하다고 가정해야합니다. 직접 백분율을 width통해 또는 100 % 빼기 마진을 통해 여부 . 컨테이너가 항상 200px넓게 설정되어 있으면 포인트가 "부드럽게"됩니다 .font-size 너비에 맞는 .

실시 예 1

그러나 유연한 너비 컨테이너를 사용하면 어떤 식 으로든 컨테이너가 여전히 뷰포트에서 크기가 조정되고 있음을 알아야합니다 . 따라서 vw뷰포트에 대한 백분율 크기 차이에 따라 설정 을 조정 해야합니다. 이는 부모 래퍼의 크기를 고려한 것입니다. 이 예제를 보자 :

div {
    width: 50%;
    border: 1px solid black;
    margin: 20px;
    font-size: 16px;
    /* 100 = viewport width, as 1vw = 1/100th of that
       So if the container is 50% of viewport (as here)
       then factor that into how you want it to size.
       Let's say you like 5vw if it were the whole width,
       then for this container, size it at 2.5vw (5 * .5 [i.e. 50%])
    */
    font-size: 2.5vw;
}

(가) 여기에 가정 div의 자녀이며 body, 그것은이다 50%그의 100%기본적인 경우 뷰포트 크기 폭. 기본적으로, 당신 vw에게 잘 어울리는 것을 설정하고 싶습니다 . 위의 CSS 내용에서 내 의견에서 볼 수 있듯이 전체 뷰포트 크기와 관련하여 수학적으로 "생각"할 수는 있지만 그렇게 할 필요 는 없습니다 . 컨테이너가 뷰포트 크기 조정을 통해 구부러지기 때문에 텍스트가 컨테이너와 함께 "유연"합니다. 업데이트 : 다음은 서로 다른 크기의 두 컨테이너의 예입니다 .

실시 예 2

이를 기반으로 계산을 수행하여 뷰포트 크기 조정을 도울 수 있습니다. 이 예제를 고려하십시오 .

html {width: 100%;} /* Force 'html' to be viewport width */
body {width: 150%; } /* Overflow the body */

div {
    width: 50%;
    border: 1px solid black;
    margin: 20px;
    font-size: 16px;
    /* 100 = viewport width, as 1vw = 1/100th of that
       Here, the body is 150% of viewport, but the container is 50%
       of viewport, so both parents factor  into how you want it to size.
       Let's say you like 5vw if it were the whole width,
       then for this container, size it at 3.75vw
       (5 * 1.5 [i.e. 150%]) * .5 [i.e. 50%]
    */
    font-size: 3.75vw;
}

사이징은 여전히 ​​뷰포트를 기반으로하지만 본질적으로 컨테이너 크기 자체를 기반으로 설정됩니다.

컨테이너 크기가 동적으로 변경되어야하는 경우 ...

컨테이너 요소의 크기가 @media중단 점 또는 JavaScript 를 통해 백분율 관계를 동적으로 변경 한 경우 텍스트 크기 조정에 대해 동일한 "관계"를 유지하려면 기본 "대상"이 무엇이든 재 계산이 필요합니다.

위의 예제 # 1을 보자. 는 경우 div로 전환되었다 25%중 하나에 의해 폭 @media또는 자바 스크립트, 다음, 동시에이 font-size새로운 계산에 어느 미디어 쿼리 또는 자바 스크립트에 의해 조정해야합니다 5vw * .25 = 1.25. 그러면 텍스트 크기가 원본의 "너비"와 같은 크기로 설정됩니다50% 컨테이너 뷰포트 크기 조정에서 절반으로 줄어들 되지만 이제 자체 백분율 계산의 변경으로 인해 감소되었습니다.

도전

함께 CSS3의 calc()기능을 사용, 그 기능이 작동하지 않는 동적으로 조정하기 어려워 질 것이다 font-size이 시간에 목적. 따라서 너비가 바뀌면 순수한 CSS 3 조정을 수행 할 수 없습니다 calc(). 물론 여백의 너비를 약간만 조정해도 변경 사항을 보증하기에 충분 font-size하지 않으므로 중요하지 않을 수 있습니다.


(뷰포트 비율 길이와 창 크기를 조정하는 Chrome 버그가 있습니다 : code.google.com/p/chromium/issues/detail?id=124331 )
thirtydot

@thirtydot : 불행한 일입니다 (그러나 감사합니다). 버그가 곧 해결되기를 바랍니다. 그러나 한동안 지속 된 것으로 보입니다.
ScottS

20
그러나 큰 대답은 포함 요소에 최대 너비가 있으면 작동하지 않습니다.
Himmators

3
@ 크리스토퍼 놀렌 (KristofferNolgren) : 그것은 내 대답에서 만든 두 가지 점과 관련이 있습니다 : (1) "어떤 방식으로 컨테이너가 크기가 유연하다고 가정"(한 번 '최대 너비'에 도달하면 더 이상 휘지 않으므로 문제가 있습니다. ). (2) 'max-width'에 도달 할 지점을 결정할 수 있다면, 앞서 언급했듯이 @media해당 지점에서 글꼴 크기를 변경하는 중단 점을 설정할 수 있습니다 (필수에 도달 할 때 고정 크기를 부여합니다 max-width) . max-width상황에 맞는 생각 .
ScottS

컨테이너 요소가 미디어 쿼리를 통해 동적으로 변경되는시기를 피할 수 있다고 생각하십니까? 잘 모르겠습니다.
J82

58

SVG를 사용한 솔루션 :

<div style="width: 60px;">  
  <svg width="100%" height="100%" viewBox="0 -200 1000 300"
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <text font-size="300" fill="black">Text</text>
  </svg>
</div>

https://jsfiddle.net/qc8ht5eb/


다음을 사용하여 SVG 및 텍스트 줄 바꿈이있는 솔루션 foreignObject:

<svg viewBox="0 0 100 100">
  <foreignObject width="100%" height="100%">
    <h1>heading</h1>

    lorem ipsum dolor sit amet
  </foreignObject>
</svg> 

https://jsfiddle.net/2rp1q0sy/


1
이 아이디어는 처음에는 멋지게 보입니다. 그러면 <html> 내부의 SVG에서 글꼴을 쉽게 제어 할 수 없다는 것을 알게됩니다. 모바일과 데스크톱에서 글꼴이 다르므로 최종 너비에 영향을줍니다.
Stopi

@Stopi iFrame 솔루션에 대해 어떻게 생각하십니까?
Dantio

10
HTML / CSS에서 SVG 스타일을 완전히 지정할 수 있습니다
gman

1
SVG가 인라인 인 경우 SVG로 CSS 스타일을 지정할 수 있습니다 (img 태그를 사용하지 마십시오).

8
이것은 동적 컨테이너를 기반으로 확장하는 가장 예측하기 쉬운 최고의 솔루션입니다.
JoshuaDavid

35

내 프로젝트 중 하나에서 vw와 vh 사이의 "혼합물"을 사용하여 필요에 따라 글꼴 크기를 조정합니다.

font-size: calc(3vw + 3vh);

나는 이것이 OP의 질문에 대답하지는 않지만 다른 누군가에게 해결책이 될 수 있음을 알고 있습니다.


3
vmin및 / 또는 vmax대신 사용하는 것이 좋습니다 .
sebastian_k

4
크롬 개발 도구이 유효하지 않은 속성 값을 호출
phil294

29

calc(), CSS 단위 및 수학이 포함 된 순수 CSS 솔루션

이것은 OP가 요구하는 것이 아니라 누군가의 하루를 만들 수 있습니다. 이 답변은 숟가락으로 먹기 쉽지 않으며 개발자 측에 대한 연구가 필요합니다.

마침내 calc()다른 장치와 함께 사용하기위한 순수한 CSS 솔루션을 얻었습니다 . 에 대한 식을 풀려면 수식에 대한 기본적인 수학적 이해가 필요합니다 calc().

이 문제를 해결할 때 DOM에서 일부 부모를 채우는 전체 페이지 너비 반응 형 헤더를 가져와야했습니다. 여기에 내 값을 사용하고 자신의 값으로 바꾸겠습니다.

수학에

필요할 것이예요:

  • 일부 뷰포트에서 비율을 잘 조정했습니다. 320 픽셀을 사용하여 높이가 24 픽셀이고 너비가 224 픽셀이므로 비율은 9.333 ... 또는 28/3입니다.
  • 컨테이너 너비, padding: 3em전체 너비 및 전체 너비가100wv - 2 * 3em

X는 컨테이너의 너비이므로 자신의 식으로 바꾸거나 값을 조정하여 전체 페이지 텍스트를 얻습니다. R당신이 가질 비율입니다. 일부 뷰포트의 값을 조정하고 요소 너비와 높이를 검사하고 자신의 값으로 바꾸면 얻을 수 있습니다. 또한 width / heigth;)

x = 100vw - 2 * 3em = 100vw - 6em
r = 224px/24px = 9.333... = 28 / 3

y = x / r
  = (100vw - 6em) / (28 / 3)
  = (100vw - 6em) * 3 / 28
  = (300vw - 18em) / 28
  = (75vw - 4.5rem) / 7

그리고 쾅! 효과가 있었다! 나는 썼다

font-size: calc((75vw - 4.5rem) / 7)

헤더에 맞추면 모든 뷰포트에서 잘 조정됩니다.

그러나 어떻게 작동합니까?

여기에 상수가 필요합니다. 100vw뷰포트의 전체 너비를 의미하며 내 목표는 일부 패딩으로 전체 너비 헤더를 설정하는 것이 었습니다.

비율. 하나의 뷰포트에서 너비와 높이를 가져 와서 재생할 비율을 얻었고 비율을 사용하면 다른 뷰포트 너비에서 높이가 무엇인지 알고 있습니다. 손으로 계산하면 많은 시간이 걸리고 최소한 많은 대역폭이 필요하므로 좋은 답변이 아닙니다.

결론

왜 아무도 이것을 알아 내지 못했는지 궁금해하고 일부 사람들은 이것이 CSS로 어려워하는 것이 불가능하다고 말하고 있습니다. 요소 조정에 JavaScript를 사용하는 것을 좋아하지 않으므로 더 이상 파지 않고 JavaScript 응답을 수락하지 않습니다 (jQuery는 잊어 버립니다). 결국, 이것이 알아 낸 것이 좋으며 이것은 웹 사이트 디자인에서 순수 CSS 구현을위한 한 단계입니다.

나는 텍스트에서 특이한 규칙에 대해 사과하며 영어를 모국어로 사용하지 않으며 스택 오버플로 답변을 작성하는 데 익숙하지 않습니다.

또한 일부 브라우저에는 사악한 스크롤 막대가 있습니다. 예를 들어 Firefox를 사용할 때 100vw스크롤 막대 (콘텐츠가 확장되지 않습니다!) 아래로 확장되는 전체 너비의 뷰포트 를 의미하므로 전체 너비 텍스트를 조심스럽게 여백해야하며 많은 브라우저와 장치에서 테스트해야합니다.


13
이 솔루션은 (1) 글꼴을 알고 있고 (2) 글꼴을 사용자의 장치에서 사용할 수 있으며 (3) 텍스트가 항상 같은 경우에만 작동합니다. 이것은 매우 제한된 유스 케이스입니다.
Andrei Volgin

내 컨테이너가 640px 및 16 : 9 비율로 고정되어 있는지 이해하지 못합니다. 어떤 calcs를 작성해야합니까?
pery mimon

1
컨테이너 너비 x는 640px이고 비율은 r16 : 9입니다. x = 640px, r = 16 / 9, y = x / r = 640px / (16 / 9) = 360px
hegez

참고 : 이것은 실제로 16 : 9 크기의 텍스트가있는 경우에만 작동하며 이상한 상황입니다. 아마도 두 번째로 답을 읽으면 도움이 될 것입니다. 또한 이것은 하나의 라이너에만 적용됩니다.
hegez

당신이 설명하지 않는 정직하게 "일부 뷰포트에서 멋지게 조정 비율을. 나는 비율이 9.333 ... 또는 3분의 28 그래서, 따라서 나는 상위 24 픽셀, 폭 224 개 픽셀을 가지고, 320 개 픽셀을 사용" 내가 비율을 설명하는 제안 조금 더. 비율은 무엇을 나타 냅니까?
3limin4t0r

28

이 문제에는 큰 철학이 있습니다.

가장 쉬운 방법은 본문에 특정 글꼴 크기를 지정하는 것입니다 (10 권장). 다른 모든 요소는 em또는에 글꼴이 있습니다 rem. 그 단위를 이해하기위한 예를 들겠습니다. Em항상 부모와 관련이 있습니다.

body{font-size: 10px;}
.menu{font-size: 2em;} /* That means 2*10 pixels  = 20 pixels */
.menu li{font-size: 1.5em;} /* That means 1.5*20 pixels = 30 pixels */

Rem 항상 몸과 관련이 있습니다.

body{font-size: 10px;}
.menu{font-size: 2rem;} /* That means 2*10 pixels = 20 pixels */
.menu li{font-size: 1.5rem;} /* that means 1.5*10 pixels = 15 pixels */

그런 다음 컨테이너 너비를 기준으로 글꼴 크기를 수정하는 스크립트를 만들 수 있습니다. 그러나 이것은 내가 권장하는 것이 아닙니다. 예를 들어 900 픽셀 너비 컨테이너 p에서는 12 픽셀 글꼴 크기 의 요소가 있다고 가정합니다. 그리고 당신의 생각에 그것은 4 픽셀 크기의 300 픽셀 너비 컨테이너가 될 것입니다. 하한이 있어야합니다.

다른 솔루션은 미디어 쿼리를 사용하여 다른 너비의 글꼴을 설정할 수 있습니다.

그러나 내가 추천하는 솔루션은 그에 도움이되는 JavaScript 라이브러리를 사용하는 것입니다. 그리고 지금까지 찾은 fittext.js .


6
rem유닛은 의미 루트 요소에 상대적 html요소가 아닌 body요소. DOM의 루트 요소는 html태그입니다. developer.mozilla.org/en-US/docs/Web/CSS/length .. rem는 항상 htmlbody 태그가 아닌 루트 요소 인 태그와 관련이 있습니다. 그러나 좋은 대답 :)
Jonathan Marzullo

fittext.js가 작업을 수행하게되었으므로 해당 솔루션을 추천했습니다!
Jacek Dziurdzikowski 2019

FitText가 저의 승자였습니다. 몇 가지 대안을 시도했지만 이것은 가장 단순 해 보였으며 Drupal / Backdrop CMS와 잘 통합되었습니다. github.com/davatron5000/FitText.js
Auxiliary Joel

23

기능은 다음과 같습니다.

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
지금까지 이것이 최고의 솔루션입니다.
wp student

나쁜 관행과 큰 비효율
Jack Giffin

@tntrox 오늘날처럼 비효율적 인 것은 4 년 전보다 훨씬 비효율적이었습니다. 나는 훨씬 더 나은 대안 대신이 답변을 거부합니다. 예, IE 지원을 위해서는 Javascript가 필요합니다. 그러나이 끔찍한 Javascript가 필요하지 않습니다.
Jack Giffin

3
내 무지가 여기에 보이고 있다고 생각합니다. 그러나 왜 위의 끔찍한가?

나는 그것이 끔찍하다고 생각하지 않습니다. 좀 더 읽기 쉽도록 약간의 서식 변경을 권장합니다. 적어도 각 var를 별도의 줄에 넣습니다. return this기능 종료시 필요하지 않을 수 있습니다 . 성능을 위해 onresize를 디 바운스하여 드래그 할 때 다시 그려지지 않을 수도 있습니다. 매우 간단한 코드이므로 누군가가 노력을 기울이지 않고도 개선 된 솔루션을 기반으로 할 수 있습니다.
Mnebuerquo

19

JavaScript 없이이 작업을 수행 할 수있는 방법이 있습니다 !

인라인 SVG 이미지를 사용할 수 있습니다. SVG가 인라인 인 경우 SVG에서 CSS를 사용할 수 있습니다. 이 방법을 사용하면 SVG 이미지가 컨테이너 크기에 응답한다는 것을 기억해야합니다.

다음 솔루션을 사용해보십시오 ...

HTML

<div>
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360.96 358.98" >
      <text>SAVE $500</text>
  </svg>
</div>

CSS

div {
  width: 50%; /* Set your container width */
  height: 50%; /* Set your container height */

}

svg {
  width: 100%;
  height: auto;

}

text {
  transform: translate(40px, 202px);
  font-size: 62px;
  fill: #000;
}

예 : https://jsfiddle.net/k8L4xLLa/32/

더 화려한 무언가를 원하십니까?

SVG 이미지를 사용하면 모양과 정크로 멋진 작업을 수행 할 수 있습니다. 확장 가능한 텍스트에 대한이 위대한 사용 사례를 확인하십시오 ...

https://jsfiddle.net/k8L4xLLa/14/


4
이 솔루션은 vw사이징 이 허용되는 솔루션과 다르지 않습니다 . 텍스트를 변경하면 모든 것이 끝납니다.
N69S

14

이것은 실용적이지는 않지만 div / 페이지의 크기를 읽기 위해 청취 / 루프 (간격)하는 JavaScript가 없어도 글꼴이 부모의 직접적인 기능이되도록하려면 글꼴을 사용하는 방법이 있습니다 . iframe.

iframe 내의 모든 항목은 iframe의 크기를 뷰포트의 크기로 간주합니다. 따라서 트릭은 너비가 텍스트의 최대 너비이고 높이가 최대 높이 * 특정 텍스트의 종횡비와 같은 iframe을 만드는 것입니다.

뷰포트 단위가 텍스트의 부모 단위를 따라갈 수 없다는 한계를 제외하고 (% 크기가 다른 사람처럼 동작 함) 뷰포트 단위는 매우 강력한 도구를 제공합니다. 최소 / 최대 치수를 얻을 수 있음 . 다른 곳에서는 할 수 없습니다-말할 수 없습니다 ...이 div의 높이를 부모의 너비로 만드십시오 * 무언가.

즉, 트릭은 vmin을 사용하고 iframe 크기를 설정하여 높이가 제한 치수 인 경우 [fraction] * 총 높이가 적절한 글꼴 크기이고 너비가 인 경우 [fraction] * 총 너비입니다. 제한 치수. 이것이 높이가 너비와 종횡비의 곱이어야하는 이유입니다.

나의 특별한 예를 들어,

.main iframe{
  position: absolute;
  top: 50%;
  left: 50%;
  width: 100%;
  height: calc(3.5 * 100%);
  background: rgba(0, 0, 0, 0);
  border-style: none;
  transform: translate3d(-50%, -50%, 0);
}

이 방법의 작은 성가심은 iframe의 CSS를 수동으로 설정해야한다는 것입니다. 전체 CSS 파일을 첨부하면 많은 텍스트 영역에 많은 대역폭이 필요합니다. 그래서 내가하는 일은 내 CSS에서 직접 원하는 규칙을 첨부하는 것입니다.

var rule = document.styleSheets[1].rules[4];
var iDoc = document.querySelector('iframe').contentDocument;
iDoc.styleSheets[0].insertRule(rule.cssText);

텍스트 영역에 영향을 줄 CSS 규칙 / 모든 CSS 규칙을 가져 오는 작은 함수를 작성할 수 있습니다.

사이클링 / 리스닝 JavaScript 없이는 다른 방법을 생각할 수 없습니다. 브라우저가 부모 컨테이너의 함수로 규모의 텍스트에 대한 방법을 제공하기위한 진정한 해결책이 될 것 같은 VMIN / VMAX 형 기능을 제공합니다.

JSFiddle : https://jsfiddle.net/0jr7rrgm/3/ (한 번 클릭하면 빨간색 사각형이 마우스에 고정되고 다시 클릭하면 해제 됨)

바이올린의 대부분의 JavaScript는 단지 내 맞춤 클릭 드래그 기능입니다.


@quemeful 우리가 'new''shiny'를 가져 왔을 때 ( drumroll please ...) srcdoc속성 : jsfiddle.net/wauzgob6/3
Jack Giffin

9

사용 vw, em및 공동. 확실히 작동하지만 IMO는 미세 조정을 위해 항상 인간의 손길이 필요합니다.

다음 은 인간의 터치를 자동화하려는 @ tnt-rox ' 답변 을 기반으로 작성한 스크립트입니다 .

$('#controller').click(function(){
    $('h2').each(function(){
        var
            $el = $(this),
            max = $el.get(0),
            el = null
        ;
        max =
            max
            ? max.offsetWidth
            : 320
        ;
        $el.css({
            'font-size': '1em',
            'display': 'inline',
        });
        el = $el.get(0);

        el.get_float = function(){
            var
                fs = 0
            ;
            if (this.style && this.style.fontSize) {
                fs = parseFloat(this.style.fontSize.replace(/([\d\.]+)em/g, '$1'));
            }
            return fs;
        };

        el.bigger = function(){
            this.style.fontSize = (this.get_float() + 0.1) + 'em';
        };

        while (el.offsetWidth < max) {
            el.bigger();
        }

        // Finishing touch.
        $el.css({
            'font-size': ((el.get_float() -0.1) +'em'),
            'line-height': 'normal',
            'display': '',
        });
    });  // end of (each)
});    // end of (font scaling test)
div {
  width: 50%;
  background-color: tomato;
  font-family: 'Arial';
}

h2 {
  white-space: nowrap;
}

h2:nth-child(2) {
  font-style: italic;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input type="button" id="controller" value="Apply" />
<div>
  <h2>Lorem ipsum dolor</h2>
  <h2>Test String</h2>
  <h2>Sweet Concatenation</h2>
  <h2>Font Scaling</h2>
</div>

기본적으로 글꼴 크기를 줄인 1em다음 최대 너비에 도달 할 때까지 0.1 씩 증가하기 시작합니다.

JSFiddle


1
+1 ems사람의 손길과 수직 리듬이 필요 하다는 것을 인정하는 사람 에게는 일종의 마법이 아닙니다.
serraosays

7

100 %는 기본 글꼴 크기에 상대적이며, 설정하지 않은 경우 브라우저의 사용자 에이전트 기본값이됩니다.

효과를 얻으려면 JavaScript 코드를 사용하여 창 크기를 기준으로 기본 글꼴 크기를 조정하십시오.


7

CSS 내부에서 맨 아래에 추가하여 디자인이 깨지기 시작할 때마다 320 픽셀 너비를 변경하십시오.

    @media only screen and (max-width: 320px) {

        body { font-size: 1em; }

    }

그런 다음 원하는대로 "px"또는 "em"으로 글꼴 크기를 지정하십시오.


7

jQuery 기반의 자체 솔루션은 컨테이너의 높이가 커질 때까지 글꼴 크기를 점차적으로 증가시켜 작동합니다 (줄 바꿈이 있음).

꽤 간단하지만 상당히 잘 작동하며 사용하기가 매우 쉽습니다. 사용되는 글꼴에 대해 아무것도 몰라도 브라우저에서 모든 것을 처리합니다.

http://jsfiddle.net/tubededentifrice/u5y15d0L/2/ 에서 재생할 수 있습니다.

마술은 여기서 일어난다 :

var setMaxTextSize=function(jElement) {
    // Get and set the font size into data for reuse upon resize
    var fontSize=parseInt(jElement.data(quickFitFontSizeData)) || parseInt(jElement.css("font-size"));
    jElement.data(quickFitFontSizeData, fontSize);

    // Gradually increase font size until the element gets a big increase in height (i.e. line break)
    var i = 0;
    var previousHeight;
    do
    {
        previousHeight=jElement.height();
        jElement.css("font-size", "" + (++fontSize) + "px");
    }
    while(i++ < 300 && jElement.height()-previousHeight < fontSize/2)

    // Finally, go back before the increase in height and set the element as resized by adding quickFitSetClass
    fontSize -= 1;
    jElement.addClass(quickFitSetClass).css("font-size", "" + fontSize + "px");

    return fontSize;
};

1
이 스크립트는 모든 크기 조정 이벤트 및 / 또는 방향 변경에서 실행되므로 이것을 사용하지 않는 것이 좋습니다. 자바 스크립트 기반 솔루션을 사용하는 대신 위에 주어진 CSS 기반 솔루션을 찾으십시오.
필라투스

1
크기 및 방향 변경은 "희귀 한"이벤트이며 여기에는 성능 문제가 없습니다. 원하는 경우 이벤트에 바인딩하지 마십시오 (예 : 응답하지 않는 웹 사이트의 경우 컨테이너의 크기를 조정하지 않은 경우). CSS 솔루션은이 솔루션과 마찬가지로 (글꼴 너비와 같은) 생각하지 않고 모든 경우에 작동하지 않습니다.
Vincent

귀하의 답변을 jQuery 함수로 래핑했습니다. 최대 허용 높이, 최소 및 최대 글꼴 크기를받습니다. jsfiddle.net/oriadam/qzsy760k
oriadam

6

이 웹 구성 요소 는 내부 텍스트 너비가 컨테이너 너비와 일치하도록 글꼴 크기를 변경합니다. 데모를 확인하십시오 .

다음과 같이 사용할 수 있습니다.

<full-width-text>Lorem Ipsum</full-width-text>


6

글꼴 크기 대신 CSS 변환을 사용하여 간단한 크기 조정 기능을 준비했습니다. 컨테이너 내부에서 사용할 수 있으며 미디어 쿼리 등을 설정할 필요가 없습니다. :)

블로그 게시물 : 전폭 CSS 및 JS 확장 가능 헤더

코드:

function scaleHeader() {
  var scalable = document.querySelectorAll('.scale--js');
  var margin = 10;
  for (var i = 0; i < scalable.length; i++) {
    var scalableContainer = scalable[i].parentNode;
    scalable[i].style.transform = 'scale(1)';
    var scalableContainerWidth = scalableContainer.offsetWidth - margin;
    var scalableWidth = scalable[i].offsetWidth;
    scalable[i].style.transform = 'scale(' + scalableContainerWidth / scalableWidth + ')';
    scalableContainer.style.height = scalable[i].getBoundingClientRect().height + 'px';
  }
}

실무 데모 : https://codepen.io/maciejkorsan/pen/BWLryj


OP가 CSS 솔루션을 찾고 있다고 생각합니다.
m02ph3u5

5

CSS 변수 사용

아직 CSS 변수에 대해 언급 한 사람이 없으며이 방법이 가장 효과적입니다.

페이지에 모바일 사용자 화면 너비의 100 %이지만 max-width800px의 열이 있다고 가정하면 데스크톱에는 열의 양쪽에 약간의 공간이 있습니다. 이것을 페이지 상단에 놓으십시오.

<script> document.documentElement.style.setProperty('--column-width', Math.min(window.innerWidth, 800)+'px'); </script>

이제 내장 vw단위 대신 해당 변수를 사용 하여 글꼴 크기를 설정할 수 있습니다. 예 :

p {
  font-size: calc( var(--column-width) / 100 );
}

그것은 아니다 순수 CSS 방식,하지만 아주 가까이 있습니다.



5

내 문제는 비슷했지만 제목 내에서 텍스트 크기를 조정하는 것과 관련이 있습니다. Fit Font를 시도했지만 텍스트 흐름과 마찬가지로 약간 다른 문제를 해결했기 때문에 압축기를 전환하여 결과를 얻어야했습니다.

나는 당신이 가정, 컨테이너에 맞게 글꼴 크기를 감소 내 자신의 작은 플러그인 썼다 그래서 overflow: hiddenwhite-space: nowrap그래서 심지어는 최소 글꼴을 줄이는 경우 전체 제목을 보여주는 허용하지 않습니다를, 단지 그것을 보여줄 수있는 차단.

(function($) {

  // Reduces the size of text in the element to fit the parent.
  $.fn.reduceTextSize = function(options) {
    options = $.extend({
      minFontSize: 10
    }, options);

    function checkWidth(em) {
      var $em = $(em);
      var oldPosition = $em.css('position');
      $em.css('position', 'absolute');
      var width = $em.width();
      $em.css('position', oldPosition);
      return width;
    }

    return this.each(function(){
      var $this = $(this);
      var $parent = $this.parent();
      var prevFontSize;
      while (checkWidth($this) > $parent.width()) {
        var currentFontSize = parseInt($this.css('font-size').replace('px', ''));
        // Stop looping if min font size reached, or font size did not change last iteration.
        if (isNaN(currentFontSize) || currentFontSize <= options.minFontSize ||
            prevFontSize && prevFontSize == currentFontSize) {
          break;
        }
        prevFontSize = currentFontSize;
        $this.css('font-size', (currentFontSize - 1) + 'px');
      }
    });
  };
})(jQuery);

5

예술적으로 문자 수에 관계없이 동일한 너비 내에서 두 줄 이상의 텍스트 줄을 맞추려면 멋진 옵션이 있습니다.

동적 텍스트를 찾는 것이 가장 좋습니다. 따라서 입력 한 텍스트가 무엇이든 멋진 디스플레이가됩니다.

우리가 어떻게 접근 할 수 있는지 봅시다.

var els     = document.querySelectorAll(".divtext"),
refWidth    = els[0].clientWidth,
refFontSize = parseFloat(window.getComputedStyle(els[0],null)
                               .getPropertyValue("font-size"));

els.forEach((el,i) => el.style.fontSize = refFontSize * refWidth / els[i].clientWidth + "px")
#container {
  display: inline-block;
  background-color: black;
  padding: 0.6vw 1.2vw;
}
.divtext {
  display: table;
  color: white;
  font-family: impact;
  font-size: 4.5vw;
}
<div id="container">
  <div class="divtext">THIS IS JUST AN</div>
  <div class="divtext">EXAMPLE</div>
  <div class="divtext">TO SHOW YOU WHAT</div>
  <div class="divtext">YOU WANT</div>
</div>

우리가하는 일은 첫 번째 줄 의 너비 ( els[0].clientWidth)와 글꼴 크기 ( parseFloat(window.getComputedStyle(els[0],null).getPropertyValue("font-size")))를 참조로 얻은 다음 그에 따라 후속 줄의 글꼴 크기를 계산하는 것입니다.


4

뷰포트 크기는이 문제의 해결책이 아니므로 fitText 플러그인을 사용해보십시오 .

라이브러리를 추가하십시오.

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>

텍스트 계수를 설정하여 글꼴 크기를 올바르게 변경하십시오.

$("#text_div").fitText(0.8);

텍스트의 최대 값과 최소값을 설정할 수 있습니다.

$("#text_div").fitText(0.8, { minFontSize: '12px', maxFontSize: '36px' });

이것은 큰 표시 텍스트 에만 유용 하며 단락에는 권장되지 않습니다.
Shiv

3

내 코드를 살펴보십시오. 그것은 거기 font size smallerfit무엇이든지합니다.

그러나 이것이 좋은 사용자 경험으로 이어지지는 않는다고 생각합니다.

var containerWidth = $("#ui-id-2").width();
var items = $(".quickSearchAutocomplete .ui-menu-item");
var fontSize = 16;

items.each(function(){
    // Displaying a value depends sometimes on your case. You may make it block or inline-table instead of inline-block or whatever value that make the div take overflow width.
    $(this).css({"whiteSpace": "nowrap", "display": "inline-block"});
    while ($(this).width() > containerWidth){
         console.log("$(this).width()" + $(this).width() + "containerWidth" + containerWidth)
         $(this).css("font-size", fontSize -= 0.5);
    }
});

결과


2

JavaScript 대체 (또는 유일한 솔루션) 옵션 인 jQuery Scalem 플러그인 을 사용하면 reference옵션 을 전달하여 상위 요소 (컨테이너)를 기준으로 확장 할 수 있습니다 .


2

누군가에게 도움이되는 경우이 스레드의 대부분의 솔루션은 텍스트를 여러 줄로 감싸서 e 형식으로 만들었습니다.

그러나 나는 이것을 찾았고 효과가 있었다.

https://github.com/chunksnbits/jquery-quickfit

사용법 예 :

$('.someText').quickfit({max:50,tolerance:.4})


2

항상 당신의 요소를 이 속성을 가진 가 .

자바 스크립트 : element.style.fontSize = "100%";

또는

CSS : style = "font-size: 100%;"

전체 화면으로 이동할 때 이미 스케일 변수가 계산되어 있어야합니다 (scale> 1 또는 scale = 1). 그런 다음 전체 화면에서 :

document.body.style.fontSize = (scale * 100) + "%";

작은 코드로 훌륭하게 작동합니다.


2

동적 텍스트의 경우이 플러그인은 매우 유용합니다.

http://freqdec.github.io/slabText/

CSS를 추가하기 만하면됩니다.

.slabtexted .slabtext
{
    display: -moz-inline-box;
    display: inline-block;
    white-space: nowrap;
}
.slabtextinactive .slabtext
{
    display: inline;
    white-space: normal;
    font-size: 1em !important;
    letter-spacing: inherit !important;
    word-spacing: inherit !important;
    *letter-spacing: normal !important;
    *word-spacing: normal !important;
}
.slabtextdone .slabtext
{
    display: block;
}

그리고 스크립트 :

$('#mydiv').slabText();

2

이것은 나를 위해 일했다 :

`font-size : 10px` 설정에서 얻은 너비 / 높이를 기준으로 글꼴 크기를 근사하려고합니다. 기본적으로 아이디어는 "글꼴 크기 : 10px"로 너비가 20 픽셀이고 높이가 11 픽셀 인 경우 너비가 50 픽셀, 높이는 30 픽셀 인 컨테이너를 계산하는 데 최대 글꼴 크기는 얼마입니까? "

답은 이중 비례 시스템입니다.

{20 : 10 = 50 : X, 11 : 10 = 30 : Y} = {X = (10 * 50) / 20, Y = (10 * 30) / 11}

이제 X는 너비와 일치하는 글꼴 크기이고 Y는 높이와 일치하는 글꼴 크기입니다. 가장 작은 가치를 취하다

function getMaxFontSizeApprox(el){
    var fontSize = 10;
    var p = el.parentNode;

    var parent_h = p.offsetHeight ? p.offsetHeight : p.style.pixelHeight;
    if(!parent_h)
        parent_h = 0;

    var parent_w = p.offsetHeight ? p.offsetWidth : p.style.pixelWidth;
    if(!parent_w)
        parent_w = 0;

    el.style.fontSize = fontSize + "px";

    var el_h = el.offsetHeight ? el.offsetHeight : el.style.pixelHeight;
    if(!el_h)
        el_h = 0;

    var el_w = el.offsetHeight ? el.offsetWidth : el.style.pixelWidth;
    if(!el_w)
        el_w = 0;

    // 0.5 is the error on the measure that JavaScript does
    // if the real measure had been 12.49 px => JavaScript would have said 12px
    // so we think about the worst case when could have, we add 0.5 to 
    // compensate the round error
    var fs1 = (fontSize*(parent_w + 0.5))/(el_w + 0.5);
    var fs2 = (fontSize*(parent_h) + 0.5)/(el_h + 0.5);

    fontSize = Math.floor(Math.min(fs1,fs2));
    el.style.fontSize = fontSize + "px";
    return fontSize;
}

주의 : 함수의 인수는 span 요소이거나 부모보다 작은 요소 여야합니다. 그렇지 않으면 자식과 부모의 너비 / 높이가 같은 함수가 실패하면 실패합니다.



1

글꼴 크기를 창이 아닌 컨테이너에 맞추려면 resizeFont()이 질문에서 공유 한 기능 (대부분은 이미 여기에 링크 된 다른 답변의 조합)을 참조하십시오. 를 사용하여 트리거됩니다 window.addEventListener('resize', resizeFont);.

바닐라 자바 ​​스크립트 : 컨테이너에 맞게 글꼴 크기 조정

자바 스크립트 :

function resizeFont() {
  var elements  = document.getElementsByClassName('resize');
  console.log(elements);
  if (elements.length < 0) {
    return;
  }
  _len = elements.length;
  for (_i = 0; _i < _len; _i++) {
    var el = elements[_i];
    el.style.fontSize = "100%";
    for (var size = 100; el.scrollHeight > el.clientHeight; size -= 10) {
      el.style.fontSize = size + '%';
    }
  }
}

vw / vh를 대체로 사용할 수 있으므로 동적으로 em또는rem JavaScript를 사용하여 단위를 하여 JavaScript가 비활성화 된 경우 글꼴 크기를 창으로 조정합니다.

.resize크기를 조정할 텍스트가 포함 된 모든 요소에 클래스를 적용하십시오 .

윈도우 크기 조정 이벤트 리스너를 추가하기 전에 기능을 트리거하십시오. 그런 다음 컨테이너에 맞지 않는 텍스트는 페이지가로드 될 때뿐만 아니라 크기가 조정 될 때 축소됩니다.

참고 : 기본은 font-size로 설정해야합니다 em, rem또는 %적절한 결과를 얻을 수 있습니다.


1

HTML

<div style="height:100px; width:200px;">
  <div id='qwe'>
    test
  </div>
</div>

글꼴 크기를 최대화하기위한 JavaScript 코드 :

var fontSize, maxHeight, maxWidth, textElement, parentElement;
textElement = document.getElementById('qwe');
parentElement = textElement.parentElement;    
maxHeight = parentElement.clientHeight;
maxWidth = parentElement.clientWidth;
fontSize = maxHeight;
var minFS = 3, maxFS = fontSize;
while (fontSize != minFS) {
  textElement.style.fontSize = `${fontSize}px`;
  if (textElement.offsetHeight < maxHeight && textElement.offsetWidth <= maxWidth) {
    minFS = fontSize;
  } else{
    maxFS = fontSize;
  }
  fontSize = Math.floor((minFS + maxFS)/2);
}
textElement.style.fontSize = `${minFS}px`;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.