여러 줄로 된 flexbox 레이아웃에서 줄 바꿈을 지정하는 방법은 무엇입니까?


236

여러 줄 flexbox에서 줄 바꿈을 만드는 방법이 있습니까?

예를 들어이 CodePen의 각 세 번째 항목 다음에 깰 수 있습니다.

.container {
  background: tomato;
  display: flex;
  flex-flow: row wrap;
  align-content: space-between;
  justify-content: space-between;
}
.item {
  width: 100px;
  height: 100px;
  background: gold;
  border: 1px solid black;
  font-size: 30px;
  line-height: 100px;
  text-align: center;
  margin: 10px;
}
.item:nth-child(3n) {
  background: silver;
}
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5</div>
  <div class="item">6</div>
  <div class="item">7</div>
  <div class="item">8</div>
  <div class="item">9</div>
  <div class="item">10</div>
</div>

처럼

.item:nth-child(3n){
  /* line-break: after; */    
}

1
나는 같거나 매우 비슷한 문제가 있었다. 모든 4 번째 항목을 끊고 싶었으므로 각 flex 항목의 너비를 25vw (또는 25 %)로 설정했습니다. 따라서 귀하의 경우 3 번째 항목마다 33.3vw (또는 33.3 %)를 사용합니다. 내가 원하는 것을 위해 완벽하게 일했습니다. 더 간단한 방법을 찾고 있다면 다른 사람을 도울 수 있습니다.
Ben Clarke

벤 클라크! 정말 고맙습니다! 당신의 대답은 효과가있는 유일한 것입니다. 답변으로 추가하는 것을 고려할 수 있습니다. :-)
itmuckel

답변:


322

가장 간단하고 안정적인 솔루션은 올바른 위치에 플렉스 아이템을 삽입하는 것입니다. 너비가 충분하면 ( width: 100%) 줄 바꿈을 강요합니다.

그러나 그것은 추악하고 의미 론적이지 않습니다. 대신, 플렉스 컨테이너 안에 의사 요소를 생성 order하여 올바른 위치로 옮길 수 있습니다.

그러나 플렉스 컨테이너 ::before에는 ::after의사 요소 만있을 수 있습니다 . 즉, 줄 바꿈을 2 번만 수행 할 수 있습니다.

이를 해결하기 위해 플렉스 컨테이너 대신 플렉스 아이템 내에 의사 요소를 생성 할 수 있습니다. 이렇게하면 2로 제한되지 않지만 의사 요소는 플렉스 항목이 아니므로 줄 바꿈을 강요 할 수 없습니다.

그러나 운 좋게도 CSS Display L3 가 도입했습니다 display: contents(현재 Firefox 37에서만 지원됨).

요소 자체는 상자를 생성하지 않지만 그 하위 요소와 의사 요소는 여전히 정상적으로 상자를 생성합니다. 상자 생성 및 레이아웃을 위해 요소는 마치 문서 트리에서 하위 요소 및 의사 요소로 대체 ​​된 것처럼 처리해야합니다.

따라서 display: contents플렉스 컨테이너의 자식에 적용 하고 각 랩의 내용을 추가 래퍼로 래핑 할 수 있습니다 . 그런 다음 flex 항목은 추가 래퍼 및 하위 요소의 의사 요소가됩니다.

또한,에 따라 세분화 플렉스 레이아웃CSS 분열 , 인 flexbox을 사용하여 휴식을 강제 허용 break-before, break-after또는 CSS 2.1 별칭 :

.item:nth-child(3n) {
  page-break-after: always; /* CSS 2.1 syntax */
  break-after: always; /* New syntax */
}

flexbox의 강제 줄 바꿈은 아직 널리 지원되지 않지만 Firefox에서는 작동합니다.


@Oriol 첫 번째 접근 방식에 대해 왜 그것이 의미가없고 추악하다고 말합니까? 그냥 궁금해서
nacho4d

18
@ nacho4d HTML을 스타일링 목적으로 수정해서는 안되므로. 그리고 마음이 바뀌고 3 대신 4 개의 열을 원한다면 많은 HTML을 수정해야합니다. break-after스타일 시트에서 선택기를 수정하기 만하면되는 솔루션 과 비교하십시오 .
Oriol

1
내가 추가 할 필요 display: block;받는 사람 .container ::before::afterIE의 솔루션의 두 번째 작품을 만들기 위해 의사 클래스. YMMV!
꼬인

1
@twined 플렉스 아이템이 자동으로 차단되어야하기 때문에 이상합니다.
Oriol

2
페이지 나누기 항목이 사양에서 분명히 제거되었으므로 두 번째 스 니펫을 열 방향으로 실행하고 컨테이너 높이를 확장하지 않아도됩니까? 나는 운이 없었고 flex-basis를 100 % / 항목으로 설정하면 높이가 늘어납니다.
Lucent

