CSS 그리드 래핑


126

미디어 쿼리를 사용하지 않고 CSS 그리드 랩을 만들 수 있습니까?

제 경우에는 그리드에 배치하려는 비 결정적 항목 수가 있고 해당 그리드가 래핑되기를 원합니다. Flexbox를 사용하면 안정적으로 공간을 제대로 배치 할 수 없습니다. 많은 미디어 쿼리도 피하고 싶습니다.

다음은 몇 가지 샘플 코드입니다 .

.grid {
  display: grid;
  grid-gap: 10px;
  grid-auto-flow: column;
  grid-template-columns: 186px 186px 186px 186px;
}

.grid > * {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

다음은 GIF 이미지입니다.

내가 보는 것의 GIF 이미지

부수적으로, 내가 함께있는 모든 항목의 너비를 지정하는 것을 피할 수있는 방법을 누구든지 말해 줄 수 있다면 grid-template-columns좋을 것입니다. 나는 아이들이 자신의 너비를 지정하는 것을 선호합니다.


2
grid-template-columns: auto auto auto auto;이 경우 작동합니까? =)
Jakub Chlebowicz

답변:


219

auto-fill또는 중 하나를 표기법 auto-fit의 반복 번호로 사용하십시오 repeat().

repeat( [ <positive-integer> | auto-fill | auto-fit ] , <track-list> )

auto-fill

auto-fill반복 횟수로 지정하면 그리드 컨테이너가 해당 축에 명확한 크기 또는 최대 크기를 가지고있는 경우 반복 횟수는 그리드가 그리드 컨테이너를 넘치지 않도록 가능한 가장 큰 양의 정수입니다.

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fill, 186px);
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

그리드는 컨테이너를 넘치지 않고 가능한 한 많은 트랙을 반복합니다.

repeat () 표기법의 반복 번호로 자동 채우기 사용

이 경우 위의 예 (이미지 참조) 에서 5 개의 트랙 만 넘치지 않고 그리드 컨테이너에 들어갈 수 있습니다. 그리드에는 4 개의 항목 만 있으므로 나머지 공간에 빈 트랙으로 다섯 번째 항목이 생성됩니다.

나머지 공간 인 트랙 # 6은 명시 적 그리드를 끝냅니다. 이것은 다른 트랙을 배치 할 공간이 충분하지 않았 음을 의미합니다.


auto-fit

auto-fit키워드와 동일하게 동작 auto-fill후 것을 제외하고, 그리드 항목 배치 알고리즘 나머지 공간 내에서 빈 트랙에 붕괴 될 것이다 0.

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fit, 186px);
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

그리드는 컨테이너를 넘치지 않고 가능한 한 많은 트랙을 반복하지만 빈 트랙은로 축소됩니다 0.

접힌 트랙은 고정 트랙 크기 조정 기능이있는 것으로 처리됩니다 0px.

repeat () 표기법의 반복 번호로 자동 맞춤 사용

auto-fill이미지 예제 와 달리 빈 다섯 번째 트랙은 축소되어 네 번째 항목 바로 뒤에 명시 적 격자가 끝납니다.


auto-fill vs auto-fit

이 둘의 차이점은 minmax()기능을 사용할 때 눈에 .니다.

그리드 컨테이너에서 남은 공간의 일부 를 더하기 minmax(186px, 1fr)위해 항목의 범위를 지정하는 데 사용 합니다 .186px186px

를 사용할 때 auto-fill빈 트랙을 배치 할 공간이 없으면 항목이 커집니다.

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(186px, 1fr));
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

를 사용하면 auto-fit모든 빈 트랙이로 축소되므로 나머지 공간을 채우도록 항목이 커집니다 0px.

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fit, minmax(186px, 1fr));
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>


운동장:

CodePen

자동 채우기 트랙 검사

자동 채우기


자동 맞춤 트랙 검사

자동 맞춤


3
다음 줄에있는 것을 중앙에 배치 할 방법이 있습니까?
kentcdodds

플렉스 박스와 마찬가지로 display: grid요소 사용에 대해justify-content: center
Spittal

@Ricky에게 minmax의 첫 번째 속성이되도록 만드는 방법, 예. repeat(auto-fill, minmax(186px, 1fr));픽셀이 아니라 div 안에 텍스트가있는 한?
mesqueeb

1
@mesqueeb 불가능 합니다. 정확한 크기가 필요합니다. 자세한 내용 은 답변을 참조하십시오.
Ricky

1
다음 줄로 넘어 가야 할 때 하나가 아닌 두 항목이 내려가도록 만들 수있는 방법이 있습니까? 그래서 4에서 2에서 1로, 4에서 3에서 2에서 1로하지 않습니까?
sammiepls

16

함수 내부 auto-fit또는 중 하나를 원합니다 .auto-fillrepeat()

