요소 내에서 열 나누기를 방지하는 방법은 무엇입니까?


272

다음 HTML을 고려하십시오.

<div class='x'>
    <ul>
        <li>Number one</li>
        <li>Number two</li>
        <li>Number three</li>
        <li>Number four is a bit longer</li>
        <li>Number five</li>
    </ul>
</div>

그리고 다음 CSS :

.x {
    -moz-column-count: 3;
    column-count: 3;
    width: 30em;
}

Firefox는 현재 다음과 유사하게 렌더링합니다.

 Number one     Number three          bit longer
 Number two     Number four is a     Number five

네 번째 항목은 두 번째 열과 세 번째 열로 나뉘어져 있습니다. 어떻게 방지 할 수 있습니까?

원하는 렌더링은 다음과 같습니다.

 Number one     Number four is a
 Number two      bit longer
 Number three   Number five

또는

 Number one     Number three         Number five
 Number two     Number four is a
                  bit longer

편집 : 너비는 원치 않는 렌더링을 보여주기 위해 지정됩니다. 실제 경우에는 물론 고정 너비가 없습니다.


그 독립형 스타일을 제공하려고 했습니까? <li style = "width : ??? px"> 4 번째가 조금 더 깁니다 </ li> ??? px = 4 번째에 맞는 너비입니다.
rmagnum2002

답변:


397

이를 수행하는 올바른 방법은 break-inside CSS 속성을 사용하는 것입니다 .

.x li {
    break-inside: avoid-column;
}

불행히도 2019 년 10 월 현재 Firefox에서는 지원되지 않지만 다른 모든 주요 브라우저에서는 지원됩니다 . Chrome을 사용하면 위의 코드를 사용할 수 있었지만 Firefox에서 아무것도 작동시킬 수 없었습니다 ( 버그 549114 참조 ).

필요한 경우 Firefox에서 할 수있는 해결 방법은 끊지 않는 내용을 표에 포장하는 것이지만 피할 수 있다면 정말 끔찍한 해결책입니다.

최신 정보

위에서 언급 한 버그 보고서에 따르면 Firefox 20 이상은 page-break-inside: avoid요소 내부에서 열 나누기를 피하는 메커니즘으로 지원 하지만 아래 코드 스 니펫은 여전히 ​​목록에서 작동하지 않음을 보여줍니다.

다른 사람이 말할 때, 당신은 할 수 overflow: hidden또는 display: inline-block그러나 이것은 원래의 질문에 표시된 총알을 제거합니다. 솔루션은 목표가 무엇인지에 따라 다릅니다.

업데이트 2 파이어 폭스 보낸 사람에 침입 방지 않습니다 display:tabledisplay:inline-block신뢰할 수 있지만 비 의미 솔루션은 자신의 목록에있는 각 목록 항목을 포장하고 거기에 스타일 규칙을 적용하는 것입니다 :

.x {
    -moz-column-count: 3;
    -webkit-column-count: 3;
    column-count: 3;
    width: 30em;
}

.x ul {
    margin: 0;
    -webkit-column-break-inside: avoid; /* Chrome, Safari */
    page-break-inside: avoid;           /* Theoretically FF 20+ */
    break-inside: avoid-column;         /* IE 11 */
    display:table;                      /* Actually FF 20+ */
}
<div class='x'>
    <ul>
        <li>Number one, one, one, one, one</li>
    </ul>
    <ul>
        <li>Number two, two, two, two, two, two, two, two, two, two, two, two</li>
    </ul>
    <ul>
        <li>Number three</li>
    </ul>
</div>


4
나는 오페라 11.5 지원break-inside: avoid-column
Alohci

2
코멘트 15를 보면 page-break-inside:avoidFF 20에서 작동합니다.
Brian Nickel

23
2014 년에 올바른 구문은 다음과 같습니다. -webkit-column-break-inside:avoid; -moz-column-break-inside:avoid; -o-column-break-inside:avoid; -ms-column-break-inside:avoid; column-break-inside:avoid;
Carles Jove i Buxeda

3
@CarlesJoveBuxeda Firefox 31에서 개선 된 점이 없습니다. 접두사 내부 또는 접두사 내부 (접두사가 있거나없는)가 작동하지 않습니다.
브라이언 니켈

6
조금 늦었지만 2018 년에도 여전히 문제가되므로 여기에있는 다른 사람들에게 유용 할 수 있습니다. 누구든지 여전히 브라우저간에 버그가 있으면 overflow: hidden더 좋은 옵션입니다. display: inline-block;불행히도 Chrome에 새로운 문제가 생깁니다.
SilasOtoko

170

첨가;

display: inline-block;

자식 요소에 열이 분리되는 것을 방지합니다.


1
이거 좋다 인라인 블록의 나쁜 동작을 방지하는 가능한 방법은 이제 한 줄에서 너무 오래 걸리는 경우 display:block요소 를 추가로 감싸는 것입니다 . 이것은 현재 견고한 Firefox 해결 방법 일 것입니다.
Steven Lu

