我如何*真正*证明HTML + CSS中的水平菜单?

fli*_*ght 85 html css

你在HTML中的菜单栏上找到了很多教程,但是对于这个特定的(虽然是IMHO泛型)案例,我还没有找到任何合适的解决方案:

#  THE MENU ITEMS    SHOULD BE    JUSTIFIED     JUST AS    PLAIN TEXT     WOULD BE  #
#  ^                                                                             ^  #
Run Code Online (Sandbox Code Playgroud)
  • 有不同数量的纯文本菜单项,页面布局流畅.
  • 第一个菜单项应左对齐,最后一个菜单项应右对齐.
  • 其余项目应在菜单栏上以最佳方式传播.
  • 数量是变化的,因此没有机会预先计算最佳宽度.

请注意,TABLE也不适用于此:

  • 如果您居中所有TD,则第一个和最后一个项目未正确对齐.
  • 如果你左对齐并右对齐第一个resp.最后的项目,间距将是次优的.

使用HTML和CSS以干净的方式实现这一点并不是很奇怪吗?

Asb*_*erg 83

最简单的方法是通过在行的末尾插入一个元素来强制线断开,该元素将占用多于左边的可用空间然后隐藏它.我很容易用一个span像这样的简单元素完成了这个:

#menu {
  text-align: justify;
}

#menu * {
  display: inline;
}

#menu li {
  display: inline-block;
}

#menu span {
  display: inline-block;
  position: relative;
  width: 100%;
  height: 0;
}
Run Code Online (Sandbox Code Playgroud)
<div id="menu">
  <ul>
    <li><a href="#">Menu item 1</a></li>
    <li><a href="#">Menu item 3</a></li>
    <li><a href="#">Menu item 2</a></li>
  </ul>
  <span></span>
</div>
Run Code Online (Sandbox Code Playgroud)

#menu span选择器内的所有垃圾(据我所知)都需要取悦大多数浏览器.它应该强制span元素的宽度为100%,这应该导致换行,因为它由于display: inline-block规则被认为是内联元素.inline-block也可以使span块级样式规则成为可能width导致元素与菜单不匹配,从而使菜单换行.

你当然需要调整span你的用例和设计的宽度,但我希望你得到一般的想法,并可以适应它.

  • 我只花了一个多小时把头靠在墙上,试图弄清楚为什么这对我不起作用.答案是我需要在标签之间留出空白.我在WordPress工作,并且每个<li> </ li>后wp_page_menu不包括换行符.使用preg_replace添加它们,现在可以使用了.Fwewww (15认同)
  • 效果很好,但如果用&ensp替换每个空间,结果会更漂亮; (n空格),以便菜单和项目&1保持密切联系.&NBSP; 在safari中不起作用. (9认同)

Jos*_*ier 42

现代方法 - Flexboxes!

既然CSS3 flexboxs更好的浏览器支持,我们中的一些人终于可以开始使用它们了.只需添加额外的供应商前缀为更多的浏览器覆盖面.

在这种情况下,您只需将父元素设置displayflex,然后将justify-content属性更改为space-between或者space-around为了在子Flexbox项之间或周围添加空间.

使用justify-content: space-between - (这里的例子):

ul {
    list-style: none;
    padding: 0;
    margin: 0;
}
.menu {
    display: flex;
    justify-content: space-between;
}
Run Code Online (Sandbox Code Playgroud)
<ul class="menu">
    <li>Item One</li>
    <li>Item Two</li>
    <li>Item Three Longer</li>
    <li>Item Four</li>
</ul>
Run Code Online (Sandbox Code Playgroud)


使用justify-content: space-around - (这里的例子):

ul {
    list-style: none;
    padding: 0;
    margin: 0;
}
.menu {
    display: flex;
    justify-content: space-around;
}
Run Code Online (Sandbox Code Playgroud)
<ul class="menu">
    <li>Item One</li>
    <li>Item Two</li>
    <li>Item Three Longer</li>
    <li>Item Four</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

  • 这正是我在六年前的原始问题中寻找的东西.我很高兴他们从那时起开发了CSS3,特别是最终解决了这个问题!:-)因此我会接受这个答案,即使CSS2的解决方法也能正常工作. (2认同)

小智 12

好的,这个解决方案不适用于IE6/7,因为缺乏对:before/ 的支持:after,但是:

ul {
  text-align: justify;
  list-style: none;
  list-style-image: none;
  margin: 0;
  padding: 0;
}
ul:after {
  content: "";
  margin-left: 100%;
}
li {
  display: inline;
}
a {
  display: inline-block;
}
Run Code Online (Sandbox Code Playgroud)
<div id="menu">
  <ul>
    <li><a href="#">Menu item 1</a></li>
    <li><a href="#">Menu item 2</a></li>
    <li><a href="#">Menu item 3</a></li>
    <li><a href="#">Menu item 4</a></li>
    <li><a href="#">Menu item 5</a></li>
  </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

之所以我有一个标签inline-block是因为我不希望里面的单词也是合理的,我也不想使用非破坏空格.


mik*_*pie 8

有一个解决方案.适用于FF,IE6,IE7,Webkit等.

确保在关闭之前不要放任何空格span.inner.IE6会破解.

您可以选择给出.outer宽度

.outer {
  text-align: justify;
}
.outer span.finish {
  display: inline-block;
  width: 100%;
}
.outer span.inner {
  display: inline-block;
  white-space: nowrap;
}
Run Code Online (Sandbox Code Playgroud)
<div class="outer">
  <span class="inner">THE MENU ITEMS</span>
  <span class="inner">SHOULD BE</span>
  <span class="inner">JUSTIFIED</span>
  <span class="inner">JUST AS</span>
  <span class="inner">PLAIN TEXT</span>
  <span class="inner">WOULD BE</span>
  <span class="finish"></span>
</div>
Run Code Online (Sandbox Code Playgroud)