순서가없는 목록을 두 열로 표시하는 방법은 무엇입니까?


215

다음 HTML에서 목록을 두 개의 열로 표시하는 가장 쉬운 방법은 무엇입니까?

<ul>
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>D</li>
    <li>E</li>
</ul>

원하는 디스플레이 :

A B
C D
E

솔루션은 Internet Explorer에서 작동 할 수 있어야합니다.


1
다음은 jquery에서 쉽게 수행하는 방법에 대한 라이브 예입니다. jsfiddle.net/EebVF/5이 jquery 플러그인 사용 : github.com/fzondlo/jquery-columns-CSS 솔루션을 사용하면 모든 것이 맞지 않기 때문에 CSS보다 더 좋습니다. 수직으로 상단에.
newUserName 여기

답변:


371

최신 브라우저

css3 columns 모듈을 사용하여 원하는 것을 지원하십시오.

http://www.w3schools.com/cssref/css3_pr_columns.asp

CSS :

ul {
  columns: 2;
  -webkit-columns: 2;
  -moz-columns: 2;
}

http://jsfiddle.net/HP85j/8/

레거시 브라우저

불행히도 IE 지원을 위해서는 JavaScript 및 dom 조작과 관련된 코드 솔루션이 필요합니다. 즉, 목록의 내용이 변경 될 때마다 목록을 열로 다시 정렬하고 다시 인쇄하기위한 작업을 수행해야합니다. 아래 솔루션은 간결성을 위해 jQuery를 사용합니다.

http://jsfiddle.net/HP85j/19/

HTML :

<div>
    <ul class="columns" data-columns="2">
        <li>A</li>
        <li>B</li>
        <li>C</li>
        <li>D</li>
        <li>E</li>
        <li>F</li>
        <li>G</li>
    </ul>
</div>

자바 스크립트 :

(function($){
    var initialContainer = $('.columns'),
        columnItems = $('.columns li'),
        columns = null,
        column = 1; // account for initial column
    function updateColumns(){
        column = 0;
        columnItems.each(function(idx, el){
            if (idx !== 0 && idx > (columnItems.length / columns.length) + (column * idx)){
                column += 1;
            }
            $(columns.get(column)).append(el);
        });
    }
    function setupColumns(){
        columnItems.detach();
        while (column++ < initialContainer.data('columns')){
            initialContainer.clone().insertBefore(initialContainer);
            column++;
        }
        columns = $('.columns');
    }

    $(function(){
        setupColumns();
        updateColumns();
    });
})(jQuery);

CSS :

.columns{
    float: left;
    position: relative;
    margin-right: 20px;
}

편집하다:

아래에서 지적했듯이 다음과 같이 열을 정렬합니다.

A  E
B  F
C  G
D

OP는 다음과 일치하는 변형을 요청했습니다.

A  B
C  D
E  F
G

변형을 수행하려면 코드를 다음과 같이 변경하면됩니다.

function updateColumns(){
    column = 0;
    columnItems.each(function(idx, el){
        if (column > columns.length){
            column = 0;
        }
        $(columns.get(column)).append(el);
        column += 1;
    });
}

2
올바른 순서로 항목을 표시하지 않습니다. jsfiddle.net/HP85j/258 예를 들어, 첫 번째 행에서 원하는 표시는 A B(오른쪽에 두 번째 요소가 추가되어야 함)이지만 예제에서는입니다 A E.
Paolo Moretti

1
훌륭한 작업이지만 열이 2 개 이상인 경우 논리에 결함이 있지만 여기서 수정 사항을 작성했습니다. jsfiddle.net/HP85j/393
Tr1stan

2
총알이 없습니다
Jaider

1
목록이 열 2보다 먼저 열 1을 채우고 싶을 가능성이 큽니다. 목록의 항목을 간단히 재정렬하여 쉽게 다운되기 전에 채워진 것처럼 보이게 할 수 있습니다. 물론 목록이 변경되면 다시 실행해야 할 수도 있습니다. 어쨌든 Gabriel의 CSS 답변은 내가 필요한 것입니다. 감사합니다!
punstress

