导航分离器


107

我需要在导航元素之间添加分隔符。分隔符是图像。

元素之间的分隔符。

我的HTML结构如下:ol > li > a > img

在这里,我提出两种可能的解决方案:

  1. 要添加更多li标签进行分隔(嘘!),
  2. 在每个元素的图像中包含分隔符(这是更好的选择,但用户可能会单击“ Home”(例如),但进入“ Services”(服务),因为它们彼此落后,并且用户可能不小心单击了属于“服务”);

该怎么办?


96
+1用于艺术表演。
James P.

Answers:


64

只需将分隔图片用作背景图片即可li

要使其仅出现在列表项之间,请将图像放置在的左侧li,而不要放置在第一个图像的左侧。

例如:

#nav li + li {
    background:url('seperator.gif') no-repeat top left;
    padding-left: 10px
}

此CSS会将图像添加到另一个列表项之后的每个列表项-换句话说,除了第一个列表项之外的所有列表项。

注意 请注意,相邻选择器(li + li)在IE6中不起作用,因此您仅需将背景图像添加到常规li中(使用条件样式表),并可能对其中一个边缘应用负边距。


2
使用:before伪选择器可防止它出现在最后一个元素之后。
2012年

3
不错的解决方案-像魅力一样-IE6支持吗?谁在乎!:)如果我们都停止支持旧版浏览器,那么也许我们会强迫人们停止使用它们。
乔丹

就像chram一样,可border-left在项目之间绘制垂直线。
Richard-Degenne

132

如果没有迫切需要使用图像作为分隔符,则可以使用纯CSS来实现。

nav li + li:before{
    content: " | ";
    padding: 0 10px;
}

就像在原始问题中描述的图像一样,这在每个列表项之间放置了一个横条。但是,由于我们使用的是相邻的选择器,因此不会将竖线放在第一个元素之前。而且由于我们使用的是:before伪选择器,所以不会在最后放置一个。


哇!这正是我的页脚菜单所需要的。当然还有一些其他的CSS。
弗拉基米尔

从技术上讲,您仍然可以使用图像,但是base64对其进行编码并内联存储图像。css-tricks.com/data-uris
commadelimited '16

@jrue还可以垂直更改分隔符的位置吗?它没有响应顶部填充/边距。
Floris

3

您可以li在要添加分隔线的位置添加一个元素

<ul>
    <li> your content </li>
    <li class="divider-vertical-second-menu"></li>
    <li> NExt content </li>
    <li class="divider-vertical-second-menu"></li>
    <li> last item </li>
</ul>

在CSS中,您可以添加以下代码。

.divider-vertical-second-menu{
   height: 40px;
   width: 1px;
   margin: 0 5px;
   overflow: hidden;
   background-color: #DDD;
   border-right: 2px solid #FFF;
}

这将提高执行速度,因为它不会加载任何图像。只是测试一下.. :)


你能解释一下吗?但是总有其他方法... CSS3:我们可以添加get Nth Element并向其中添加Divider。
拉吉夫·平加莱2015年

1
德拉特,我一团糟。我只花了30分钟时间浏览标准文档,RWD小册子,甚至尝试了各种屏幕阅读器来证明我的观点。但是,至少屏幕阅读器足够聪明,不能大声读出空的子弹(也不要列举使用@ ol @而不是@ ul @时缺少的选项)。因此,我可以指出,这里使用@ li @与使用表来实现列布局属于同一类别。
沃尔克·斯托尔兹

3

其他解决方案也可以,但是如果使用:after,则不需要在最后添加分隔符;如果使用:before,则无需在开始时添加分隔符。

所以:

案例:之后

.link:after {
  content: '|';
  padding: 0 1rem;
}

.link:last-child:after {
  content: '';
}

案例:之前

.link:before {
  content: '|';
  padding: 0 1rem;
}

.link:first-child:before {
  content: '';
}

3

要使分隔符相对于菜单文本垂直居中,

.menustyle li + li:before

    {
        content: " | ";
        padding: 0;
        position: relative; 
        top: -2px;
    }


2

对于那些使用Sass的人,我为此编写了一个mixin

@mixin addSeparator($element, $separator, $padding) {
    #{$element+'+'+$element}:before {
        content: $separator;
        padding: 0 $padding;
    }
}

例:

@include addSeparator('li', '|', 1em);

这会给你这个:

li+li:before {
  content: "|";
  padding: 0 1em;
}

这没有显示“ |” 因为某些原因?有什么理由不?
James111

别担心,我想出了办法。我还必须在最后一个孩子的后面加上一个:after,以使不需要分隔符的孩子的内容= content:“”
James111

2

我相信最好的解决方案是我使用的,这是自然的CSS边框:

border-right:1px solid;

您可能需要注意填充,例如:

padding-left: 5px;
padding-right: 5px;

最后,如果您不希望最后一个li具有该单独的边框,请在“ border-right”中为其指定最后一个孩子“ none”,如下所示:

li:last-child{
  border-right:none;
}

祝好运 :)


1

将其作为背景放置在list元素上:

<ul id="nav">
    <li><a><img /></a></li>
    ...
    <li><a><img /></a></li>
</ul>

#nav li{background: url(/images/separator.gif) no-repeat left; padding-left:20px;} 
/* left padding creates a gap between links */

接下来,我建议使用其他标记来实现可访问性:
与其内嵌图像,而不是将文本作为文本放入,将每个文本都用跨距包围,将图像作为,作为背景,然后使用display:none隐藏文本。提供更多的样式灵活性,并允许您使用1px宽bg图像进行平铺,节省带宽,还可以将其嵌入CSS Sprite中,从而节省HTTP调用:

HTML:

<ul id="nav">
    <li><a><span>link text</span></a></li>
    ...
    <li><a><span>link text</span></a></li>
</ul

CSS:

#nav li{background: url(/images/separator.gif) no-repeat left; padding-left:20px;} 
#nav a{background: url(/images/nav-bg.gif) repeat-x;}
#nav a span{display:none;}

UPDATE OK,我看到其他人在我之前得到了类似的答案-并且我注意到John还提供了一种使用li + li选择器来防止分隔符出现在第一个元素之前的方法-这意味着任何li都在另一个之后。


是的-我只是抬起头来,而您是对的。我的答案已被编辑,自您领导以来,我给您的+1。
浮士德

谢谢。+1为我忘记添加的填充。
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.