作为标题,我使用.icon- *添加图标。在超链接中添加图标时:
- <a href="#" class="icon-email icon-large">Email me!</a>
由content属性插入的内容显示悬停时的下划线文本装饰。我想禁用文本装饰只为内容之前:
- [class^="icon-"]:before,[class*=" icon-"]:before {
- font-family: 'IcoMoon';
- font-style: normal;
- speak: none;
- }
- .icon-mail:before {
- content: "\37";
- }
- [class^="icon-large-"]:before,[class*=" icon-large"]:before {
- font-size: 48px;
- line-height: 48px;
- }
- a[class^="icon-"]:before,a[class*=" icon-"]:before {
- margin-right: 5px;
- vertical-align: middle;
- }
我试过这个,但它不工作(装饰仍然可见):
- a[class^="icon-"]:hover:before,a[class*=" icon-"]:hover:before {
- text-decoration: none;
- color: white;
- }
解决方法
作为其生成元素的
the
:before
pseudo-element is rendered as a descendant box(更具体地,就在第一子内容框之前),它遵守
the same rules its normal descendant boxes do with respect to text-decoration
:
The ‘text-decoration’ property on descendant elements cannot have any effect on the decoration of the ancestor.
有关详细信息,请参阅以下答案:
> CSS text-decoration property cannot be overridden by child element
> How do I get this CSS text-decoration override to work?
没有任何好的方法围绕这…唯一的替代品,立即想到的是:
>将文本包裹在其自己的span元素中,然后将text-decoration应用于该span,as shown by skip405.缺点是,当然是额外的标记。
>使用inline块背景图像而不是图标字体中的内联文本与您的:before伪元素(我也已更正与您的类选择器的不一致):
- [class^="icon-"]:before,[class*=" icon-"]:before {
- display: inline-block;
- width: 1em;
- height: 1em;
- background-size: contain;
- content: "";
- }
- .icon-email:before {
- background-image: url(icon-mail.svg);
- background-repeat: no-repeat;
- }
- .icon-large:before {
- width: 48px;
- height: 48px;
- }
- a[class^="icon-"]:before,a[class*=" icon-"]:before {
- margin-right: 5px;
- vertical-align: middle;
- }
这个优于skip405的解决方案是,你不必修改HTML,但鉴于它使用SVG vector background images和background-size
,它将无法在IE8中工作。
如果你需要IE8支持,那么你必须回到位图图像:
- .icon-email:before {
- background-image: url(icon-mail.png);
- }
- .icon-email.icon-large:before {
- background-image: url(icon-mail-large.png);
- }