停止链接:在内容被应用于链接的规则下划线之前

Posted

技术标签:

【中文标题】停止链接:在内容被应用于链接的规则下划线之前【英文标题】:Stop link's :before content from being underlined by rule applied to the link 【发布时间】:2012-01-22 02:08:04 【问题描述】:

我有一个文本链接,悬停时带有下划线。我使用以下代码在链接的开头添加> 符号:

.box.blueb a  color: #0098aa; 
.box.blueb a:hover  text-decoration: underline; 
.box.blueb a:before  content: "> "; 
.box.blueb a:before:hover  text-decoration: none; 

但是当链接悬停时,我不希望> 符号下划线。我如何做到这一点?

【问题讨论】:

【参考方案1】:

http://jsfiddle.net/thirtydot/LmvgM/1/

您需要将span 包裹在a 内的文本周围:

<div class="box blueb">
    <a href="#"><span>Hello</span></a>
</div>

然后将您的 CSS 更改为:

.box.blueb a  color: #0098aa; text-decoration: none; 
.box.blueb a:hover > span  text-decoration: underline; 
.box.blueb a:before  content: "> "; 

.box.blueb a:before:hover text-decoration: none; 不起作用,因为当您在元素(a)上设置 text-decoration: underline 时,在后代(:before)上设置 you can't then remove it。

【讨论】:

谢谢你,但我不认为添加额外的标记会与我正在为其构建它的人一起飞行。 我不明白你怎么能做到这一点。我能想到的唯一其他选择是对&gt; 使用background-image 而不是文本。 不需要添加额外的标记,如另一个答案所示。仅使用 CSS 执行此操作更优雅。 @kontur:这里的所有其他答案都有缺点,例如:&gt; 字符的宽度可以在字体/大小之间更改(或者如果您更改字符),在旧版本中不起作用浏览器,很复杂。用 CSS 做这件事并不优雅,只是不够健壮。我们这里不是在做 CSS Zen Garden,只是添加一些 spans!诚然,我现在(甚至最近)还没有真正尝试过再次解决这个问题,因为我知道可能会有一些优雅的纯 CSS 解决方案。不过我在这个线程中没有看到它。 这个可能不错:***.com/a/21902566/405015。不知道是不是你说的那个。【参考方案2】:

http://jsfiddle.net/LmvgM/8/

只用css就可以实现,不需要额外的html标记,通过设置position:relative to the link,分别设置position:absolute to :before content。

使用这个例子...

<div class="box blueb">
    <a href="#">Hello</a>
</div>

...css 将如下所示:

.box.blueb a  
    color: #0098aa; 
    position: relative;
    margin-left: 5px;
    padding-left: 10px;
    text-decoration: none;


.box.blueb a:before  
    content: "> "; 
    position: absolute;
    top: 0;
    left: 0;


.box.blueb a:hover 
    text-decoration: underline;

【讨论】:

不幸的是,它在 IE11 中不起作用。 Chrome 和 Firefox 都可以。 这是一个在 IE8-11 中也可以使用的正确答案:***.com/a/21902566/1607968【参考方案3】:

您可以只在 :before 元素中添加 display: inline-block 来做到这一点:

.box.blueb a  color: #0098aa; 
.box.blueb a:hover  text-decoration: underline; 
.box.blueb a:before  content: "> "; display:inline-block; 

演示:http://jsfiddle.net/CaNyx/


编辑

问题是display: inline-block 不显示空格,但您可以使用white-space: prewhite-space: pre-wrap 修复它

演示:http://jsfiddle.net/CaNyx/1/

【讨论】:

很遗憾,IE11 拒绝了。 @JorritSchippers 真的吗?我开始认为新版本的 IE 很糟糕...更少,但似乎 IE 将永远是 IE 并且很糟糕。 @JorritSchippers 我已经对其进行了测试,它似乎不适用于任何 IE 版本。真可惜,这种行为是在 CSS2.1 中定义的,根据微软的说法,IE8 应该完全支持 CSS2.1。 微软终于修复了它。在 Edge 上按预期工作。【参考方案4】:

如果你想要一个纯 CSS 的解决方案,试试这个。 要让它在 IE 中工作,您需要在为伪元素关闭它之前显式打开它:

a text-decoration:none;
a:hover text-decoration:underline;
a:before  text-decoration:underline;
a:before,
a:hover:before text-decoration:none;

因此,在您的示例中,您需要编写它:

.box.blueb a  text-decoration:none; 
.box.blueb a:hover  text-decoration: underline; 
.box.blueb a:before  text-decoration: underline; 
.box.blueb a:before,
.box.blueb a:before:hover  text-decoration: none; 

【讨论】:

我找到的最佳解决方案! 这个解决方案真的很棒!【参考方案5】:

:hover:before text-decoration none has no effects? 也有人问过这个问题,https://***.com/a/13376725/261747 在 IE 中也为我工作。

【讨论】:

【参考方案6】:

我知道这并没有回答如何在内容被下划线之前阻止锚点。 但是当我需要这种行为时,我发现的最佳解决方法是不使用 a:before

HTML:

<nav class="breadcrumb">
    <span><a href="#">Test 1</a></span>
    <span><a href="#">Test 2</a></span>
    <span><a href="#">Test 3</a></span>
</nav>

CSS:

nav.breadcrumb > span:before              content: "> "; 
nav.breadcrumb > span:first-child:before  content: "";   

因此,为包裹锚点的元素指定 :before 伪类,而不是锚点本身似乎是目前最好的解决方案。


另一个例子,如果你喜欢使用列表:

HTML:

<ul class="breadcrumb">
    <li><a href="#">Test 1</a></li>
    <li><a href="#">Test 2</a></li>
    <li><a href="#">Test 3</a></li>
</ul>

CSS:

ul.breadcrumb                          margin: 0; padding: 0; 
ul.breadcrumb > li                     display: inline;       
ul.breadcrumb > li:before              content: "> ";         
ul.breadcrumb > li:first-child:before  content: "";           

【讨论】:

以上是关于停止链接:在内容被应用于链接的规则下划线之前的主要内容,如果未能解决你的问题,请参考以下文章

html 超链接被文本框遮住,无法点击,而且一部分内容被遮挡,请问怎么改?

删除Gmail上的链接的蓝色下划线

要取消超链接的下划线text钢decoration的值是啥

如何从活动导航链接中删除悬停时不必要的附加下划线?

android dev如何下划线和更改字符串中单词的颜色,如链接颜色

如何在 CListCtrl 中为单个项目加下划线