컨텐츠가 그리드 항목을 확장하지 못하도록 방지


153

TL; DR :table-layout: fixed CSS 그리드 와 같은 것이 있습니까?


나는 몇 달 동안 큰 4x3 격자가있는 연도 달력을 만들려고 시도했으며 그 안에는 7x6 격자가 중첩되었습니다.

달력은 페이지를 채워야하므로 연도 그리드 컨테이너의 너비와 높이가 각각 100 %가됩니다.

.year-grid {
  width: 100%;
  height: 100%;

  display: grid;
  grid-template: repeat(3, 1fr) / repeat(4, 1fr);
}

.month-grid {
  display: grid;
  grid-template: repeat(6, 1fr) / repeat(7, 1fr);
}

실제 예는 다음과 같습니다. https://codepen.io/loilo/full/ryXLpO/

간단히하기 위해, 그 펜에 매달 31 일이 있으며 월요일에 시작됩니다.

또한 문제를 설명하기 위해 엄청나게 작은 글꼴 크기를 선택했습니다.

그리드 항목 (= 일 셀)은 페이지에 수백 개가 있으므로 상당히 압축되어 있습니다. 일 번호 레이블이 너무 커지면 (왼쪽 상단의 버튼을 사용하여 펜의 글꼴 크기로 자유롭게 놀아보십시오) 격자 크기가 커지고 페이지의 본문 크기를 초과합니다.

이 행동을 막을 방법이 있습니까?

나는 처음에 연도 격자를 너비와 높이가 100 %로 선언하여 시작해야 할 시점 일지 모르지만 그 필요에 맞는 격자 관련 CSS 속성을 찾을 수 없었습니다.

면책 조항 : CSS Grid Layout을 사용하지 않고 캘린더의 스타일을 지정하는 쉬운 방법이 있다는 것을 알고 있습니다. 그러나이 질문은 구체적인 예를 해결하는 것보다 주제에 대한 일반적인 지식에 관한 것입니다.


대신에 무슨 일이 일어나고 싶습니까? 각 셀의 글꼴은 크기에 관계없이 그리드 셀 크기를 늘리지 않습니까?
Michael Coker

1
바로 그거죠. 기본적으로 그리드 항목의 크기를 분수 대신 백분율 값으로 설정하면 더 편리한 방법이 발생합니다.
Loilo

기본적으로 표 레이아웃의 그리드 레이아웃 버전을 찾고 있습니다. fixed ( codepen.io/loilo/pen/dvxpvq?editors=1100 참조 )
Loilo

7
이것은 전체 CSS 그리드 사양에서 가장 큰 고통입니다. 그리드 영역이 부모 그리드 컨테이너의 크기를 벗어날 수없는 설정이어야합니다! 그대로, 깊게 중첩 된 그리드 구조의 악몽입니다.
Lonnie Best

답변:


263

기본적으로 모눈 항목은 내용의 크기보다 작을 수 없습니다.

격자 항목의 초기 크기는 min-width: automin-height: auto입니다.

당신은에 그리드 항목을 설정하여이 동작을 무시할 수 있습니다 min-width: 0, min-height: 0또는 overflow이외의 값 visible.

사양에서 :

6.6. 그리드 항목의 자동 최소 크기

모눈 항목에보다 합리적인 기본 최소 크기를 제공하기 위해이 사양에서는 / auto값이 지정된 축의 자동 최소 크기를 그리드 항목에 적용하는 것으로 정의 합니다. (이 효과는 플렉스 항목에 부과 된 자동 최소 크기와 유사합니다.)min-widthmin-heightoverflowvisible

다음은 플렉스 항목에 대한 자세한 설명이지만 그리드 항목에도 적용됩니다.

이 포스트는 또한 중첩 컨테이너의 잠재적 인 문제와 주요 브라우저 간의 알려진 렌더링 차이에 대해서도 다룹니다 .


레이아웃을 수정하려면 코드를 다음과 같이 조정하십시오.

.month-grid {
  display: grid;
  grid-template: repeat(6, 1fr) / repeat(7, 1fr);
  background: #fff;
  grid-gap: 2px;
  min-height: 0;  /* NEW */
  min-width: 0;   /* NEW; needed for Firefox */
}

.day-item {
  padding: 10px;
  background: #DFE7E7;
  overflow: hidden;  /* NEW */
  min-width: 0;      /* NEW; needed for Firefox */
}

수정 된 코드 펜


1fr vs minmax(0, 1fr)

