113

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

元素之间的分隔符。

我的 HTML 结构是这样的:ol > li > a > img.

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

  1. 为分离添加更多li标签(嘘!),
  2. 在每个元素的图像中包含分隔符(这更好,但它使用户可能点击,例如,“主页”,但进入“服务”,因为它们是一个在另一个之后,用户可能会不小心点击分隔符属于“服务”);

该怎么办?

4

9 回答 9

140

如果没有迫切需要使用图像作为分隔符,您可以使用纯 CSS 来做到这一点。

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

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

于 2012-07-20T07:30:17.307 回答
66

只需将分隔符图像用作li.

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

例如:

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

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

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

于 2011-04-16T19:18:21.750 回答
5

其他解决方案都可以,但是如果使用:after则无需在最后添加分隔符,如果使用:before则无需在开头添加分隔符。

所以:

案例:之后

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

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

案例:之前

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

.link:first-child:before {
  content: '';
}
于 2016-04-28T15:30:09.003 回答
5

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

.menustyle li + li:before {
  content: ' | ';
  padding: 0;
  position: relative;
  top: -2px;
}
于 2016-11-12T13:33:58.980 回答
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;
}

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

于 2012-08-15T05:50:32.977 回答
2

将分隔符添加到li背景中,并确保链接不会扩展以覆盖分隔符,这意味着分隔符将无法单击。

于 2011-04-16T19:01:33.120 回答
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;
}
于 2015-01-23T03:51:58.910 回答
2

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

border-right:1px solid;

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

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

最后,如果您不希望最后一个 li 具有分隔边框,请在“border-right”中给它最后一个孩子“none”,如下所示:

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

祝你好运 :)

于 2017-02-06T09:01:22.047 回答
1

将其作为列表元素的背景放入:

<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 */

接下来,我推荐一种不同的可访问性标记:
与其将图像嵌入内联,不如将文本作为文本放入,用 span 包围每个图像,将图像应用为背景,然后使用 display:none 隐藏文本——这个提供了更多的样式灵活性,并允许您使用 1px 宽的背景图像平铺,节省带宽,您可以将其嵌入到 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;}

更新 好的,我看到其他人在我之前得到了类似的答案——我注意到约翰还包括一种通过使用 li + li 选择器来防止分隔符出现在第一个元素之前的方法——这意味着任何 li 都在一个接一个之后李。

于 2011-04-16T19:22:33.270 回答