3
최신 업데이트 일 뿐이므로 첫 번째 옵션이 최신 IE 브라우저에서 작동 할 것으로 생각합니다.
Fizz

82

나는 작동하는 @jaider의 솔루션을보고 있었지만 작업하기가 더 쉽고 브라우저에서 좋은 것으로 보인 약간 다른 접근법을 제공하고 있습니다.

ul{
    list-style-type: disc;
    -webkit-columns: 2;
    -moz-columns: 2;
    columns: 2;
    list-style-position: inside;//this is important addition
}

기본적으로 정렬되지 않은 목록은 외부에 글 머리 기호 위치를 표시하지만 일부 브라우저에서는 웹 사이트 레이아웃 방식에 따라 일부 표시 문제가 발생할 수 있습니다.

형식으로 표시하려면 :

A B
C D
E

등을 사용하십시오 :

ul li{
    float: left;
    width: 50%;//helps to determine number of columns, for instance 33.3% displays 3 columns
}
ul{
    list-style-type: disc;
}

열 표시와 관련된 모든 문제를 해결해야합니다. 귀하의 답변이이 사실을 발견하도록 안내하는 데 도움을 주신 @jaider에게 감사드립니다.


3
이 방법에 문제가 있습니다. 매우 짧은 (이 예에서는 1 자) 목록 항목을 표시하는 데 효과적입니다. 설명이 더 긴 목록을 작성하고 두 번째 열이 첫 번째와 겹치며 ul 컨테이너가 부족합니다.
Shaggy

1
float : left to display : li 요소의 inline-block을 변경하여 이것을 약간 조정했습니다. 이것은 저에게 놀라운 일이었습니다.
ZeRemz

41

이것을 의견으로 게시하려고 시도했지만 질문에 따라 열을 올바르게 표시하지 못했습니다.

당신은 요구하고 있습니다 :

AB

CD

이자형

...하지만 해결책으로 받아 들여진 대답은 다음과 같습니다.

기원 후

있다

... 답이 맞지 않거나 질문이 맞습니다.

매우 간단한 해결책은 너비를 설정 <ul>한 다음 <li>항목 을 띄우고 너비를 설정하는 것입니다.

<ul>
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>D</li>
    <li>E</li>
</ul>

ul{
    width:210px;
}
li{
    background:green;
    float:left;
    height:100px;
    margin:0 10px 10px 0;
    width:100px;
}
li:nth-child(even){
    margin-right:0;
}

예를 들어 http://jsfiddle.net/Jayx/Qbz9S/1/

질문이 잘못되면 이전 답변이 적용됩니다 (IE 지원이 부족한 경우 JS 수정).


@ 가브리엘 (Gabriel) 솔루션과 행동이 좋고 예상대로 답변을 두 드리려고하지 않습니다 ...이 질문은 잘못 해석되었을 수도 있다고 생각합니다 ... 어쨌든-질문은 아무 문제없이 대답되었습니다 정답은 : D
Jayx

16

최신 브라우저의 솔루션이 마음에 들지만 글 머리 기호가 누락되어 있으므로 약간의 트릭을 추가하십시오.

http://jsfiddle.net/HP85j/419/

ul {
    list-style-type: none;
    columns: 2;
    -webkit-columns: 2;
    -moz-columns: 2;
}


li:before {
  content: "• ";
}

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


여기서 우리는 총알의 색상을 변경하지 않고 항목의 색상을 변경할 수 있습니다. jsfiddle.net/HP85j/444
Jaider

3
list-style-position: inside;글 머리 기호가 제대로 표시되는 더 나은 솔루션 이라고 생각 합니다.
Alexis Wilke

11

가능한 해결책은 다음과 같습니다.

단편:

