如何在悬停但不是图像链接上更改文本链接上的背景颜色

时间:2008-11-07 23:17:00

标签: css

我有这样的CSS规则:

a:hover { background-color: #fff; }

但是这会导致图像链接底部的间隙看起来很糟糕,更糟糕的是,如果我有透明图像,可以通过图像看到链接的背景颜色。

我之前曾多次偶然发现这个问题,但我总是使用快速而肮脏的方法为图像链接分配一个类来解决它:

a.imagelink:hover { background-color: transparent; }

今天,当我偶然发现this时,我正在寻找更优雅的解决方案。

基本上它建议使用display: block,这确实解决了非透明图像的问题。但是,它会导致另一个问题:现在链接与段落一样宽,尽管图像不是。

有没有一种很好的方法可以解决这个问题,还是我必须再次使用脏方法?

谢谢,

9 个答案:

答案 0 :(得分:5)

我试图找到一些选择器,它只能获得<a>个没有<img>个后代的元素,但找不到任何... 关于具有底部间隙的图像,您可以执行以下操作:

a img{vertical-align:text-bottom;}

这应该摆脱图像背后出现的背景,但可能会抛弃布局(虽然不多),所以要小心。

对于透明图像,您应该使用一个类。

我真的希望通过实现父选择器在CSS3中解决。

答案 1 :(得分:2)

我对你所谓的“图片链接”感到困惑......是一个锚点内的'img'标签吗?或者你在CSS中设置图像?

如果您在CSS中设置图像,那么这里没有问题(因为您已经能够定位它)...所以我必须假设您的意思:

<a ...><img src="..." /></a>

我建议您在图像上指定背景颜色......所以,假设中的容器应为白色...

a:hover { background: SomeColor }
a:hover img { background-color: #fff; }

答案 2 :(得分:2)

我通常会做这样的事情来消除图像下的差距:

img {
  display: block;
  float: left;
}

当然,这并不总是理想的解决方案,但在大多数情况下都很好。

答案 3 :(得分:2)

这种方式更好。

a[href$=jpg], a[href$=jpeg], a[href$=jpe], a[href$=png], a[href$=gif] {
    text-decoration: none;
    border: 0 none;
    background-color: transparent;
    }

不必将繁琐的类应用于每个图像。详细说明如下:

http://perishablepress.com/press/2008/10/14/css-remove-link-underlines-borders-linked-images/

答案 4 :(得分:1)

未经考验的想法:

a:hover {background-color: #fff;}
img:hover { background-color: transparent;}

答案 5 :(得分:0)

以下内容应该有效(未经测试):

首先你

 a:hover { background-color: #fff; }

然后你

a:imagelink:hover { background-color: inherit; }

第二条规则将覆盖第一条&lt; a class =“imagelink”等&gt;并保留父母的背景颜色。

我尝试在没有class =“”的情况下这样做,但我找不到与foo相反的CSS选择器&gt; bar,当它是foo的孩子时为它设置样式。当 一个类bar的子项时,你会想要设置foo的样式。你可以用jQuery做到这一点,甚至是更好的东西,但这可能不是一般技术所希望的。

答案 6 :(得分:0)

你可以使用display:inline-block但这不是完全的crossbrowser。 IE6及更低版本会有问题。

我假设您在<a><img>之间有空格?尝试删除这样:

<a><img /></a>

答案 7 :(得分:0)

我今天遇到了这个问题,并且使用了display: block以外的其他解决方案,这要归功于提问者的链接。这意味着我可以在图片上保留 ONLY 链接,而不是将其展开到容器中。

图像是内联的,因此它们的下方有空格,用于“y,j,g”等字母的下半部分。这会将图片定位在baseline,但如果您没有<a>TEXT HERE</a>喜欢徽标,则可以对其进行更改。但是,如果您使用纯色作为背景(例如在bodydiv#wrapper中),您仍然需要屏蔽文本行空间并且它很容易。

body {
  background-color: #112233; 
}
a:hover {
  background-color: red;
}
a img {
  border-style: none; /* not need for this solution, but removes borders around images which have a link */
  vertical-align: bottom; /* here */
}
a:hover img {
  background-color: #112233; /* MUST match the container background, or you arent masking the hover effect */
}

答案 8 :(得分:0)

我遇到了同样的问题。在我的情况下,我使用图像作为背景。我做了以下事情,它解决了我的问题:

background-image: url(file:"use the same background image or color");