42

내 관점 에서 플렉스 항목 간의 <hr> 줄 바꿈으로 요소 를 사용하는 것이 더 의미 론적 입니다.

.container {
  display: flex;
  flex-flow: wrap;
}

.container hr {
  width: 100%;
}
<div class="container">
  <div>1</div>
  <div>2</div>
  <hr>
  <div>3</div>
  <div>2</div>
  ...
</div>

Chrome 66, Firefox 60 및 Safari 11에서 테스트되었습니다.


7
이것이 내가하는 일이기도합니다. 시간 추가 {flex-basis : 100 %; 높이 : 0; 여백 : 0; 국경 : 0; } 나누기가 원활합니다.
Besworks

나는이 접근법을 좋아한다. 참고 : gap: 10px;행 사이의 거리는 실제로 20px입니다. 해결하려면 해당 크기의 절반 인 행 간격을 지정하십시오 gap: 5px 10px;.
CuddleBunny

@Besworks : 대신 border로 설정해야합니다 .none0
Mark

@mark border:0;는 다음과 같이 유효합니다 border:none;. 참조 : stackoverflow.com/questions/2922909/…
Besworks

23

@Oriol는, 슬프게도 년 10 월 2017로, 훌륭한 대답을 가지고도 display:contents, 어느 쪽도 없습니다page-break-after 광범위하게 지원되고, 더 나은이 아닌 다른 플레이어를 지원하는 파이어 폭스에 관하여 말했다, 내가 가지고 올이 다음 내가 더 잘 하드보다 더 고려하는 "해킹" 페이지를 모바일 친화적으로 만들기가 매우 어렵 기 때문에 매 3 번째 요소마다 중단 된 코드를 작성해야합니다.

말했듯이 그것은 해킹이며 단점은 아무것도 추가하지 않아도 많은 요소를 추가해야한다는 것입니다.하지만 IE11에서도 트릭을 수행하고 브라우저 간을 작동합니다.

"해킹"은 각 div 뒤에 추가 요소를 추가하는 것입니다.이 설정 display:none은 CSS nth-child로 설정되어 다음 중 다음 과 같이 라인 브레이크를 강제로 표시해야하는 요소를 결정하는 데 사용됩니다 .

.container {
  background: tomato;
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
}
.item {
  width: 100px;
  background: gold;
  height: 100px;
  border: 1px solid black;
  font-size: 30px;
  line-height: 100px;
  text-align: center;
  margin: 10px
}
.item:nth-child(3n-1) {
  background: silver;
}
.breaker {display:none;}
.breaker:nth-child(3n) {
  display:block;
  width:100%;
  height:0;
 }
<div class="container">
  <div class="item">1</div><p class=breaker></p>
  <div class="item">2</div><p class=breaker></p>
  <div class="item">3</div><p class=breaker></p>
  <div class="item">4</div><p class=breaker></p>
  <div class="item">5</div><p class=breaker></p>
  <div class="item">6</div><p class=breaker></p>
  <div class="item">7</div><p class=breaker></p>
  <div class="item">8</div><p class=breaker></p>
  <div class="item">9</div><p class=breaker></p>
  <div class="item">10</div><p class=breaker></p>
</div>


2
또한 "display : contents"및 "page-break-after"메소드가 작동하지 않으며이 "해킹"에 의존한다는 것도 알았습니다. 이는 Chrome 버그로보고되었으며 다음 설명과 함께 "WontFix"( bugs.chromium.org/p/chromium/issues/detail?id=473481 참조 )로 표시되었습니다 . "CSS 실무 그룹에 따르면 CSS를 사용하여 코드 상자에서 줄 바꿈을 강제하는 현재 방법 "
Martin_W

선택기를 사용하여 혼란을 피할 수 .container>p있습니다. 그런 다음 모든 <p></p>태그에는 class속성이 필요하지 않습니다 . 물론 중요 하지 않습니다 . 게으른 두뇌가 영리한 솔루션에 작은 공간 절약형 조정을 찾는 것입니다. 물론, 그것은 div의 <p>직접적인 자식으로 다른 태그 가없는 사용자에게 의존합니다 .container. 기술적으로 모든 다른와 동일 할 수있는 <div>아이들,하지만 당신이있어 다른이 더 가능성이 많은 <div>에서의 .container당신보다 <p>들, 그래서 아마 현명한있다.
Steve

13

시맨틱 한 줄 바꿈을 원하십니까?

그런 다음 사용을 고려하십시오 <br>. W3Schools는 BR시를 쓰기위한 것임을 제안 할 수 있지만 (광산이 곧 나옵니다) 스타일을 변경하여 100 % 너비 블록 요소로 작동하여 컨텐츠를 다음 줄로 넘길 수 있습니다. 'br'이 휴식을 제안하면 나 hr100 %를 사용하는 것보다 나에게 더 적합 div하고 HTML을 더 읽기 쉽게 만듭니다.

