我可以制作CSS:在伪元素之后追加元素之外的内容吗?

Dyl*_*tie 38 html css css-selectors pseudo-element

我想使用»相邻链接之间的HTML 实体格式化链接的痕迹痕迹,所以它看起来像这样:

主页 » 关于我们 » 历史 »本页

我在CSS中添加了一条规则:

nav#breadcrumb-trail a:after {
    content: " » ";
}
Run Code Online (Sandbox Code Playgroud)

但这是在链接中添加实体,而不是在外面 - 即我得到这个:

主页» 关于我们» 历史»本页

我误解了CSS :after伪元素的行为吗?文档似乎意味着它在指定元素之后添加指定的内容,而不是将其添加到元素容器的内部.有任何想法吗?

Bol*_*ock 33

规范说:

正如其名称所示,:before和:after伪元素指定元素文档树内容之前和之后的内容位置.

注意这句话末尾的关键短语,它指的是内部内容(或内部文本).所以,伪元件被插入到端的开头指定的元素含量.因此,在超链接的文本之后插入正确的双角度引用,而不是在超链接之后插入.

这是一个带有两个伪元素的链接的DOM元素树的直观表示:

a
  a:before
  content
  a:after
Run Code Online (Sandbox Code Playgroud)

我想这个行为的一个解决方法是将每个链接包装在一个span然后应用样式中nav#breadcrumb-trail span:after,但这会导致不必要的标记......但是在任何方面都值得一试.

  • CSS3生成的内容模块中有一个关于[`:: outside`伪元素]的建议(http://www.w3.org/TR/css3-content/#wrapping),但不知道它是否'将被推迟到未来的规范或完全废弃,因为该模块目前对大多数供应商来说是相当低的优先级. (2认同)
  • 这应该是正确的答案,因为它实际上回答了提出的问题.我知道kapa提供了一个很好的解决方案,但BoltClock的帖子实际上回答了这个问题. (2认同)

kap*_*apa 31

通常你将这些菜单编码为有序列表,所以有意义的做这样的事情:

#breadcrumb-trail ol { 
    list-style: none; 
    margin: 0;
    padding: 0; 
}

#breadcrumb-trail li { 
    display: inline; 
}

#breadcrumb-trail li:after { 
    content: ' » '; 
}

#breadcrumb-trail li:last-child:after { 
    content: none; 
}
Run Code Online (Sandbox Code Playgroud)
<nav id="breadcrumb-trail">
    <h1>My Amazing Breadcrumb Menu</h1>
    <ol>
        <li><a href="">about</a></li>
        <li><a href="">fos</a></li>
    </ol>
</nav>
Run Code Online (Sandbox Code Playgroud)

  • 另外,`#breadcrumb-trail li:last-child:after {content:none; }` (4认同)
  • 假设组织页面的顺序具有语义意义,我使用了有序列表而不是无序列表 - 但是否则这完全有效(除了IE8,但是meh) (2认同)