包装时如何使列表项在网格上排列?

Posted

技术标签:

【中文标题】包装时如何使列表项在网格上排列?【英文标题】:How can I make list items line up on a grid when wrapping? 【发布时间】:2016-03-22 00:20:10 【问题描述】:

假设我有以下 <ul> 用于响应式设计:

li 
  display: inline;
  padding-right: 1em;
<ul>
  <li>
    MenuItemHeinz
  </li>
  <li>
    MenuItemHinrich
  </li>
  <li>
    MenuItemRoffen
  </li>
  <li>
    MenuItemStaffRoffeltack
  </li>
  <li>
    MenuItemHeinz
  </li>
</ul>

当我调整浏览器窗口的大小或在手机中查看页面时,它会像这样中断:

我怎样才能让菜单项在它们中断时在网格上很好地排列,例如像这样?最好只使用css ...当然;)

【问题讨论】:

【参考方案1】:

这个布局用 CSS flexbox 比较简单。

ul 
  display: flex;
  flex-wrap: wrap;
  list-style-type: none;
  padding-left: 0;


ul li 
  flex: 0 0 calc(50% - 10px);
  margin: 5px;
  padding: 5px 0;
  text-align: center;
  box-sizing: border-box;
  border: 1px dashed red;
  background-color: yellow;
<ul>
  <li><a href="#">item</a></li>
  <li><a href="#">item</a></li>
  <li><a href="#">item</a></li>
  <li><a href="#">item</a></li>
  <li><a href="#">item</a></li>
  <li><a href="#">item</a></li>
  <li><a href="#">item</a></li>
  <li><a href="#">item</a></li>
  <li><a href="#">item</a></li>
  <li><a href="#">item</a></li>
  <li><a href="#">item</a></li>
</ul>

jsFiddle demo

浏览器支持: 所有主流浏览器都支持 Flexbox,except IE < 10。一些最新的浏览器版本,例如 Safari 8 和 IE10,需要vendor prefixes。要快速添加前缀,请使用Autoprefixer。更多详情this answer。

【讨论】:

更多超级答案,感谢您编辑我的帖子。你拯救了我的一天。【参考方案2】:

您可以使用css columns 和媒体查询。

li 
  display: inline;
  padding-right: 1em;

@media(max-width: 680px) 
  ul 
    -webkit-column-count: 2;
    -moz-column-count: 2;
    column-count: 2;
  
  li 
    display:block;
  
<ul>
  <li>
    MenuItemHeinz
  </li>
  <li>
    MenuItemHinrich
  </li>
  <li>
    MenuItemRoffen
  </li>
  <li>
    MenuItemStaffRoffeltack
  </li>
  <li>
    MenuItemHeinz
  </li>
</ul>

【讨论】:

超级答案,我已经部署了它。但我希望找到一种方法使列表仍然从左到右,跨列,而不是在行上和下。

以上是关于包装时如何使列表项在网格上排列?的主要内容,如果未能解决你的问题,请参考以下文章

如何基于选择列表过滤交互式网格?

在颤动的网格视图中将最后一行项目居中

如何使剑道网格列自动宽度

编辑网格时,如何按行禁用特定字段? Kendo UI ASP.Net MVC 包装器

如何使网格列表中的每一行具有相同数量的项目(使用 Flexbox)? [复制]

当列表项在 d-flex 中向左浮动时对齐列表中心