<br>줄 바꿈이 필요한 곳에 삽입하고 다음과 같이 스타일을 지정하십시오.

 // Use `>` to avoid styling `<br>` inside your boxes 
 .container > br 
 {
    width: 100%;
    content: '';
 }

적절한 또는 로 설정 하여 미디어 쿼리로 비활성화<br> 할 수 있습니다 (예제를 포함했지만 주석 처리했습니다).display:blocknone

order:필요한 경우 주문 설정에도 사용할 수 있습니다 .

그리고 다른 클래스 나 이름으로 원하는만큼 넣을 수 있습니다 :-)

.container {
  background: tomato;
  display: flex;
  flex-flow: row wrap;
  justify-content: space-between;
}
.item {
  width: 100px;
  background: gold;
  height: 100px;
  border: 1px solid black;
  font-size: 30px;
  line-height: 100px;
  text-align: center;
  margin: 10px
}

.container > br
{
  width: 100%;
  content: '';
}

// .linebreak1 
// { 
//    display: none;
// }

// @media (min-width: 768px) 
// {
//    .linebreak1
//    {
//       display: block;
//    }
// }
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <br class="linebreak1"/>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5</div>
  <div class="item">6</div>
  <div class="item">7</div>
  <div class="item">8</div>
  <div class="item">9</div>
  <div class="item">10</div>
</div>


W3Schools의 말에 자신을 제한 할 필요가 없습니다.

여기에 이미지 설명을 입력하십시오


한 가지 기술 확장은 매 3 <br class="2col">초마다 2 초 <br class="3col">마다 추가하는 것입니다. 그런 다음 클래스 cols-2를 컨테이너에 적용하고 CSS를 만들어 해당 열 수에 적절한 줄 바꿈 만 활성화하십시오. 예. br { display: none; } .cols-2 br.2col { display: block; }
Simon_Weaver

아니,이 br줄 바꿈을위한 것이 아닙니다 요소 가입니다, 텍스트 : developer.mozilla.org/en-US/docs/Web/HTML/Element/br ... stackoverflow.com/questions/3937515/...

2
나는 이것을 완벽한 솔루션으로 제시하지 않기 위해 문구를 바꿀 것입니다. 그러나 어떤 경우에는 이것을 다른 div 또는 pseudo element 솔루션보다 더 나쁜 것으로 보지 않습니다. 어쩌면 나는 지금 그것에 대해시를 쓸 것입니다.
Simon_Weaver

예 ... 시가 좋을 것입니다. 여기에 링크를 게시하는 것을 잊지 마십시오 :) ... 완벽한 솔루션과 관련하여 (아마도 break-*수락 된 답변에 표시됨) 아직 크로스 브라우저에 도달하지 못했습니다. 따라서 두 번째로 가장 좋은 것은 부모의 너비를 기본적으로 채우고 다음 형제를 행으로 밀어 넣는 요소를 사용하는 것입니다. 따라서 하나의 블록 이외의 다른 요소를 사용하면 의미 적으로 악화 br됩니다.
Ason

5
W3C가 아닌 W3School의 인쇄물이 연결되어 있지 않다는 것을 기억하십시오.
Edu Ruiz

7

전통적인 방법은 유연하고 이해하기 쉽다고 생각합니다.

마크 업

<div class="flex-grid">
    <div class="col-4">.col-4</div>
    <div class="col-4">.col-4</div>
    <div class="col-4">.col-4</div>

    <div class="col-4">.col-4</div>
    <div class="col-4">.col-4</div>
    <div class="col-4">.col-4</div>

    <div class="col-3">.col-3</div>
    <div class="col-9">.col-9</div>

    <div class="col-6">.col-6</div>
    <div class="col-6">.col-6</div>
</div>

grid.css 파일을 작성 하십시오.

.flex-grid {
  display: flex;
  flex-flow: wrap;
}

.col-1 {flex: 0 0 8.3333%}
.col-2 {flex: 0 0 16.6666%}
.col-3 {flex: 0 0 25%}
.col-4 {flex: 0 0 33.3333%}
.col-5 {flex: 0 0 41.6666%}
.col-6 {flex: 0 0 50%}
.col-7 {flex: 0 0 58.3333%}
.col-8 {flex: 0 0 66.6666%}
.col-9 {flex: 0 0 75%}
.col-10 {flex: 0 0 83.3333%}
.col-11 {flex: 0 0 91.6666%}
.col-12 {flex: 0 0 100%}

[class*="col-"] {
  margin: 0 0 10px 0;

  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}

@media (max-width: 400px) {
  .flex-grid {
    display: block;
  }
}

예제를 만들었습니다 (jsfiddle)

400px 미만으로 창 크기를 조정하십시오.