ul {
  width: 760px;
  margin-bottom: 20px;
  overflow: hidden;
  border-top: 1px solid #ccc;
}
li {
  line-height: 1.5em;
  border-bottom: 1px solid #ccc;
  float: left;
  display: inline;
}
#double li {
  width: 50%;
}
<ul id="double">
  <li>first</li>
  <li>second</li>
  <li>third</li>
  <li>fourth</li>
</ul>

그리고 그것은 끝났습니다.
3 열의 경우 li너비를 33 %로 사용 하고 4 열의 경우 25 % 등을 사용하십시오.


5

가장 간단한 방법입니다. CSS 만.

  1. ul 요소에 너비를 추가하십시오.
  2. 표시 추가 : 인라인 블록 및 새 열의 너비 (ul 너비의 절반보다 작아야 함)
ul.list {
  width: 300px;  
}

ul.list li{
  display:inline-block;
  width: 100px;
}
<ul class="list">
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>D</li>
    <li>E</li>
</ul>

2
이 답변이 현재 문제를 해결하는 데 OP에 어떻게 도움이되는지에 대한 답변이 포함 된 설명을 추가하십시오
ρяσѕρєя K

4

CSS 만 사용 하여 두 개 이상의 열을 설정할 수 있습니다

AE

 <ul class="columns">
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>D</li>
    <li>E</li>
</ul>

ul.columns  {
   -webkit-columns: 60px 2;
   -moz-columns: 60px 2;
    columns: 60px 2;
   -moz-column-fill: auto;
   column-fill: auto;
 }

3

이것은 부모 div의 열 수 CSS 속성을 사용하여 달성 할 수 있습니다.

처럼

 column-count:2;

자세한 내용은 이것을 확인하십시오.

부동 DIV 목록을 행이 아닌 열에 표시하는 방법


1
column-count항목을 올바른 순서로 표시하지 않습니다. 예를 들어 첫 번째 줄에서 원하는 표시는 A B(오른쪽에 두 번째 요소를 추가해야 함)이지만 사용 column-count하면입니다 A E.
Paolo Moretti

2

예를 들어 jQuery-Columns 플러그인 으로이 작업을 쉽게 수행 할 수 있습니다. 예를 들어 .mylist 클래스로 ul을 분할하면

$('.mylist').cols(2);

다음 은 jsfiddle에 대한 실제 예입니다.

CSS 솔루션을 사용하면 모든 것이 수직으로 정렬되지 않기 때문에 CSS보다 이것을 좋아합니다.


흥미롭지 만 실제로는 <ul>여러 목록으로 목록을 나눕니다 . 다른 것들을 복잡하게 만들 수 있습니다.
Alexis Wilke

이것은 실제로 제가 고마워했던 해결책이었습니다. downvoter 에게이 답변은 OP의 질문을 읽고 DV가 필요없는 경우 유효합니다.
Tricky

2

몇 년 후 더 많은 답변!

이 기사에서 : http://csswizardry.com/2010/02/mutiple-column-lists-using-one-ul/

HTML :

<ul id="double"> <!-- Alter ID accordingly -->
  <li>CSS</li>
  <li>XHTML</li>
  <li>Semantics</li>
  <li>Accessibility</li>
  <li>Usability</li>
  <li>Web Standards</li>
  <li>PHP</li>
  <li>Typography</li>
  <li>Grids</li>
  <li>CSS3</li>
  <li>HTML5</li>
  <li>UI</li>
</ul>

CSS :

ul{
  width:760px;
  margin-bottom:20px;
  overflow:hidden;
  border-top:1px solid #ccc;
}
li{
  line-height:1.5em;
  border-bottom:1px solid #ccc;
  float:left;
  display:inline;
}
#double li  { width:50%;}
#triple li  { width:33.333%; }
#quad li    { width:25%; }
#six li     { width:16.666%; }

1

