【问题标题】:Applying text-decoration on css generated content in IE在 IE 中对 css 生成的内容应用文本装饰
【发布时间】:2013-08-06 19:30:55
【问题描述】:

似乎 IE 不关心为 a:before 伪元素(或伪类)定义的 text-decoration: none;

这是一个 JS Fiddle:http://jsfiddle.net/9N35f/
我希望“>”会失去下划线。它在 FF、Chrome 和 Safari 中可以,但在 IE 中没有。通过 IE10 和 IE9 测试。

问题:

我可以尝试使:before 元素失去下划线的任何解决方法?理想情况下在 IE9+ 中

在某处是否有针对此的错误报告?还是真的按照标准?

【问题讨论】:

标签: css internet-explorer pseudo-element pseudo-class


【解决方案1】:

另一种解决方案是设置一个小的line-heightheight也可以)并设置overflow: hidden,这样下划线就会消失。

我知道这不是最佳解决方案,因为 line-height 值取决于您使用的字符。在这种情况下,0.6 是一个不错的值,但对于其他角色来说可能不是。

在我的情况下,这是一个很好的解决方案,因为我遇到的问题是只有一个具有固定字体大小的特定字符。

a {
    text-decoration: underline;
}

a:before {
    content: ">";
    display: inline-block;
    text-decoration: underline; /* simulate IE behavior */
    line-height: 0.6; /* line-height must be smaller than font-size */
    overflow: hidden;
}

JSFiddle Demo

【讨论】:

  • 这行得通,但要注意像“j”、“g”、“y”和“q”这样的字符,它们的下半部分会被切断。不过,这对“>”来说不是问题:)
【解决方案2】:

我知道这是一个相当古老的线程,但刚刚在 IE 11 中遇到了这个问题,并且无法找到太多帮助,我决定尝试一下。在与早期版本相比显着改进的开发工具的帮助下,我设法弄清楚了 - 无论如何我正在做的事情。有可能它也适用于其他人,尽管您可能需要进行调整。 YMMV。

HTML:

<li><a href="#">Whatever</a></li>

CSS(在@frnhr 指出我发布的初始版本实际上不起作用后编辑):

a {
    display: block;
    position: relative;
    padding-left: 15px;
    text-decoration: none;
}

a:hover {
    text-decoration: underline;
}

a:before {
    position: absolute;
    left: 0;
    top: 0;
    height: calc(100% - 2px);

    overflow: hidden;

    content: ">";
}

秘诀是设置高度和overflow: hidden; 线;这意味着下划线仍然存在,但在伪元素提供的视口之外,因此永远不会在屏幕上看到。它也适用于其他浏览器(也在 Chrome 和 Firefox 上测试过)。根据您现有的样式,您可能需要调整 calc() 值中的像素值。

http://jsbin.com/biwomewebo/1/edit?html,css,output

【讨论】:

  • 对我不起作用。在 IE11 Win8.1 中尝试过,这是一个 JSBin:jsbin.com/qetomizase/1/edit?html,css,output 你可以让它在 JSBin 中工作吗?
  • 老鼠!为了简洁起见,我正在从 less 转换为 CSS(这是正在进行的项目的一部分)并且显然缺少一些东西。我将启动一个虚拟机并重试。
  • +1 现在可以使用了!注意底部的一些字母和特殊字符会被截掉:y, g, j, µ, |, {, [, ▼
  • 我认为通过对行高等进行一些实验,您也许可以解决这个问题。我没有机会 - 在我正在开发的网站上,我们使用图标字体在链接之前提供一个指示符,出于这样的目的,这是一个完美的解决方案:)
  • 这是一个很好的 hack,谢谢!肯定可以用的。我只是注意到切断低挂字母的问题。我不需要找到解决方法,尝试了line-heightpaddingmargin 等。可能起作用的是display: table-celldisplay: table 的一些时髦组合在父元素上,以及vertical-align: top,但也许...
【解决方案3】:

这对我有用:

html:

<a href="#"><span>a link</span></a>

css:

a {
  text-decoration: none;
}
a span {
  text-decoration: underline;
}
a:before {
  content: ">";
}

在此之前的标签仍然是锚的一部分。

【讨论】:

  • 我们都可以通过添加新的 HTML 元素来制造火箭飞船 :) 诀窍是在不改变 HTML 结构的情况下这样做。为什么?哦,我很想更改 HTML 结构,但不幸的是,在这种情况下它不在我的掌控之中。它是由第三方 JavaScript 库生成的等等……
【解决方案4】:

IE 在这里似乎出错了,因为您的代码中的display: block 应该删除下划线。根据 CSS 2.1 规范中的第 16.3 Decoration 条,“用户代理不得在非文本内容上呈现这些文本装饰。例如,图像和内嵌块不得有下划线。”

IE Feedback Home 上似乎没有关于此的错误报告。

在这种情况下,一个合适的解决方法可能是使用图像作为生成的内容:

a:before {
    content: url(arrow.png);
}

其中 arrow.png 指的是一个合适的小图标。在CSS3 Generated and Replaced Content Module 中描述了url(...)content 中的使用,这是一个严重过时的草案(最后一个版本是从2003 年开始的),但是这部分已经在浏览器中广泛实现。然而,在 IE 7 中却没有。因此,如果您也希望涵盖 IE 7,请考虑 @EugeneXA 的答案中的方法,可能会使用 JavaScript 动态生成额外的标记。

【讨论】:

【解决方案5】:

如果背景是白色的,你可以使用底部边框:

a {
    text-decoration: none;
    border-bottom:1px solid blue;
}

a:before {
    content: "> ";
    border-bottom:1px solid white;
}

【讨论】:

  • 背景是渐变色:(
【解决方案6】:

不确定标准是怎么说的,但 IE 的行为似乎更合乎逻辑。将 :before 视为 &lt;a&gt; 标记的 inside 元素,而不是它的 outside 元素。 Child 的 text-decoration 属性应该与它的 parent 无关。

此解决方法将起作用

http://jsfiddle.net/9N35f/4/

<span><a href="#">a link</a></span>

a {
    text-decoration: underline;
}

span:before {
    content: ">";
}

【讨论】:

  • +1 没错,但这会使事情复杂化,我想在不添加额外元素的情况下这样做。想想 tinyMCE 编辑器,并为 &lt;a&gt; 应用一个类,让它看起来不一样。
  • 我认为这解释了为什么它(应该)不可能:stackoverflow.com/questions/4481318/…
  • 我害怕这样的事情。 display: inline-block; 似乎在其他浏览器中发挥了一些作用。
猜你喜欢
  • 2014-03-11
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
相关资源
最近更新 更多