이 솔루션은 목록 항목을 제거하므로 주문 목록을 사용하는 경우 대안이 될 수 없습니다.
Ricardo Zea

단락을 열로 분할하는 데 완벽하게 작동합니다.
ChrisC

목록 항목의 경우 "display : inline-block"을 사용하여 "span"요소 세트 내에 목록 항목 (li)의 컨텐츠를 임베드하는 경우 작동 할 수 있습니다. 테이블 내에서 페이지 또는 열을 나누는 위치를 제어하려는 경우 상황이 훨씬 복잡합니다. 테이블 행 (tr) 내에서 나누기를 피하고 싶습니다. 실제로 다중 열 레이아웃은 설정하기가 어렵지만 사이트를 매우 좁은 화면 (예 : 스마트 폰)과 넓은 디스플레이 (매우 좁은 열이 실제로 불공평 한 위치)에 적용 할 수 있도록해야합니다.
verdy_p

7
내 작품 <li>이지만 width:100%;수평으로 쌓이지 않도록 추가 해야했습니다.
Justin

47

깨지 않으려는 요소의 스타일에 따라 다음을 설정하십시오.

overflow: hidden; /* fix for Firefox */
break-inside: avoid-column;
-webkit-column-break-inside: avoid;

1
감사합니다!! 나는 FF에 문제가 있었고 이것을 고쳤다!
Francis Perron

나도. 위의 솔루션은 저에게 효과적이지 않지만 귀하의 솔루션은 효과가 있습니다. 명성!
Maxx

이것은 FF에서 작동하며 실제로 내 콘텐츠를 숨기지 않습니다!
Justin

좋은. 열 텍스트 단락에서도 작동합니다. 오버플로 추가 : 열이있는 <div> <d>에 숨겨져 있습니다. FF에서 작동합니다.
dichterDichter

1
사실, overflow:hidden규칙이 다른 규칙에 대한 수정없는 것입니다 ... 줄 바꿈 레이아웃의 원인을
그라 더블

23

2014 년 10 월 현재 Firefox 및 IE 10-11에서는 침입자가 여전히 버그가있는 것으로 보입니다. 그러나 break-inside : avoid와 함께 overflow : hidden을 요소에 추가하면 Firefox 및 IE 10-11에서 작동하는 것으로 보입니다. 나는 현재 다음을 사용하고 있습니다 :

overflow: hidden; /* Fix for firefox and IE 10-11  */
-webkit-column-break-inside: avoid; /* Chrome, Safari, Opera */
page-break-inside: avoid; /* Firefox */
break-inside: avoid; /* IE 10+ */
break-inside: avoid-column;

이것은 가장 철저한 목록 인 것 같습니다
binaryfunt

12

Firefox는 이제 이것을 지원합니다 :

page-break-inside: avoid;

이것은 요소들이 열을 가로 지르는 문제를 해결합니다.


이 작업을 했습니까? FF 22에서이 바이올린을보고 있는데 작동하지 않습니다 : jsfiddle.net/bnickel/5qwMf
Brian Nickel

Firefox 22에서도 작동하지 않습니다. 또한 Firebug는 다음을 표시 page-break-before:하거나 표시 page-break-after:하지 않습니다.page-break-inside:
Ricardo Zea

Firefox 버전 28. 이것은 나를 위해 아직 작동하는 유일한 것입니다, 감사합니다!
Sander Verhagen

9

허용 된 답변은 이제 2 살이며 변경 사항이있는 것으로 보입니다.

이 기사에서는column-break-inside 속성 사용에 대해 설명합니다 . break-inside후자는 W3 사양에 문서화되어 있기 때문에 이것이 어떻게 또는 왜 다른지 말할 수 없습니다 . 그러나 Chrome 및 Firefox는 다음을 지원합니다.

li {
    -webkit-column-break-inside:avoid;
       -moz-column-break-inside:avoid;
            column-break-inside:avoid;
}

일반적인 <div class = "a">에서는 "a"가 위의 "Li"를 대체합니다. div는 여전히 내부에 침입했습니다. FF 26
Nasser

버그가 아닙니다. 위의 코드는 셀렉터가 li 요소에 대한 것 일지라도 설명 된 기능에 적합합니다. 이 샘플에서는 "li {...}"대신 다른 CSS 선택기 "div.a {...}"를 계속 사용할 수 있습니다.
verdy_p

그러나 Chrome은 여전히 ​​-webkit-column-break-inside : avoid를 지원하지 않습니다. 표 행에서 : 작동하지 않으며 여전히 나쁜 위치에서 표를 깨는 것을 피할 수 없습니다 (특히 이야기 셀에 텍스트가 아닌 아이콘이 포함되어 있지만 Chrome이 텍스트 줄의 가운데에있는 세로 위치에서 분할 된 것처럼 보입니다) , 첫 번째 열의 맨 아래에 텍스트 글리프의 상단 부분과 다음 열의 맨 위에 텍스트 글리프의 하단 부분으로 텍스트
나누기

