如何在两列中显示无序列表?

使用下面的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兼容。

522746 次浏览

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

就像

 column-count:2;

查看更多细节。

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

现代浏览器

利用css3列模块来支持您正在寻找的内容。

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;
});
}

我试着把这作为评论发布,但不能让列显示正确(根据你的问题)。

你需要:

一个B

C D

E

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

D

B E

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/

如果你的问题是错误的,那么前面的答案适用(与JS修复缺乏IE支持)。

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/

这里有一个可能的解决方案:

代码片段:

.
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%,以此类推

你可以很容易地用jQuery-Columns插件来做到这一点,例如用你会做的.mylist类来分割一个ul

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

这是一个jsfiddle的实例

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

这对我来说是一个完美的解决方案,我找了很多年:

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

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

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

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




li:before {
content: "• ";
}

enter image description here

几年后再来一个答案!

在本文中: 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%; }

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

这是最简单的方法。CSS。

  1. 为ul元素添加width。
  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>

与引导……这个答案(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/

上面答案中的遗留解决方案不适合我,因为我想影响页面上的多个列表,而答案假设一个列表加上它使用了相当多的全局状态。在这种情况下,我想改变<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]);
}
});

可以使用CSS只来设置两列或更多列

一个E

B

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;
}

虽然我发现加布里埃尔在一定程度上回答了工作,但我确实发现了以下问题,当我试图垂直排列列表时(第一个ul a - d和第二个ul E-G):

  • 当ul中有偶数个li时,它并没有均匀地分布在ul中
  • 在ul中使用数据列似乎工作得不太好,我不得不为3列放4,即使这样,它仍然只是将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>

下面是一个简单的方法,使用简单的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>

现在,为了得到预期的结果,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>

这对我很管用。 最好的解决方案是因为一行中的单元格具有相同的高度而不考虑内容

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>

假设多列布局可以很好地与居中布局一起工作,justifygrid布局与水平gap

p {
text-align: justify;
}


ul {
display: grid;
grid-template-columns: repeat(3, auto);
justify-content: space-around;
gap: 0 3em;
text-transform: capitalize;
}
<p>In publishing and graphic design, Lorem ipsum is a placeholder text commonly used to demonstrate the visual form of a document or a typeface without relying on meaningful content. Lorem ipsum may be used as a placeholder before final copy is available.</p>
<ul>
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
<li>five</li>
<li>six</li>
<li>seven</li>
<li>eight</li>
<li>nine</li>
<li>ten</li>
</ul>
<p>In publishing and graphic design, Lorem ipsum is a placeholder text commonly used to demonstrate the visual form of a document or a typeface without relying on meaningful content. Lorem ipsum may be used as a placeholder before final copy is available.</p>