我可以让 CSS :after 伪元素在元素之外附加内容吗?
Posted
技术标签:
【中文标题】我可以让 CSS :after 伪元素在元素之外附加内容吗?【英文标题】:Can I make the CSS :after pseudo element append content outside the element? 【发布时间】:2011-07-18 18:45:44 【问题描述】:我想在相邻链接之间使用 html »
实体格式化链接的面包屑路径,所以它看起来像这样:
home » about us » history » 本页
我在我的 CSS 中添加了一条规则:
nav#breadcrumb-trail a:after
content: " » ";
但这是在链接内部添加实体,而不是在链接外部 - 即我得到这个:
home » about us » history » 这个页面
我是否误解了 CSS :after
伪元素的行为?文档似乎暗示它在指定元素之后添加指定内容,而不是将其添加到元素容器的内部。有什么想法吗?
【问题讨论】:
【参考方案1】:spec 说:
如其名称所示,:before 和 :after 伪元素指定了元素的文档树内容之前和之后的内容位置。
注意这句话末尾的关键短语,它指的是内部内容(或内部文本)。因此,伪元素被插入到末尾in指定元素的content的开头。因此,右双角引号插入超链接文本之后,而不是超链接之后。
这是一个带有两个伪元素的链接的 DOM 元素树的可视化表示:
a
a:before
content
a:after
我想解决此问题的一种方法是将每个链接包装在 span
中,然后将样式应用到 nav#breadcrumb-trail span:after
,但这会导致不必要的标记...不过无论如何都值得一试。
【讨论】:
在 CSS3 生成内容模块中有针对::outside
pseudo-element 的建议,但不知道它是否会推迟到未来的规范或完全废弃,因为该模块目前的优先级相当低对于大多数供应商。
这应该是正确的答案,因为它实际上回答了提出的问题。我知道 kapa 为这个问题提供了一个很好的解决方案,但 BoltClock 的帖子实际上回答了这个问题。
@Luke 我在下面的答案中找到的方法也是如此 - 即使没有额外的标记。
从某种意义上说,是的,只是您的解决方案使用绝对定位,这对:after 的行为,BoltClock 的回答做得很好。
终于有人能真正回答所有这些问题(这个问题和所有其他相关问题)......【参考方案2】:
通常你将这些菜单编码为有序列表,所以这样做是有意义的:
#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;
<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>
【讨论】:
另外,#breadcrumb-trail li:last-child:after content: none;
考虑到页面组织的顺序具有语义意义,我使用了有序列表而不是无序列表 - 但除此之外,这非常有效(IE8 除外,但是嗯)跨度>
我同意最后一个孩子的东西和有序列表。谢谢。【参考方案3】:
鉴于 CSS 的灵活性和awesomeness,它看起来非常可行。在当前的 Chrome、FF 和 IE 中进行了尝试,它按预期完成了工作,无需添加额外的标记:
#box
width: 100px;
height: 100px;
background: #eee;
position: relative;
#box:after
content: '...appended text outside box';
position: absolute;
margin-left: 100%;
left: 0;
width: 200px;
<div id="box">
Some Box
</div>
小警告:绝对定位的“元素包含在盒子”的尺寸中,因此在其旁边浮动或对齐的元素无法动态尊重伪元素内容的宽度。
【讨论】:
确实——这在很大程度上取决于您对“元素框外”的解释以及您的预期结果。您只需要手动定位伪元素 - 例如,您无法触发自然浮动布局或表格布局等,因为伪元素框始终创建为原始元素框的子元素。 @BoltClock 非常正确,好点。我已将此限制添加到我的答案中。以上是关于我可以让 CSS :after 伪元素在元素之外附加内容吗?的主要内容,如果未能解决你的问题,请参考以下文章
你所不知的 CSS ::before 和 ::after 伪元素用法