css - 具有等距间距的不同宽度的流体导航项

标签 css

我想创建一个流畅的水平导航链接列表,其中导航链接均匀分布,并占据封闭容器的整个宽度。 导航链接的宽度各不相同。第一个链接应左对齐,最后一个链接应右对齐。

我使用以下技术取得的成功有限:

ul {display: table;width: 100%;}
li {display: table-cell;}
a {display: block;} 

还使用了

ul {text-align: justify}
li {inline-block }

但我编写的代码似乎都无法很好地处理不同宽度的元素。调整导航大小时,间距似乎不相等。

我需要导航是流畅的,第一个和最后一个元素与包含 ul 的边缘齐平,并且元素彼此等距

最佳答案

我考虑了一会儿,想出了两种合理的方法,这两种方法都不错,但像素并不完美。一种是仅基于 CSS,另一种是借助 jQuery (JavaScript)。

CSS 方法 - 相当不错的近似

考虑以下 HTML:

<ul class="nav ex1">
    <li class="first"><a href="#">Home</a></li>
    <li><a href="#">Collections</a></li>
    <li class="tight"><a href="#">About Us</a></li>
    <li><a href="#">Slocklists</a></li>
    <li class="tight"><a href="#">Trade Enquiries</a></li>
    <li><a href="#">Press</a></li>
    <li class="last"><a href="#">Contact Us</a></li>
</ul>

我添加了一些类作为样式的 Hook 。

CSS如下:

.nav.ex1 {
    outline: 1px dashed blue;
    width: 100%;
    margin: 0;
    padding: 0;
    display: table;
}
.nav.ex1 li {
    display: table-cell;
    outline: 1px dotted gray;
    width: 20%;
    white-space: pre;
    text-align: center;
}
.nav.ex1 li.first {
    width: 1%;
}
.nav.ex1 li.last {
    width: 1%;
}
.nav.ex1 li.tight {
    width: 1%;
}

在示例 1 中,ul.nav 父容器使用 display: tablewidth: 100%。子 li 元素是 table-cell 的。我添加了 white-space: pre 以防止某些链接换行成两行,并添加了 text-align: center 以保持文本居中。

诀窍是强制某些表格单元格缩小以适合文本,您可以通过设置 width: 1% 来做到这一点,该值非零但太小以至于按住文本(除非你的屏幕是 10,000 像素宽)。我收缩以适应第一个和最后一个单元格,这迫使它们与父容器的左右边缘对齐。然后,我通过添加 .tight 类强制所有其他表格单元格缩小以适合。

其余表格的单元格将具有 20% 的宽度,这将使它们在最近的两个相邻单元格之间保持均匀间隔。但是,行中链接之间的间距会有一些细微的变化,这就是为什么我称之为近似值。

jQuery 辅助解决方案

在示例 2 中,标记基本相同,CSS 为:

.nav.ex2 {
    outline: 1px dashed blue;;
    margin: 0;
    padding: 0;
    display: block;
    overflow: auto;
    width: 100%;
}
.nav.ex2 li {
    float: left;
    display: block;
    outline: 1px dotted gray;
    width: auto;
}

在这种情况下,li 元素向左浮动,我使用 width: auto

诀窍是计算神奇的左边距值并将其应用于除第一个元素之外的所有 li 元素。

jQuery Action 是:

$(window).resize(function () {
    navResizer();
});

// On load, initially, make sure to set the size.
navResizer();

function navResizer() {
    var $li_w = 0;
    var $ul_w = $(".nav.ex2").innerWidth();

    $( ".nav.ex2 li" ).each(function( index ) {
        $li_w += $(this).innerWidth();
    });

    var li_margin = Math.floor(($ul_w-$li_w)/6);
    $(".nav.ex2 li").not(".first").css("margin-left",li_margin);
    $("p.note").text( "Widths: ul.nav: " + $ul_w + " all li: " + $li_w + " Left margin: " + li_margin);
}

基本上,该操作会计算ul.nav ($ul_w) 的宽度,以及所有li 子元素的总宽度($li_w).

左边距由 ($ul_w - $li_w)/6 计算,其中 6 是 7 个链接之间的间隙数。

关键的一行代码是:$(".nav.ex2 li").not(".first").css("margin-left",li_margin);

我使用 .not(".first") 省略第一个 li 元素,然后使用 .css 设置左边距。

一个轻微的缺陷是在最右边,链接不是完全正确对齐的,但是你可以通过将最后一个 li float 到右边来解决这个问题。

在大多数情况下,如果您的链接文本长度相似,您将很难区分两者。这两种方法都不是像素完美的,但都很好。

fiddle :http://jsfiddle.net/audetwebdesign/xhSfs/

脚注
我尝试了一些使用 text-align: justifyinline-block 的其他方法,但 CSS 引擎不会像处理常规单词一样处理内联 block ,因此不会对齐一行行内 block 。

left-margin 设置为 % 值在某些窗口宽度下将无法正常工作,并且最右侧的链接将不会按要求位于边缘。

之前尝试过jQuery的方式,见:
Evenly-spaced navigation links that take up entire width of ul in CSS3

关于css - 具有等距间距的不同宽度的流体导航项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16501067/

相关文章:

jquery - 不同维度的动态背景图片

html - 部分图片未显示

jquery - Bootstrap 导航链接在鼠标悬停时笨拙地跳转

css - 单击时隐藏链接上的轮廓焦点

css - 如何在网站的某些页面上不使用 CSS 文件?

jquery - 防止在打开灯箱时背景滚动

html - 从另一个页面单击单选按钮

javascript - 选择第二个字

css - 过渡扩展菜单 div 在导航栏中扩展,但在调整窗口大小时将其他菜单 div 向下推

css - 覆盖垫树的填充