에서는 updateColumns()필요 if (column >= columns.length)보다는 if (column > columns.length)(C는, 예를 들어 스킵) 따라서 모든 요소를 나열 :

function updateColumns(){
    column = 0;
    columnItems.each(function(idx, el){
        if (column >= columns.length){
            column = 0;
        }
        console.log(column, el, idx);
        $(columns.get(column)).append(el);
        column += 1;
    });
}

http://jsfiddle.net/e2vH9/1/



1

페이지의 여러 목록에 영향을 미치고 싶기 때문에 단일 답변의 레거시 솔루션이 효과가 없었으며 답변은 단일 목록을 가정하고 공정한 전역 상태를 사용합니다. 이 경우에는 모든 목록을 변경하고 싶습니다 <section class="list-content">.

const columns = 2;
$("section.list-content").each(function (index, element) {
    let section = $(element);
    let items = section.find("ul li").detach();
    section.find("ul").detach();
    for (let i = 0; i < columns; i++) {
        section.append("<ul></ul>");
    }
    let lists = section.find("ul");
    for (let i = 0; i < items.length; i++) {
        lists.get(i % columns).append(items[i]);
    }
});

예를 들어 두 개의 열을 생성하는 것이 어떻게 가능합니까? 하나는 타일을 포함하고 다른 하나는 순서가없는 목록입니까?
Dalek

무슨 뜻인지 잘 모르겠습니다. 제목이있는 일련의 항목이있는 경우 제목, 항목, 제목, 항목으로 단일 목록에 넣을 수 있습니다.
Tom

1

가브리엘의 대답이 어느 정도 작동한다는 것을 알았지 만 목록을 세로로 주문하려고 할 때 다음을 발견했습니다 (첫 번째 ul AD 및 두 번째 ul EG).

  • ul에 짝수의 li이있을 때 ul의 울퉁불퉁 한 부분에 골고루 퍼지지 않았습니다.
  • ul에서 데이터 열을 사용하면 잘 작동하지 않는 것 같습니다 .3 열에 4를 입력해야했지만 여전히 JS가 생성 한 ul 중 2 개로 li을 분산시키는 것입니다.

위의 내용이 발생하지 않도록 JQuery를 수정했습니다.

(function ($) {
    var initialContainer = $('.customcolumns'),
        columnItems = $('.customcolumns li'),
        columns = null,
        column = 0;
    function updateColumns() {
        column = 0;
        columnItems.each(function (idx, el) {
            if ($(columns.get(column)).find('li').length >= (columnItems.length / initialContainer.data('columns'))) {
                column += 1;
            }
            $(columns.get(column)).append(el);
        });
    }
    function setupColumns() {
        columnItems.detach();
        while (column++ < initialContainer.data('columns')) {
            initialContainer.clone().insertBefore(initialContainer);
            column++;
        }
        columns = $('.customcolumns');
        updateColumns();
    }

    $(setupColumns);
})(jQuery);
.customcolumns {
  float: left;
  position: relative;
  margin-right: 20px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <ul class="customcolumns" data-columns="3">
    <li>A</li>
    <li>B</li>
    <li>C</li>
    <li>D</li>
    <li>E</li>
    <li>F</li>
    <li>G</li>
    <li>H</li>
    <li>I</li>
    <li>J</li>
    <li>K</li>
    <li>L</li>
    <li>M</li>
  </ul>
</div>

-1

Thisd는 몇 년 동안 나를 위해 완벽한 솔루션이었습니다.

http://css-tricks.com/forums/topic/two-column-unorder-list/


3
"항상 대상 사이트에 연결할 수 또는 영구적으로 오프라인이 경우, 중요한 링크의 대부분의 관련 부분을 인용" - stackoverflow.com/help/how-to-answer
Sk8erPeter

필요 없음-사용 된 Abdul너비 및 ID와 동일하게 그의 답변에 사용 된 코드에 대한 링크 / 참조입니다 .
cssyphus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.