gpt4 book ai didi

css多行菜单占据整个宽度

转载 作者:行者123 更新时间:2023-11-28 09:49:24 25 4
gpt4 key购买 nike

可能已经有针对此问题的解决方案或示例,但我一直找不到。

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

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

The right end of the menu looks ugly

忽略元素上的“文本”宽度相同。我只是不擅长画画。想象一下,文本的长度不同但周围的填充相同。

有一个棘手的边框(边框只在元素的左侧)我可以稍微隐藏它,但可点击区域仍然与上图的白色部分相同。悬停效果也揭开了这个把戏。


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

乍一看,这正是我想要的。元素正确对齐,它们第一眼就填满了可用空间。但是有一个根本性的缺陷:它们之间存在间隙:

There are gaps

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


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


基本上我想要的是:

Perfect

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

有办法吗?

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


编辑:

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

最佳答案

如果你使用下面的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 时,供应商前缀几乎没用。很难找到支持多行 flexbox 但带有供应商前缀的任何浏览器版本。通常供应商前缀是指 older version flexbox 的多行处理方式非常不同。

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

  3. 使用 Modernizr 测试多行 flexbox 支持真的很容易因为 Flexible Box Model 测试专门测试 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;
}

它应该适用于所有浏览器,尽管回退实现不像 flexbox 那样整洁。

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

关于css多行菜单占据整个宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19812807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com