277

使用以下 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 一起使用。

4

18 回答 18

478

现代浏览器

利用 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>

JavaScript:

(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;
    });
}
于 2013-02-07T06:59:47.140 回答
90

我正在查看@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,因为您的回复帮助我发现了这一点。

于 2014-07-24T03:30:06.843 回答
46

我尝试将此作为评论发布,但无法正确显示列(根据您的问题)。

您要求:

AB

光盘

...但作为解决方案接受的答案将返回:

广告

C

...所以要么答案不正确,要么问题是。

一个非常简单的解决方案是设置你的宽度,<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 修复)。

于 2013-02-07T09:58:20.490 回答
19

我喜欢现代浏览器的解决方案,但是缺少项目符号,所以我添加了一个小技巧:

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

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


li:before {
  content: "• ";
}

在此处输入图像描述

于 2014-06-12T15:44:40.747 回答
15

这是一个可能的解决方案:

片段:

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%,依此类推。

于 2014-04-29T08:17:15.670 回答
13

现在,对于预期的结果,display:grid;会做(最简单的?)

ul {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
}
<ul>
  <li>A</li>
  <li>B</li>
  <li>C</li>
  <li>D</li>
  <li>E</li>
</ul>

您还可以让列在左侧缩小并且能够具有不同的宽度:

ul {
  display: grid;
  grid-template-columns: repeat(2, auto);
  justify-content: start;
}

li {
  margin-left: 1em;
  border: solid 1px;/*see me */
}
<ul>
  <li>A</li>
  <li>B</li>
  <li>C 123456</li>
  <li>D</li>
  <li>E</li>
</ul>

于 2020-12-03T19:23:49.583 回答
7

这是最简单的方法。仅限 CSS。

  1. 为 ul 元素添加宽度。
  2. 添加 display:inline-block 和新列的宽度(应小于 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>
于 2016-05-11T10:36:55.043 回答
6

您只能使用CSS设置两列或更多列

AE

C

D

 <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;
 }
于 2019-01-13T11:24:08.530 回答
4

这可以使用父 div 上的 column-count css 属性来实现,

 column-count:2;

查看此内容以获取更多详细信息。

如何使浮动 DIV 列表出现在列中,而不是行中

于 2013-02-07T06:54:17.190 回答
2

您可以使用jQuery-Columns 插件非常轻松地做到这一点,例如将 ul 与您会做的 .mylist 类分开

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

这是jsfiddle 上的一个活生生的例子

我比 CSS 更喜欢这个,因为 CSS 解决方案并不是所有的东西都垂直对齐到顶部。

于 2014-05-03T14:26:08.457 回答
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%; }
于 2014-07-21T20:36:57.620 回答
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/

于 2014-04-14T20:32:14.570 回答
1

使用 Bootstrap ... 这个答案(https://stackoverflow.com/a/23005046/1128742)让我指出了这个解决方案:

<ul class="list-unstyled row">
   <li class="col-xs-6">Item 1</li>
   <li class="col-xs-6">Item 2</li>
   <li class="col-xs-6">Item 3</li>
</ul>

http://jsfiddle.net/patrickbad767/472r0ynf/

于 2017-01-31T16:08:52.407 回答
1

最佳答案中的旧版解决方案对我不起作用,因为我想影响页面上的多个列表,而答案假设一个列表加上它使用了相当多的全局状态。在这种情况下,我想更改 a 中的每个列表<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]);
    }
});
于 2017-06-09T16:22:47.553 回答
1

尽管我发现 Gabriel 的回答在一定程度上起作用,但在尝试垂直排序列表时确实发现了以下内容(第一个 ul AD 和第二个 ul EG):

  • 当 ul 中有偶数个 li 时,它并没有均匀地分布在 ul 中
  • 在 ul 中使用数据列似乎效果不佳,我不得不将 4 列放入 3 列,即便如此,它仍然只是将 li 传播到 JS 生成的 ul 的 2 中

我已经修改了 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>
于 2020-02-29T14:40:16.527 回答
1

这对我有用。是最好的解决方案,因为一行中的单元格具有相同的高度而无需照顾内容

ul {
  display: grid;
  grid-template-columns: repeat(2, 1fr); 
  list-style-position: inside;
  list-style-type: none;
}
li {  border: solid 1px; }
<ul>
  <li>asdasd asdad asdasd asdasd adasdasdasd adasdadadada adadas dasdadasdasd asd aA</li>
  <li>B</li>
  <li>C</li>
  <li>D</li>
  <li>E</li>
</ul>

于 2021-10-15T16:26:26.267 回答
0

这是使用简单的 CSS 制作多列列表的简单方法。如果需要,样式标签显然可以放入 CSS 中。

<p>Materials List</p>
<ul style="display: inline-block; float: left">
    <u>Item Description<u>
    <li>1/2" x 4' wood dowel</li>
    <li>1/2" x 12"  PVC pipe</li>
    <li>1/2" PVC pipe end cap</li>
    <li>7/16" x 3" light duty expansion spring</li>
    <li>6" plastic zip ties</li>
    <li>Light weight antenna</li>
</ul>
<div style="display: inline-block; margin-left: 1em">
    <u>Qty</u>
    <div style="text-indent: 0.5em">3</div>
    <div style="text-indent: 0.5em">1</div>
    <div style="text-indent: 0.5em">1</div>
    <div style="text-indent: 0.5em">2</div>
    <div style="text-indent: 0.5em">8</div>
    <div style="text-indent: 0.5em">1</div>
</div>
<p></p>
于 2020-11-13T06:49:17.677 回答
-1

Thisd 对我来说是一个完美的解决方案,多年来一直在寻找:

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

于 2014-05-23T08:29:02.193 回答