读者 Marcin A 提出了关于一个简单的无序列表的问题,他希望将列表项垂直排列(从上到下),而不是水平排列(从左到右)。
所以像这样的标记
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
</ul>
最终会变成这样
1 4
2 5
3 6
好吧,Marcin,不幸的是,你可能想要的 float: down;
不存在。有很多方法可以实现,但正如你可能猜到的那样,所有方法都有其局限性。
绝对定位
如果你知道你想要像文本图表那样确切的布局,并且知道每个元素的确切宽度和高度,那么你可以更容易地使用绝对定位来创建这种布局。这有很多 如果,但如果它主要是一组图像,则可能是这种情况。
查看 Chris Coyier 在 CodePen 上创建的 Pen gasif (@chriscoyier)
Noah Blon 提供了一个基于 Sass 的自动化版本,以便更容易地处理任意数量的列表项。
查看 Noah Blon 在 CodePen 上创建的 Pen 垂直方向的 2 列列表 – IE9+ (@noahblon)
Flexbox 列
Flexbox 就是为这种事情而生的。你可以将无序列表设为一个 flex 容器,并使用列方向,并允许换行。本质上
ul {
display: flex;
flex-direction: column;
flex-wrap: wrap;
}
为了完全匹配布局,我将为 flex 容器应用宽度和高度。如果你没有设置宽度,则每列将根据需要尽可能宽,以填充容器。如果你没有设置高度,则项目将不会换行。
查看 Chris Coyier 在 CodePen 上创建的 Pen yHoeI (@chriscoyier)
提醒一下,为了获得最佳支持,你需要 混合使用语法。
这里的优点是项目可以是任何大小,并且行为会保持一致。缺点是仅限 IE 10+。
文本列
另一种可能性是将项目设为内联块,并使用 CSS3 文本列。本质上
ul {
column-count: 2;
column-gap: 0;
}
li {
display: inline-block;
}
每个块的行为就像普通文本一样,它会在垂直方向填充列,然后再移到下一列。
查看 Chris Coyier 在 CodePen 上创建的 Pen oFyEH (@chriscoyier)
文本列在容器的宽度上平均分割,因此,如果你想非常具体地指定列宽,则必须具体指定容器的宽度。
这与 flexbox 的区别在于,它会尽力将元素在列之间平均分配。因此,如果你不想声明高度,则不必声明。
请自行添加前缀,并且同样仅限 IE 10+。
还有其他方法吗?
让我们听听你的想法!CSS很有趣。也许将来可以使用网格布局?
绝对不错!
但是表格元素如何实现呢?这将非常棒。
http://cdpn.io/yHoeI 可用于 ie9+,但你需要知道项目数量,并且不确定这在未知宽度的情况下如何发挥作用
flexbox 选项需要供应商前缀才能在 Firefox 上工作,或者 Firefox 根本不支持该语法?
是的,我也没有在 FF 中看到任何换行。
Firefox 尚未支持 flex-wrap。你可以在这里关注进度:https://bugzilla.mozilla.org/show_bug.cgi?id=702508
了解了。还要知道它可能会在今年得到支持(参见错误报告中的最后 3 条评论)
^ 应该是 http://codepen.io/anon/pen/CnIJe
我真的很喜欢这个解决方案。它简洁明了……并且没有兼容性问题
也许我没有遇到问题,但是……
http://codepen.io/anon/pen/zuArf
啊,抱歉,删除我的评论 :)
这将是一个简单的选项……如果
<div>
在<ul>
内是有效的 HTML(在我看来没有理由不有效,但它不是):http://codepen.io/stucox/pen/twrCG不过几乎所有浏览器仍然可以正常渲染。
你可以使用 CSS 列。请参阅我在这里的示例:http://codepen.io/anon/pen/tgcow
是的!我在文章中也完全提到了这一点。
这里有一个使用 简单浮动和少量技巧的示例。
(对于此解决方案,你仅在某些情况下需要知道宽度。如果你的列表内容是简单的文本,则 3/4/5 的内容将在浮动的 1/2/3 周围流动,而无需任何特定宽度的边距。)
如何使用 3 列实现?“clear” 会弄乱它吗?
是的,“clear” 使此方法只能用于 2 列。它之所以有效是因为第二列实际上没有浮动。
可能会有一个 float: bottom。如果书籍和图表的 CSS 规范通过了 (http://blog.whatwg.org/css-books-css-figures)。
也许使用一些额外的标记?
http://codepen.io/Bennyville/pen/KIbtA
哦,无序列表……我的错 :)
你有没有想过添加更多
内容而不是仅仅发布文章?我的意思是,你所说的话很重要
等等。但是想象一下,如果你添加了一些很棒的图片或视频
剪辑来让你的帖子更有“活力”!你的内容很棒,但是有了
图片和视频,这个网站绝对可以
成为其领域内最好的网站之一。很棒的博客!
使用浮动和内联块元素的混合可以解决问题
http://codepen.io/nobuti/pen/kuEio
我不知道 ~ 选择器——非常方便!
我想以更简洁的方式添加这个,并进行一些解释。
假设
1 - 你知道集合中有多少列表项,就个人而言,我会在服务器端为动态列表大小的中点应用一个类
2 - 你知道列表项的尺寸,或者愿意使用 border-collapse 或无边框来启用基于百分比的定位
3 - 你不需要支持 ie8(或为 nth-child 使用 polyfill)
在满足这些方面的情况下,您可以使用 nth-child(4) 来定位(对于 6 个项目的情况)第一个超过中点的项目,并使用负上边距将其拉出流,后续项目将与此一起流动。然后,您可以使用 nth-child(n+4) 来定位第一个超过中点的项目和后续项目,并添加左边距。
http://codepen.io/anon/pen/nkgaG
最简单,最丑陋,但有效 :)
http://codepen.io/erykpiast/pen/Hdfyu
只需使用 float: right 并使其看起来像 float: bottom。
类似于 AP(但没有将元素移出流),您可以使用边距来定位元素。像这样:
我希望文本列作为 flex box 的可行替代方案。但是,应该注意的是,在 Webkit 中,如果你的项目高度不都相等,那么你将在所有列的底部得到一种奇怪的空间,即使是最高的列也是如此(这很奇怪);我猜这是通常的 webkit 空白区域错误。
取消那个 webkit 错误。我错了.. 这种行为仅在您为项目指定宽度时才会发生,Chris 确实对此进行了警告。
好的,我潜伏了一段时间,这是我的第一篇文章,所以请即使这需要 IE 的 hack 也请温柔。
css 非常简单,对于任何使用现代浏览器的用户来说都是语义化的。
如果不是 - 那么你就自食其果。
使用一个包含列数的 div,然后使用 IE 的条件注释将其转换为向左浮动的单个列表。
例如:http://fastexas.org/honors/district.php
或此 codepen:http://codepen.io/RioBrewster/pen/CafsF
(你需要在 ieHacks.css 文件中使用它。CodePen 似乎没有忽略条件中的这个内容)
非常有用的提示!感谢分享
但是我不太喜欢 flex 属性,因为它在移动设备上的性能较低..
根据需要,可以使用
position: relative;
,然后使用:nth-child()
以及top: items-compiled-height-px;
和left: items-width-px
。Codepen 链接
我认为这在语义上应该是一个有序列表,对吧?