【问题标题】:List items wrapping too early with position absolute使用绝对位置列出过早包装的项目
【发布时间】:2014-05-22 21:20:05
【问题描述】:

我正在创建一个导航栏,使用 position: absolute;

我发现列表项太早地换行到下一行。例如,如果导航栏的宽度为 500px,我希望它在屏幕宽度达到 499px 之前不会换行,但似乎在此之前会换行。

这是我的代码

HTML

<div id="nav">
    <ul>
        <li><a href="#">Home</a></li>
        <li><a href="#">About us</a></li>
        <li><a href="#">Find us</a></li>
        <li><a href="#">News</a></li>
        <li><a href="#">Contact</a></li>
    </ul>
</div>

CSS

* {
    margin: 0;
    padding: 0;
}

#nav {
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    overflow: hidden;
    background: #4d4d4d;
}

#nav ul {
    list-style: none;
}

#nav ul li {
    float: left;
}

#nav ul li a {
    display: block;
    padding: 15px 35px;
    color: #ffffff;
}

#nav ul li:first-of-type a {
    border-left: none;
}

#nav ul li:last-of-type a {
    border-right: none;
}

我创建了一个 JSfiddle 来演示这个问题,你可以在这里找到 http://jsfiddle.net/7bWyM/

如您所见,当列表项仍有大量空间可供使用时,它们将换行到下一行。

我的问题是;

1) 为什么它没有用完这个空间?我希望它全部保持在一条线上,直到屏幕变得太小而无法容纳它为止。

2) 我该如何解决这个问题?我无法设置宽度,因为我不知道会有多少导航项,并且我希望宽度自动调整到内部的内容(就像我在使用绝对位置时所做的那样,因为 div 不再是块级元素)

【问题讨论】:

  • 您是使用position: absolute; left: 50%; transform: translateX(-50%); 只是为了使菜单居中还是有其他原因使用它?还有其他方法可以使菜单居中。
  • @Mathias The position: absolute 调整 #nav 的宽度以完全适合项目周围,在右侧没有多余的间距,除了它只是让它在屏幕上居中跨度>
  • 我建议了一种不同的解决方案,以在我的答案中将菜单居中。与使用 transform 相比,它在旧版浏览器中有更好的支持

标签: html css


【解决方案1】:

您可以在 #navbar 上使用 display: inline-block; 并在其父级上使用 text-align: center; 以使菜单居中。那么你就不必使用position: absolute; left: 50%

它在 IE7 中不起作用,但由于您现在使用的是transform,我猜这不会有问题。

Demo

#navbar_parent {
    text-align: center;
}

#navbar {
    display: inline-block;
}

【讨论】:

  • 工作愉快,我觉得自己没有想到这一点很愚蠢。感谢您的帮助:)
【解决方案2】:

我可以从 你的小提琴中看到两个原因:

  1. #nav 位于左侧 50% 处。这意味着如果列表项更多,它们将不得不结束,因为它无法增长。
  2. #nav ul li a 的左右内边距为 35 像素。这意味着两者之间有70px的差距。因此,即使您认为还有很多空间,也没有。

解决方案

以大约百分比减少#navleft 位置。 和/或 减少#nav ul li a 上的左右填充。

演示:http://jsfiddle.net/abhitalks/7bWyM/1/

CSS

#nav {
    position: absolute;
    left: 30%;
    ...
}

#nav ul li a {
    padding: 15px 15px;
    ...
}

【讨论】:

  • 不幸的是,这不能满足我项目的需要。 #nav 上的 position、left 和 transform 属性严格用于在页面上居中,使用它会使它向左太远
  • 它不能在那个位置的中心。 left:50% 表示从屏幕的一半开始。如果从那里开始,它怎么会是中心。
  • 因为转换:translateX(-50%); 将导航拉回其宽度的 50%,导致其居中
猜你喜欢
  • 1970-01-01
  • 2016-12-18
  • 2017-06-22
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
相关资源
最近更新 更多