CSS在特定“ inline-block”项之前/之后换行


202

假设我有以下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/

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

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

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

我也知道使用float代替可以实现这种特殊情况inline-block,但是我对使用的解决方案不感兴趣float。我也知道,对于固定宽度的块,可以通过将父对象的宽度设置为该宽度的ul3倍来实现。我对此解决方案不感兴趣。我也知道,display:table-cell如果我需要真实的列,可以使用它。我对此解决方案不感兴趣。我对强制在内联内容中中断的可能性感兴趣。

编辑:明确地说,我对“理论”感兴趣,而不是对特定问题的解决方案。CSS可以在display:inline(-block)?元素中间插入换行符吗,还是不可能?如果您确定这是不可能的,那是可以接受的答案。


2
将第一三和第二三放在两个不同的列表中?我假设你不希望这样做,但我想我的“D扔在那里。
JakeParis

看来您需要告诉我们您在这里真正想要实现的目标,以便有人可以推荐最佳方法。您排除的所有选项都可以解决您遇到的问题,为什么还需要其他解决方案?
杰克

4
@Jake实际上,我确实按照我所说的做:使用元素的语义列表,并希望在特定元素之后进行包装。在实践中,我设置了容器的宽度,但这仅在我的特定情况下有效,因为项目碰巧具有相同的宽度,并且我希望它们在一致的边缘处缠绕。并非总是如此。我真正要实现的目标是了解CSS是否可以在内联流程中间强制换行。可以肯定的回答“这绝对不可能”(如果正确)。
Phrogz 2011年

Answers:


302

我已经能够使其适用于内联LI元素。不幸的是,如果LI元素是内联块,则它不起作用:

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

或悬崖笔记版本:

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

2
Sime,为什么不输出“ \ A”?我尝试过的所有内容:after始终会打印为纯文本。
JakeParis 2011年

12
@JMCCreative这是ASCII 0x0A,又称为LF(换行)字符。参见w3.org/TR/CSS2/syndata.html#strings
Phrogz,2011年

5
@JMC \A是换行符......这是一种逃避
森那维达斯


18
我每隔几个月就会再提这个问题,因此在这里发表评论...它不适用于inline-block,因为您在某个行内添加了换行符,使之像行内上下文中的块容器一样。如果您可以通过在<li>之间插入换行符来打破上下文,那么它将起作用。真可惜,因为这对于响应式设计断点很有用。我猜大多数时候“内联”与列表的内联块一样有用
user1010892 2013年

21

您对问题的许多“解决方案”都不感兴趣。我认为确实没有什么好方法可以做您想做的事。您使用插入的任何内容:aftercontent都具有与您自己在其中编写的语法和语义有效性完全相同的语法和语义。

CSS工具提供工作。如前所述,您应该只浮动lis,然后clear: left在要换行时开始:

查看范例:http : //jsfiddle.net/marcuswhybrow/YMN7U/5/


18
该OP不感兴趣您的解决方案:)
森那维达斯

2
:after语法上有效,您无法做的任何事情都是好主意,因为已经有执行此操作的工具。因此答案。
Marcus Whybrow

32
不使用浮点数的原因之一是没有诸如此类的东西float: center
失明的眼神2012年

7
加上内联代码块,可以进行浮动无法进行的所有垂直对齐
user1010892 2013年

20
“您使用:after和content插入的所有内容都具有完全相同的句法和语义有效性”-来晚了,但是我完全不同意-使用:before和:after的全部要点是能够插入样式不会干扰HTML的语义。
罗珀特

4

允许重写html时,您可以将<ul>s 嵌套在内,<ul>而仅将内部<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; }

演示版

$(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>


3

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

例如

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

17
您应该注意到该float设置将覆盖该inline-block设置。他们并没有真正共存
Itay 2014年

4
如果您使用text-aling:center; 它不会工作(浮动休息吧)
ПавелИванов

3

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

li在要浮动的元素上添加一个left类:

<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。


1

我通过为该行中的第一个内联元素创建一个:: before选择器,并使该选择器成为一个具有顶部或底部边距的块来稍微分隔行来实现此目的。

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

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

.2nd_item
{
  color: blue;
}

-1

请注意,这将起作用,具体取决于您渲染页面的方式。但是,如何开始一个新的无序列表呢?

<ul>
<li>
<li>
<li>
</ul>
<!-- start a new ul to line break it -->
<ul>


-2

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

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

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

对于某些用例,这可能是一个合理的解决方案。在这种情况下,这不是一个很好的解决方案,因为它会完全重新排序内容,使其先后排列,然后再向下排列。
Phrogz

5
谁想制作只在少数浏览器中可用的Web应用程序?
user2867288

-3

也许只有CSS才有可能实现,但是我宁愿尽量避免“浮动”,因为它会影响其父母的身高。

如果您使用的是jQuery,则可以创建一个类似于`wrapAll`的简单的`wrapN`插件,只是它只包装“ 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/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.