위의 솔루션은 그리드 항목 수준에서 작동합니다. 컨테이너 수준 솔루션에 대해서는 다음 게시물을 참조하십시오.


3
와. 그것은 동시에 흥미롭고 흥미 롭습니다. 그리고 나는 단지 주위를 둘러 보는 것만으로는 결코 그렇게하지 않았을 것입니다. 해당 정보의 사양을 한 눈에 살펴 보셨습니까? Google에 무엇을 알지 못했기 때문에 이전에 시도했지만 잘못된 섹션 (문제의 잘못된 원인을 결론 내린 후)을 읽었습니다.
Loilo

1
나는 플렉스 아이템을 사용 하기 전에이 문제에 부딪쳤다 . 플렉스와 그리드 항목 사이에 많은 유사점이 있기 때문에 동작이 스펙의 해당 섹션에서 동일하고 제로화 될 수 있다고 생각했습니다.
Michael Benjamin

1
높이를 고정하지만 수평 방향으로 계속 커지지 만 min-width: 0;도움이되지 않습니다. 내가 뭔가를 놓치고 있습니까?
사용자

2
중첩 그리드의 경우 모든 레벨에 적용해야합니다. 그러나 나는 정말로 투표하고 감사하기 위해 여기에 왔습니다 ..
Knack


57

이전 답변은 꽤 좋지만 그리드에 해당하는 고정 레이아웃 있다는 것을 언급하고 싶었습니다 . 트랙 크기 minmax(0, 1fr)대신 작성해야합니다 1fr.


6
이전에 허용 된 답변보다이 방법을 권장합니다.
Thierry Prost

이것이 효과가 있지만 조금 이해하지 못합니다 ... 왜 이것이 효과가 있는지 설명해 주시겠습니까? minmax (0, 1fr) 무엇입니까? 항상 0이 아니어야합니까? 혼란스러워 :(
BAERUS

2
minmax(0, 1fr)1fr대한 속기 이므로 minmax(auto,1fr)원래 질문의 올바른 값이 아니기 때문에 작동합니다 .
Mikko Rantalainen


1

기존 답변은 대부분의 경우를 해결합니다. 그러나 그리드 셀의 내용이되어야하는 경우가 발생했습니다 overflow: visible. 다음과 같이 래퍼 (이상적이지는 않지만 내가 아는 최선) 내에 절대적으로 배치하여 해결했습니다.


.month-grid {
  display: grid;
  grid-template: repeat(6, 1fr) / repeat(7, 1fr);
  background: #fff;
  grid-gap: 2px;  
}

.day-item-wrapper {
  position: relative;
}

.day-item {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 10px;

  background: rgba(0,0,0,0.1);
}

https://codepen.io/bjnsn/pen/vYYVPZv


0

더 쉬운 방법은 그리드 항목 최대 너비를 다음과 같이 설정하는 것입니다.

//for the container
.gridContainer{
    display: grid;
    grids-templates-column: repeat (12, 1fr);
 }

 //for the grid item
 .gridItem{
       max-width: 100%;
       grid-column: span 4  //4 can be any number from1-12 as we specified in the grid template
  }

솔직히 혼란 스러워요. 코드는 원래 질문과 전혀
다르지

max-width는 자식 너비를 기준으로 다시 조정하지 못하게합니다.
Pedro JR

코드를 재현하려고 시도했지만 실제로 작동하지만 max-width : 100 % 때문이 아니라 grid-column : span 4 때문입니다. 시작 열을 정의하지 않고. 시작 열을 정의하십시오 (예 : grid-column : 1 / span 4; 사용). 그러면 레이아웃이 다시 끊어집니다. (이 동작은 다소 이상하지만, 이것이 정의 된 사양의 어딘가에 있다고 확신합니다.)
Loilo

좋아, 좋은 소리. 하지만 당신은 아직 나를위한 공세를 고려하지 않습니다
Pedro JR

솔직히 말해서 : 1. 이것은 3 년 넘게 해결 된 문제였습니다. 2. 답변이 제대로 테스트되지 않았습니다 (CSS에는 브라우저가 그리드를 인식하기 전에 수정해야하는 여러 오타가 포함되어 있습니다). 그리고 3. 귀하의 대답은 실제로 내 질문의 예를 충족시키지 못했습니다 (그렇지 않으면 솔루션이 작동하지 않는다는 것을 깨달았을 것입니다). — 아니요, 죄송합니다. 공감대를 고려하지 않습니다.
Loilo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.