假设我有这样的HTML:

<h3>Features</h3>
<ul>
    <li><img src="alphaball.png">Smells Good</li>
    <li><img src="alphaball.png">Tastes Great</li>
    <li><img src="alphaball.png">Delicious</li>
    <li><img src="alphaball.png">Wholesome</li>
    <li><img src="alphaball.png">Eats Children</li>
    <li><img src="alphaball.png">Yo' Mama</li>
</ul>

和这个CSS:

li { text-align:center; display:inline-block; padding:0.1em 1em }
img { width:64px; display:block; margin:0 auto }

结果可以在这里看到:http://jsfiddle.net/YMN7U/1/

现在想象一下,我想把它分成三列,相当于在第三列<li>后面注入一个<br>。(实际上这样做在语义和语法上都是无效的。)

我知道如何在CSS中选择第三个<li>,但我如何在它之后强制换行?这行不通:

li:nth-child(4):after { content:"xxx"; display:block }

我也知道这种特殊的情况是可能的使用浮动而不是内联块,但我不感兴趣的解决方案使用浮动。我也知道,对于固定宽度的块,这是可能的,通过设置父ul的宽度约为3倍的宽度;我对这个解决方案不感兴趣。我还知道如果我想要真正的列,我可以使用display:table-cell;我对这个解决方案不感兴趣。我感兴趣的是在内联内容中强制中断的可能性。

编辑:需要澄清的是,我感兴趣的是“理论”,而不是某个特定问题的解决方案。CSS可以在显示的中间注入换行符:inline(-block)?元素,还是不可能?如果你确定这是不可能的,这是一个可以接受的答案。


你对问题的许多“解决方案”不感兴趣。我不认为真的有一个好方法去做你想做的事情。使用:after和content插入的任何内容都具有与您自己写入时完全相同的语法和语义有效性。

CSS提供的工具。你应该只是浮动lis,然后当你想开始一个新的行时,清除:left,正如你提到的:

参见示例:http://jsfiddle.net/marcuswhybrow/YMN7U/5/


我已经能够使它在内联LI元素上工作。不幸的是,如果LI元素是内联块的,它就不起作用:

现场演示:http://jsfiddle.net/dWkdp/

或者悬崖笔记的版本:

li { 
     display: inline; 
}
li:nth-child(3):after { 
     content: "\A";
     white-space: pre; 
}

当重写html被允许时,你可以在<ul>中嵌套<ul>s,并让内部的<li>s显示为内联块。这在语义上也有意义,因为分组也反映在html中。


<ul>
    <li>
        <ul>
            <li>Item 1</li>
            <li>Item 2</li>
            <li>Item 3</li>
        </ul>
    </li>
    <li>
        <ul>
            <li>Item 4</li>
            <li>Item 5</li>
            <li>Item 6</li>
        </ul>
    </li>
</ul>

li li { display:inline-block; }

Demo

$(function() { $('img').attr('src', 'http://phrogz.net/tmp/alphaball.png'); }); h3 { border-bottom: 1px solid #ccc; font-family: sans-serif; font-weight: bold; } ul { margin: 0.5em auto; list-style-type: none; } li li { text-align: center; display: inline-block; padding: 0.1em 1em; } img { width: 64px; display: block; margin: 0 auto; } <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <h3>Features</h3> <ul> <li> <ul> <li><img />Smells Good</li> <li><img />Tastes Great</li> <li><img />Delicious</li> </ul> </li> <li> <ul> <li><img />Wholesome</li> <li><img />Eats Children</li> <li><img />Yo' Mama</li> </ul> </li> </ul>


将列表拆分为行的一种简单方法是浮动单个列表项,然后将您想要转到下一行的项清除浮动。

例如

<li style="float: left; display: inline-block"></li>
<li style="float: left; display: inline-block"></li>
<li style="float: left; display: inline-block"></li>

<li style="float: left; display: inline-block; clear: both"></li> --- this will start on a new line
<li style="float: left; display: inline-block"></li>
<li style="float: left; display: inline-block"></li>

我知道你们不想用浮点数,这个问题只是理论上的但如果有人觉得这个有用,这里有一个使用浮点数的解决方案。

在你想要浮点的li元素中添加一个左类:

<li class="left"><img src="http://phrogz.net/tmp/alphaball.png">Smells Good</li>

并修改您的CSS如下:

li { text-align:center; float: left; clear: left; padding:0.1em 1em }
.left {float: left; clear: none;}

http://jsfiddle.net/chut319/xJ3pe/

您不需要指定宽度或内联块,并且可以追溯到IE6。


也许这是完全可能的,只有CSS,但我更喜欢避免“浮动”尽可能多,因为它干扰它的父高度。

如果你正在使用jQuery,你可以创建一个简单的“wrapN”插件,它类似于“wrapAll”,除了它只包装“N”个元素,然后使用循环打破和包装下一个“N”个元素。然后设置你的包装类为' display: block; '。

(function ($) {
    $.fn.wrapN = function (wrapper, n, start) {
        if (wrapper === undefined || n === undefined) return false;
        if (start === undefined) start = 0;
        for (var i = start; i < $(this).size(); i += n)
           $(this).slice(i, i + n).wrapAll(wrapper);
        return this;
    };
}(jQuery));

$(document).ready(function () {
    $("li").wrapN("<span class='break' />", 3);
});

下面是成品的JSFiddle:

http://jsfiddle.net/dustinpoissant/L79ahLoz/


一个更好的解决方案是使用-webkit-columns:2;

http://jsfiddle.net/YMN7U/889/

 ul { margin:0.5em auto;
-webkit-columns:2;
}

我通过为行中的第一个内联元素创建一个::before选择器来实现这一点,并使该选择器成为一个具有上下边距的块,以便将行稍微分开。

.1st_item::before
{
  content:"";
  display:block;
  margin-top: 5px;
}

.1st_item
{
  color:orange;
  font-weight: bold;
  margin-right: 1em;
}

.2nd_item
{
  color: blue;
}

请注意,这将工作,取决于您如何呈现页面。但是如果开始一个新的无序列表呢?

i.e.

<德> < li > < li > < li > < /德> < !-开始一个新的ul到断开它-> <德>