2017 년 기준으로 열 구분은 유효한 CSS 속성이 아닌 것 같습니다. MDN은 "Edge는 비표준 -webkit-column-break-inside 변형도 지원합니다"라고 말합니다.
Jacob C., Reinstate Monica가

9

이것은 2015 년에 저에게 효과적입니다.

li {
  -webkit-column-break-inside: avoid;
  /* Chrome, Safari, Opera */
  page-break-inside: avoid;
  /* Firefox */
  break-inside: avoid;
  /* IE 10+ */
}
.x {
  -moz-column-count: 3;
  column-count: 3;
  width: 30em;
}
<div class='x'>
  <ul>
    <li>Number one</li>
    <li>Number two</li>
    <li>Number three</li>
    <li>Number four is a bit longer</li>
    <li>Number five</li>
  </ul>
</div>


이것은 나를 위해 일하고 ulCSS 트릭에 게시 된 요소 : css-tricks.com/almanac/properties/b/break-inside 및 caniuse 호환성 노트를 기반으로 올바른 것 같다 "부분 지원은 지원하지 않는 의미 break-before, break-after, break-inside속성 . WebKit-와 브라우저가 아닌 표준에 상응하는 지원을해야합니까 깜박임 기반 -webkit-column-break-*(그러나 단지 동일한 결과를 달성하기위한 속성 autoalways값). 파이어 폭스는 지원하지 않습니다 break-*하지만 지원하지 않습니다 page-break-*동일한 결과를 달성하기 위해 속성을. "
nabrown

3

다음 코드는 요소 내부의 열 구분을 방지하기 위해 작동합니다.

-webkit-column-break-inside: avoid;
-moz-column-break-inside: avoid;
-o-column-break-inside: avoid;
-ms-column-break-inside: avoid;
column-break-inside: avoid;

3

2019 년에 Chrome, Firefox 및 Opera 에서이 기능을 사용하면 다른 많은 시도가 실패했습니다.

.content {
    margin: 0;
    -webkit-column-break-inside: avoid;
    break-inside: avoid;
    break-inside: avoid-column;
}

li {
    -webkit-column-break-inside:avoid;
       -moz-column-break-inside:avoid;
            column-break-inside:avoid;
           break-inside: avoid-column;
             page-break-inside: avoid;
}

2

Firefox 26은 필요한 것 같습니다

page-break-inside: avoid;

그리고 Chrome 32 요구 사항

-webkit-column-break-inside:avoid;
   -moz-column-break-inside:avoid;
        column-break-inside:avoid;

2

나는 내가 생각한 것과 같은 문제가 있었고 이것에 대한 해결책을 찾았다.

-webkit-column-fill: auto; /* Chrome, Safari, Opera */
-moz-column-fill: auto; /* Firefox */
column-fill: auto;  

FF 38.0.5에서도 작업 : http://jsfiddle.net/rkzj8qnv/


이 솔루션은 나를 도와줍니다
OzzyCzech

1

Firefox의 가능한 해결 방법은 내부에서 나누고 싶지 않은 요소의 CSS 속성 "display"를 "table"로 설정하는 것입니다. LI 태그에서 작동하는지 모르겠지만 (목록-항목 스타일을 잃을 것입니다) P 태그에서는 작동합니다.


이 솔루션은 목록 항목을 제거하므로 주문 목록을 사용하는 경우 대안이 될 수 없습니다.
Ricardo Zea

1

방금 div다음 열을 추가하여 s를 수정했습니다.

overflow: auto

아이에게 div.

* Firefox에서만 수정되었습니다!


1

카드 열을 사용하는 동안 같은 문제가 발생했습니다.

나는 그것을 사용하여 고쳤다.

 display: inline-flex ;
 column-break-inside: avoid;
 width:100%;


0

실제 답변을 업데이트했습니다.

이것은 파이어 폭스와 크롬에서 작동하는 것 같습니다 : http://jsfiddle.net/gatsbimantico/QJeB7/1/embedded/result/

.x{
columns: 5em;
-webkit-columns: 5em; /* Safari and Chrome */
-moz-columns: 5em; /* Firefox */
}
.x li{
    float:left;
    break-inside: avoid-column;
    -webkit-column-break-inside: avoid;  /* Safari and Chrome */
}

참고 : 플로트 속성은 차단 동작을 만드는 하나가 될 것으로 보인다.


0

이 답변은 특정 상황에만 적용될 수 있습니다. 요소의 높이를 설정하면 열 스타일이 적용됩니다. 따라서 해당 높이 내에 포함 된 모든 것을 행으로 유지합니다.

나는 op와 같은 목록을 가지고 있었지만 그 항목에 작용하는 두 가지 요소, 항목과 버튼이 포함되어 있습니다. 나는 테이블처럼 처리 <ul> - table, <li> - table-row, <div> - table-cell4 열 레이아웃의 UL을 넣어. 항목과 버튼 사이에서 열이 분리되는 경우가있었습니다. 내가 사용한 트릭은 단추를 덮을 수 있도록 Div 요소에 선 높이를 부여하는 것이 었습니다.

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