【问题标题】:css multiline menu taking up the entire widthcss 多行菜单占据整个宽度
【发布时间】:2013-11-06 13:02:31
【问题描述】:

可能已经有解决方案或示例,但我一直找不到。

我想创建一个菜单,其中包含不同数量的菜单项,每个菜单项的宽度都不同(取决于它们的内容)。如果菜单项太多,我希望它们占据多行。

我的第一个解决方案是一个简单的浮动。很好,但是在行的末尾有一个不均匀的未占用空间:

忽略项目上的“文本”宽度相同。我只是画画很烂。想象一下,文本有不同的长度,但它们周围的填充相同。

有一个棘手的边框(仅在项目左侧的边框)我可以将它隐藏一点,但可点击区域仍然与上图的白色部分相同。悬停效果也揭示了这个技巧。


然后我对 text-align justify 做了一些研究,并找到了这样的解决方案:"text-align: justify;" inline-block elements properly?

乍一看,这正是我想要的。元素对齐正确,它们一见钟情就填满了可用空间。但是有一个根本的缺陷:它们之间有差距:

这是意料之中的,因为这会将我的元素视为文本中的单词。我找不到解决此问题的方法。


后来我开始在flexbox land 中四处寻找。这看起来很有前途的 flexbox 似乎是 css 的圣杯,但我还没有完全理解它。


基本上我想要的是这样的:

按钮填满可用空间,菜单是多行的(当一行元素过多时),整个菜单都是可点击的(具有可见的悬停效果)。

有没有办法做到这一点?

我对使用 javascript 支持的解决方案(例如计算和调整元素的宽度)犹豫不决。但是如果有一个非常干净的解决方案,我可能最终会使用它。


编辑

菜单here 看起来不错,但前提是菜单是单行的。这会通过将最后一个元素添加到不同的列表并使用不可见的 :after { content ". . ." } 元素添加大量空间来破解最后一个元素。

【问题讨论】:

  • 注释掉内联块元素之间的空格
  • @Pete 你的意思是内联块证明解决方案吗?这样就没有道理了。
  • 一直在玩 flex 的东西,这在 chrome 和 IE10 中有效,但没有别的:jsfiddle.net/74AJD/6。我可能会使用 js 解决方案 - 这是您最好的选择,而 flex 框不受完全支持
  • 如果它可以在所有主流浏览器上运行,那就太棒了!
  • @Pete 唯一的问题是 Firefox 是 missing multi line flexbox support。否则这正是我想要的。

标签: css menu


【解决方案1】:

如果您使用以下 flexbox 样式,它将在 IE10 和 chrome 中实现您想要的。但是我认为这在所有浏览器中都没有得到完全支持。

HTML

<ul>
    <li>test test</li>
    <li>test</li>
    <li>test testtest</li>
    <li>testtest</li>
    <li>test</li>
    <li>test test test</li>
    <li>test test</li>
    <li>test</li>
</ul>

CSS

ul {
    list-style:none; margin:0; padding:0; 
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    -webkit-flex-direction: row;
    -ms-flex-direction: row;
    -moz-flex-direction: row;
    flex-direction: row;
    -webkit-flex-wrap: wrap;
    -ms-flex-wrap: wrap;
    -moz-flex-wrap: wrap;
    flex-wrap: wrap;
    width: 300px; 
}

li {
     white-space:nowrap;  
     border:1px solid #cccccc; 
     padding:5px; 
    -webkit-flex: auto;
    -moz-flex: auto;
    -ms-flex: auto ;
    flex: auto;
}

Example


由问题作者编辑:

我认为我应该更新这个答案,因为我已经了解了一些关于 flexbox 的知识。

  1. 处理多行弹性盒,供应商前缀几乎没用。很难找到任何支持多行 flexbox 的浏览器版本,但带有供应商前缀。通常供应商前缀是指弹性框的older version,其中多行的处理方式非常不同。

  2. 每个主流浏览器都支持这个,除了 Firefox,但是一个实现已经合并到 alpha 中,所以它会出现在Firefox 28。大多数桌面用户都会看到您的设计(实现可用的后备仍然很重要)。

  3. 使用Modernizr 测试多行弹性盒支持非常容易,因为弹性盒模型 测试专门测试flex-wrap 属性,该属性仅存在于支持它的实现中。为每个不支持的浏览器实现基于 float: left 的回退是非常干净的。

我的final implementation 具有基于 Modernizr 的后备功能,如下所示:

ul {
    /* general */
    list-style: none;
    margin: 0;
    padding: 0;
    width: 100%;
}
.flexbox ul {
    display: flex;
    flex-flow: row wrap;
}
li {
    /* general */
    white-space: nowrap;
    border: 1px solid #555555;

    /* fallback */
    float: left;
}
.flexbox li {
    flex: auto;
}
li:first-child {
    /* general */
    text-align: right;
    order: 1;

    /* fallback */
    float: right !important;
}

它应该适用于所有浏览器,尽管后备实现不如弹性盒那么简洁。

还要注意li:first-child 是弹性盒的最后一个元素。那是因为 order: 1 属性。所有其他元素的默认 order 为 0。这是因为以这种方式在回退中更容易将其浮动到右侧。

【讨论】:

  • flex-wrap 适用于歌剧、野生动物园、Chrome 和 IE。我还可以使用modernizr 检查对flexbox 的支持,并实现一个后备设计。我可能会编辑您的答案以添加有关该主题的更多详细信息。
  • 酷,很高兴看看它是如何为歌剧和野生动物园完成的
猜你喜欢
  • 1970-01-01
  • 2015-11-01
  • 2020-06-17
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多