grid-template-columns: repeat(auto-fit, 186px);

minmax()유연한 열 크기를 허용하기 위해 a 를 사용하는 경우 두 가지의 차이점이 분명해집니다 .

grid-template-columns: repeat(auto-fill, minmax(186px, 1fr));

이를 통해 186 픽셀에서 컨테이너의 전체 너비에 걸쳐 펼쳐지는 동일한 너비의 열에 이르기까지 열의 크기를 조정할 수 있습니다. auto-fill너비에 맞는만큼의 열을 생성합니다. 예를 들어, 그리드 항목이 4 개만 있더라도 5 개의 열이 맞으면 다섯 번째 빈 열이 있습니다.

여기에 이미지 설명 입력

auto-fit대신 사용하면 빈 열을 방지하고 필요한 경우 더 확장 할 수 있습니다.

여기에 이미지 설명 입력


7

당신은 찾을 수 있습니다 auto-fill:

grid-template-columns: repeat(auto-fill, 186px);

데모 : http://codepen.io/alanbuchanan/pen/wJRMox

사용 가능한 공간을보다 효율적으로 사용하려면을 사용 하고 두 번째 인수로 minmax전달할 수 있습니다 auto.

grid-template-columns: repeat(auto-fill, minmax(186px, auto));

데모 : http://codepen.io/alanbuchanan/pen/jBXWLR

빈 열을 원하지 않는 경우 auto-fit대신 사용할 수 있습니다 auto-fill.


2
다음 줄에있는 것을 중앙에 배치 할 방법이 있습니까?
kentcdodds

3

비슷한 상황이있었습니다. 당신이 한 일 위에, 나는 왼쪽이나 오른쪽에 빈 열을 허용하지 않고 컨테이너의 열을 중앙에 배치하고 싶었습니다.

.grid { 
    display: grid;
    grid-gap: 10px;
    justify-content: center;
    grid-template-columns: repeat(auto-fit, minmax(200px, auto));
}

다시 "그 빈 컬럼에 허용하지 않으면 서" : 당신은 의미합니까 "빈 열을 허용하지 않는 동안 하나 그들을 위해" ( 하기 )? 또는 "그들에게 빈 열을 허용하지 않으면 서" (하지 )? 아니면 다른 것 (계산되지 않는 것 같음)?
Peter Mortensen 2019

1

여기 내 시도가 있습니다. 실례 합니다만, 저는 좀 더 창의적인 느낌이었습니다.

내 방법은 고정 치수를div 가진 부모 입니다 . 나머지는 그에 따라 해당 div 내부의 콘텐츠를 맞추는 것입니다.

이렇게하면 종횡비에 관계없이 이미지의 크기조정 됩니다 . 없을 것 더 열심히 자르기 중 하나.

body {
    background: #131418;
    text-align: center;
    margin: 0 auto;
}

.my-image-parent {
    display: inline-block;
    width: 300px;
    height: 300px;
    line-height: 300px; /* Should match your div height */
    text-align: center;
    font-size: 0;
}

/* Start demonstration background fluff */
    .bg1 {background: url(https://unsplash.it/801/799);}
    .bg2 {background: url(https://unsplash.it/799/800);}
    .bg3 {background: url(https://unsplash.it/800/799);}
    .bg4 {background: url(https://unsplash.it/801/801);}
    .bg5 {background: url(https://unsplash.it/802/800);}
    .bg6 {background: url(https://unsplash.it/800/802);}
    .bg7 {background: url(https://unsplash.it/802/802);}
    .bg8 {background: url(https://unsplash.it/803/800);}
    .bg9 {background: url(https://unsplash.it/800/803);}
    .bg10 {background: url(https://unsplash.it/803/803);}
    .bg11 {background: url(https://unsplash.it/803/799);}
    .bg12 {background: url(https://unsplash.it/799/803);}
    .bg13 {background: url(https://unsplash.it/806/799);}
    .bg14 {background: url(https://unsplash.it/805/799);}
    .bg15 {background: url(https://unsplash.it/798/804);}
    .bg16 {background: url(https://unsplash.it/804/799);}
    .bg17 {background: url(https://unsplash.it/804/804);}
    .bg18 {background: url(https://unsplash.it/799/804);}
    .bg19 {background: url(https://unsplash.it/798/803);}
    .bg20 {background: url(https://unsplash.it/803/797);}
/* end demonstration background fluff */

.my-image {
    width: auto;
    height: 100%;
    vertical-align: middle;
    background-size: contain;
    background-position: center;
    background-repeat: no-repeat;
}
<div class="my-image-parent">
    <div class="my-image bg1"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg2"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg3"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg4"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg5"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg6"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg7"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg8"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg9"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg10"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg11"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg12"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg13"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg14"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg15"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg16"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg17"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg18"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg19"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg20"></div>
</div>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.