이 솔루션에서 요소는 함께 있으며 아이디어는 요소 사이에 긴 공백이 있어야합니다.
Juanma Menendez

2

추가 마크 업을 추가하지 않아도되는 다른 가능한 솔루션은 요소를 분리하기 위해 동적 여백을 추가하는 것입니다.

예제의 경우 3n + 2 요소 (2, 5, 8)를 calc()추가 margin-left하고 margin-right에 추가 하여이 작업을 수행 할 수 있습니다.

.item:nth-child(3n+2) {
  background: silver;
  margin: 10px calc(50% - 175px);
}

스 니펫 예제

.container {
  background: tomato;
  display: flex;
  flex-flow: row wrap;
  align-content: space-between;
  justify-content: space-between;
}
.item {
  width: 100px;
  height: 100px;
  background: gold;
  border: 1px solid black;
  font-size: 30px;
  line-height: 100px;
  text-align: center;
  margin: 10px;
}
.item:nth-child(3n+2) {
  background: silver;
  margin: 10px calc(50% - 175px);
}
<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5</div>
  <div class="item">6</div>
  <div class="item">7</div>
  <div class="item">8</div>
  <div class="item">9</div>
  <div class="item">10</div>
</div>


1
투표권이 있습니다. 플렉스와 마진의 조합을 사용하면 줄 바꿈을 지원하는 정말 간단한 방법입니다. 또한 calc이 답변에 요약 된대로 잘 작동합니다 .
stwilz

나는 margin-right: 1px아이템을 좋아 하고 다음 아이템을 새로운 행에서 시작하게 할 것이다.
arvil

0

향후 질문에 대해서는 다음을 사용하여 수행 할 수도 있습니다. float 속성 하고 각 3 개 요소에서 속성을 지워서 .

여기 내가 만든 예가 있습니다.

.grid {
  display: inline-block;
}

.cell {
  display: inline-block;
  position: relative;
  float: left;
  margin: 8px;
  width: 48px;
  height: 48px;
  background-color: #bdbdbd;
  font-family: 'Helvetica', 'Arial', sans-serif;
  font-size: 14px;
  font-weight: 400;
  line-height: 20px;
  text-indent: 4px;
  color: #fff;
}

.cell:nth-child(3n) + .cell {
  clear: both;
}
<div class="grid">
  <div class="cell">1</div>
  <div class="cell">2</div>
  <div class="cell">3</div>
  <div class="cell">4</div>
  <div class="cell">5</div>
  <div class="cell">6</div>
  <div class="cell">7</div>
  <div class="cell">8</div>
  <div class="cell">9</div>
  <div class="cell">10</div>
</div>


3
문제는 여기서 OP가 솔루션이 flexbox를 사용해야한다고 명시 display: flex;하지 않았으며display: inline-block;
bafromca

1
.cell:nth-child(3n + 1)대신 쓸 수 있습니다
Si7ius

-1

나는 여기에 몇 가지 대답을 시도했지만 그중 아무것도 효과가 없었습니다. 아이러니하게도, 가장 효과적인 대안 <br/>은 시도 할 수 있는 것입니다.

<div style="flex-basis: 100%;"></div>

또는 당신은 또한 할 수 있습니다 :

<div style="width: 100%;"></div>

새 줄을 원하는 곳에 배치하십시오. 인접 제품에서도 작동하는 것 같지만 인접 제품 <span>과 함께 사용하고 <div>있습니다.


2
100 % 너비의 div가 허용되는 답변에 제공된 첫 번째 솔루션입니다.
TylerH

1
맞습니다. 그들은 열악한 이유로 내려다보고 있습니다 (추악한가?). 또한 내 대답은 flex-basis입니다.
앤드류

-4

.container {
  background: tomato;
  display: flex;
  flex-flow: row wrap;
  align-content: space-between;
  justify-content: space-between;
}

.item {
  width: 100px;
  height: 100px;
  background: gold;
  border: 1px solid black;
  font-size: 30px;
  line-height: 100px;
  text-align: center;
  margin: 10px;
}
<div class="container">
  <div>
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
  </div>
  <div>
    <div class="item">4</div>
    <div class="item">5</div>
    <div class="item">6</div>
  </div>
  <div>
    <div class="item">7</div>
    <div class="item">8</div>
    <div class="item">9</div>
  </div>
  <div class="item">10</div>
</div>

여기와 같은 dom 요소로 항목을 래핑 할 수 있습니다. 이것으로 당신은 좋은 구조를 가진 많은 CSS를 알 필요가 없습니다.


1
컨테이너를 일반 display: block으로 만들고 새로운 2 티어 플렉스 박스를 만들 수 있습니다. 이것은 행에 적용됩니다. 열 모드를 사용할 때 div를 범위로 바꾸십시오.
jiggunjer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.