CSS MIN () 모든 것 – Smashing Magazine

CSS MIN () 모든 것 – Smashing Magazine

Chris Coyier가 8 월에 다시 출판 한이 게시물을 보셨습니까? 그는 CSS 컨테이너 쿼리 장치를 실험하여 모든 숫자 값에 대해 모든 단일 숫자 값에 대해 사용하여 함께 사용했습니다. 그리고 결과는 실제로 그렇게 나쁘지 않았습니다.

펜을 참조하십시오 [Container Units for All Units [forked]](Chris Coyier에 의해.

모든 장치의 펜 컨테이너 장치를 참조하십시오 [forked] Chris Coyier.

내가 이것에 대해 흥미로운 것은 그것이 크기의 복잡성을 보여주는 방법입니다. 우리는 CSS의 절대 및 상대 단위로 제한되어 있으므로 특정 크기로 갇혀 있습니다 (예 : px) 또는 다른 요소에 선언 된 크기를 기준으로 크기를 계산합니다 (예 : %,,, em,,, rem,,, vw,,, vh등). 둘 다 타협과 함께 제공되므로 사물에 대한 “올바른”방법 (요소의 맥락에 관한 것)이있는 것과는 다릅니다. 어떤 방향 으로든 크게 기대어는 그것을 치료하지 않습니다.

나는 내 자신의 실험을 시도 할 것이라고 생각했지만 CSS와 함께 min() 컨테이너 쿼리 장치 대신 기능. 왜? 우선, 우리는 기능을 제공 할 수 있습니다 우리가 원하는 모든 유형의 길이 단위이는 한 유형의 장치에서 작업하는 것보다 접근 방식을 조금 더 유연하게 만듭니다. 그러나 내가 이것을하고 싶었던 진짜 이유는 무엇보다 개인적인 관심입니다.

데모

나는 당신이 끝을 기다리게하지 않을 것입니다. min() 실험이 진행되었습니다 :

우리는 세부 사항을 살펴본 후에 더 이야기 할 것입니다.

조금 min()

그만큼 min() 함수는 두 가지 값을 취하고 가장 작은 값을 적용합니다. 예를 들어, 우리는 요소가 넓기를 원한다고 말할 수 있습니다. 50% 컨테이너의 모든 컨테이너 50% ~이다 보다 큰 말보다 200px대신 너비를 막으십시오.

펜을 참조하십시오 [[forked]](Geoff Graham에 의해.

펜을 참조하십시오 [forked] Geoff Graham에 의해.

그래서, min() 컨테이너 쿼리 장치와 같은 컨테이너 쿼리 장치는 컨테이너에 사용 가능한 공간이 얼마나 많이 있는지 알고 있다는 점에서 비슷합니다. 그러나 그것은 그것에서 다릅니다 min() 최종 값을 계산하기 위해 컨테이너 치수를 쿼리하지 않습니다. 우리는 그것을 두 개의 허용 가능한 길이를 제공하며, 컨텍스트에 가장 적합한 것이 가장 잘 결정됩니다. 그것은 만듭니다 min() (그리고 max() 그 문제에 대해) 뷰포트 크기에 적응하는 반응 형 레이아웃에 유용한 도구. 조건부 논리를 사용하여 “최상의”일치를 결정하므로 CSS 미디어 쿼리에 도달 할 필요없이 레이아웃을 조정하는 데 도움이 될 수 있습니다.

.element {
  width: min(200px, 50%);
}

/* Close to this: */
.element {
  width: 200px;

  @media (min-width: 600px) {
    width: 50%;
  }
}

차이 min() 그리고 @media 이 예에서는 브라우저에 요소 너비를 50% 구체적으로 중단 점 ~의 600px. 와 함께 min()사용 가능한 공간의 양이 변경되면 뷰포트 크기가 무엇이든간에 자동으로 전환합니다.

내가 사용할 때 min()상황에 따라 현명한 결정을 내릴 수있는 능력이 있다고 생각합니다. 사용되는 값을 결정하기 위해 생각이나 계산을 할 필요가 없습니다. 그러나 사용 min() CSS 장치만으로는 충분하지 않습니다. 예를 들어, 상대 단위는 절대 단위보다 응답성에 더 잘 작동합니다. 당신은 생각조차 할 수도 있습니다 min() 설정 a 최고 값은 첫 번째 값보다 낮지 않고 두 번째 값으로도 떨어진다는 점에서 값.

앞에서 우리는 어떤 유형의 단위를 사용할 수 있다고 언급했습니다. min(). Chris와 같은 접근 방식을 취하고 유형의 유형에 크게 의존하여 방법을 확인합시다. min() 반응 형 레이아웃에 독점적으로 사용될 때 동작합니다. 구체적으로, 우리는 우리는 사용할 것이다 뷰포트 장치 그들은 뷰포트의 크기와 직접적이므로.

이제 Viewport 장치의 다양한 맛이 있습니다. 우리는 뷰포트의 너비를 사용할 수 있습니다 (vw) 및 높이 (vh). 우리는 또한 있습니다 vmin 그리고 vmax 요소의 너비와 높이를 평가하고 더 작은 것을 적용한다는 점에서 약간 더 지능적인 단위 (vmin) 또는 더 큰 (vmax둘 중). 그래서 우리가 선언한다면 100vmax 요소에, 그 요소는입니다 500px 넓은 250px 키가 큰 장치는 계산됩니다 500px.

그것이 내가이 실험에 접근하는 방법입니다. 우리가 사용하기 만하면 미디어 쿼리를 피하면 어떻게됩니까? min() 반응 형 레이아웃을 설정하고 뷰포트 장치에 기대어이를 수행하려면? 우리는 한 번에 한 조각 씩 가져갈 것입니다.

글꼴 크기

반응 형 유형에는 다양한 접근 방식이 있습니다. 미디어 쿼리는 빠르게“구식”방법이되고 있습니다.

p { font-size: 1.1rem; }

@media (min-width: 1200px) {
  p { font-size: 1.2rem; }
}

@media (max-width: 350px) {
  p { font-size: 0.9rem; }
}

물론 이것은 작동하지만 사용자가 4K 모니터를 사용하면 어떻게됩니까? 아니면 접을 수있는 전화? 다른 시도되고 진정한 접근법이 있습니다. 사실은, clamp() 일반적인 이동입니다. 그러나 우리는 올인을 기대하고 있습니다 min(). 이런 일이 발생하면 한 줄의 코드만으로도 모든 미디어 쿼리를 닦아내어 코드를 크게 줄이는 데 필요한 모든 것입니다.

p { font-size: min(6vmin, calc(1rem + 0.23vmax)); }

그 가치를 안내해 줄게 …

  1. 6vmin 기본적으로 브라우저 너비 또는 높이의 6%이며 가장 작은 것 중 어느 것보다 적습니다. 이를 통해 글꼴 크기가 작은 상황에 필요한만큼 줄어들 수 있습니다.
  2. 을 위한 calc(1rem + 0.23vmax),,, 1rem 기본 글꼴 크기입니다 0.23vmax 뷰포트 너비 또는 높이의 작은 부분은 가장 큰 것입니다.
  3. 그만큼 calc() 함수는이 두 값을 함께 추가합니다. 부터 0.23vmax 뷰포트 에지가 가장 큰 뷰포트 에지에 따라 다르게 평가됩니다. 두 인수 사이의 글꼴 크기를 확장하는 데 중요합니다. 뷰포트 크기가 증가함에 따라 일을 날려 버리는 대신 점차적으로 한 방향 또는 다른 방식으로 스케일링하는 무언가로 조정했습니다.
  4. 마지막으로, min() 현재 화면 크기의 글꼴 크기에 적합한 가장 작은 값을 반환합니다.

그리고 얼마나 유연한 지 말하기 min() 접근 방식은 텍스트가 얼마나 멀리 자라는 지 제한 할 수 있다는 것입니다. 예를 들어,이를 최대로 캡처 할 수 있습니다 font-size 동일합니다 2rem 세 번째 함수 매개 변수 :

p { font-size: min(6vmin, calc(1rem + 0.23vmax), 2rem); }

이것은은 총알 전술이 아닙니다. 아마도 단락과 같은 신체 텍스트에 가장 잘 사용 된 것 같습니다. 우리는 제목을위한 스커지를 조정하고 싶을 수도 있습니다. :

h1 { font-size: min(7.5vmin, calc(2rem + 1.2vmax)); }

우리는 최소 크기를 증가 시켰습니다 6vmin 에게 7.5vmin 뷰포트 크기에서 신체 텍스트보다 더 크게 유지되도록합니다. 또한 calc()기본 크기는 이제입니다 2rem기본 UA 스타일보다 작습니다 . We’re using 1.2vmax 이번에는 승수로서, 즉, 신체 텍스트보다 더 많이 자라며, 이는 더 작은 값을 곱합니다. .023vmax.

이것은 나를 위해 작동합니다. 항상 이러한 값을 조정하고 사용하기에 가장 적합한 것이 확인할 수 있습니다. 어떤 경우이든 font-size 이 실험은 완전히 유동적이며 min() 내 자기 부과 제약을 준수하는 기능.

마진과 패딩

간격은 레이아웃의 큰 부분이며 반응 적이든 아니든. 우리는 필요합니다 margin 그리고 padding 다른 요소들과 함께 요소를 올바르게 배치하고 상자 안팎에서 호흡 공간을 제공합니다.

우리는 함께 갈 것입니다 min() 이것도. 우리는 픽셀과 같은 절대 단위를 사용할 수 있지만 정확히 반응하지는 않습니다.

min() 상대와 절대 단위를 결합하여 더 효과적입니다. 쌍을하자 vmin ~와 함께 px 이번에 :

div { margin: min(10vmin, 30px); }

10vmin 보다 작을 것입니다 30px 작은 뷰포트에서 볼 때. 그렇기 때문에 이번에는 여백이 동적으로 줄어들 수 있습니다. 뷰포트 크기가 증가함에 따라 10vmin 초과 30px,,, min() 값을 캡처합니다 30px그보다 더 높지 않습니다.

내가 도달하지 않았다는 것을 알았습니다 calc() 이번에는. 컨테이너 나 요소 사이의 간격이 일반적으로 더 큰 화면에서 어색해 보이기 때문에 마진은 실제로 화면 크기로 무기한으로 성장할 필요가 없습니다. 이 개념은 패딩에도 매우 효과적이지만 우리는 거기에 갈 필요가 없습니다. 대신, 단일 장치, 바람직하게는 em요소와 관련이 있으므로 font-size. 우리는 본질적으로 그 일을 “통과”할 수 있습니다 min() 그 일을하고 있습니다 font-sizemargin 그리고 padding 그로 인해 속성.

.card-info {
  font-size: min(6vmin, calc(1rem + 0.12vmax));
  padding: 1.2em;
}

이제 패딩 스케일 font-size이에 의해 구동됩니다 min().

너비

환경 width 반응 형 디자인이 복잡 할 필요는 없습니다. 우리는 단순히 단일 백분율 또는 뷰포트 단위 값을 사용하여 사용하려는 수평 공간의 양을 지정할 수 있으며 그에 따라 요소가 조정됩니다. 그러나 컨테이너 쿼리 장치는이 실험 이외의 행복한 길이 될 수 있습니다.

하지만 우리는 min() 끝까지!

min() 요소가 변경에 얼마나 응답하는지에 대한 제약 조건을 설정할 때 유용합니다. 상한을 설정할 수 있습니다 650px 그리고 계산 된 폭이 더 커지려면 요소가 전체 너비로 정착하도록하십시오. 100%:

.container { width: min(100%, 650px); }

텍스트 너비로 상황이 흥미로워집니다. 텍스트 상자의 너비가 너무 길면 텍스트를 읽는 것이 불편 해집니다. 최적의 읽기 경험에 가장 적합한 텍스트 라인 당 얼마나 많은 문자 수에 대한 경쟁 이론이 있습니다. 논쟁을 위해 숫자는 50-75 자 사이 여야한다고 가정 해 봅시다. 다시 말해, 우리는 75 자 이하의 문자를 한 줄에 포장해야하며, 우리는 그렇게 할 수 있습니다. ch 단위는 0 사용중인 글꼴에 대한 캐릭터의 크기.

p {
  width: min(100%, 75ch);
}

이 코드는 기본적으로 다음과 같이 말합니다. 필요에 따라 넓지 만 75 자 미만이 아닙니다.

크기 조정 레시피 min()

시간이 지남에 따라 많은 값을 조정하고 수정하면서, 나는 다른 속성을 반응 적으로 스타일링하는 데 잘 작동하는 사전 정의 된 값 목록을 작성했습니다.

:root {
  --font-size-6x: min(7.5vmin, calc(2rem + 1.2vmax));
  --font-size-5x: min(6.5vmin, calc(1.1rem + 1.2vmax));
  --font-size-4x: min(4vmin, calc(0.8rem + 1.2vmax));
  --font-size-3x: min(6vmin, calc(1rem + 0.12vmax));
  --font-size-2x: min(4vmin, calc(0.85rem + 0.12vmax));
  --font-size-1x: min(2vmin, calc(0.65rem + 0.12vmax));
  --width-2x: min(100vw, 1300px);
  --width-1x: min(100%, 1200px);
  --gap-3x: min(5vmin, 1.5rem);
  --gap-2x: min(4.5vmin, 1rem);
  --size-10x: min(15vmin, 5.5rem);
  --size-9x: min(10vmin, 5rem);
  --size-8x: min(10vmin, 4rem);
  --size-7x: min(10vmin, 3rem);
  --size-6x: min(8.5vmin, 2.5rem);
  --size-5x: min(8vmin, 2rem);
  --size-4x: min(8vmin, 1.5rem);
  --size-3x: min(7vmin, 1rem);
  --size-2x: min(5vmin, 1rem);
  --size-1x: min(2.5vmin, 0.5rem);
}

이것은 주어진 상황에서 무엇을 도달 해야할지 알 수 있기 때문에 실험에 접근하는 방법입니다.

h1 { font-size: var(--font-size-6x); }

.container {
  width: var(--width-2x);
  margin: var(--size-2x);
}

.card-grid { gap: var(--gap-3x); }

우리는 간다! 우리는 단일 미디어 쿼리없이 모두 단일 미디어 쿼리없이 반응이 좋고 넓지 않는 컨테이너, 반응이 좋지 않은 컨테이너, 동적 간격이있는 그리드를 확장하는 제목을 가지고 있습니다. 그만큼 --size- 변수 목록에 선언 된 속성은 스케일링 (예 : 마진, 패딩 등)이 필요한 속성에 사용할 수 있기 때문에 가장 다재다능합니다.

마지막 결과

결과에 대한 비디오를 공유했지만 여기에 데모 링크가 있습니다.

펜을 참조하십시오 [min() website [forked]](보이오에 의해.

Pen Min () 웹 사이트를 참조하십시오 [forked] 보이오.

그렇습니다 min() 반응을위한 최종적으로 최종적으로? 절대적으로 아닙니다. 컨테이너 쿼리 장치로 구성된 다이어트도 마찬가지입니다. 내 말은, 우리가 이와 같이 전체 웹 페이지를 확장 할 수 있다는 것은 멋지지만 웹은 결코 한 가지 크기의 비니가 아닙니다.

무엇이든, 나는 이것과 Chris가 Demoed가 웹 디자인에 대한 독단적 접근에 대한 경고 전체적으로 반응 형 디자인에 독특하지는 않습니다. 길이 단위 및 기능을 포함한 CSS 기능은 더 큰 가상 도구 쉐드의 도구입니다. 하나의 기능이나 기술로 너무 아늑하지 않고 작업을위한 더 나은 도구를 찾을 수 있기 때문에 창고를 탐색하십시오.

스매싱 편집
(GG, YK)

출처 참조

Post Comment

당신은 놓쳤을 수도 있습니다