CSS:在img:hover上更改图片src


116

我需要更改上的<img>源URL hover

我已经尝试过了,但是不起作用:

的HTML

<img id="my-img" src="http://dummyimage.com/100x100/000/fff"/>

的CSS

#my-img:hover {
    content: url('http://dummyimage.com/100x100/eb00eb/fff');
}

jsFiddle

任何帮助,将不胜感激。

更新:

这仅适用于Webkit / Google Chrome。


content仅适用于:before:after所以这将无法正常工作。为什么不将A div与背景图片一起使用,然后悬停更改该背景图片?
putvande

我不想用DIV
Hamed Kamrava

我不认为您只能使用CSS来更改source属性。jQuery的或正常的JavaScript是较好的选择做简单....和我一起@putvande达成一致,content:只与工作:before:after
硫磺

好吧...您可以设置img标签的背景图片,只需将其src从图片中删除即可。尽管这有点奇怪,但它会起作用。@HamedKamrava:您只能使用图像还是可以使用其他图像?
putvande

3
这仅对CSS2不起作用。在CSS3中,您的解决方案应该可以完美地工作,因为不需要使用:before:after使用伪类content:url(...)。更新:仅适用于Webkit / Google Chrome。
Timo

Answers:


153

仅使用html和css,无法更改图像的src。如果确实将img标签替换为div标签,则可以像这样更改设置为背景的图像

div {
    background: url('http://dummyimage.com/100x100/000/fff');
}
div:hover {
    background: url('http://dummyimage.com/100x100/eb00eb/fff');
}

如果您认为可以使用一些JavaScript代码,则应该可以如下更改img标签的src

function hover(element) {
  element.setAttribute('src', 'http://dummyimage.com/100x100/eb00eb/fff');
}

function unhover(element) {
  element.setAttribute('src', 'http://dummyimage.com/100x100/000/fff');
}
<img id="my-img" src="http://dummyimage.com/100x100/000/fff" onmouseover="hover(this);" onmouseout="unhover(this);" />


此外,如果使用CSS选项,以防在需要将鼠标悬停加载时不希望图像“闪烁”的情况,可以将其隐藏在某个位置上,以将其预加载到页面上:<img src="..." style="visibility: hidden" />
Steven Jeuris

111

我修改了与Patrick Kostjens相关的一些更改。

<a href="#">
<img src="http://icons.iconarchive.com/icons/fasticon/angry-birds/128/yellow-bird-icon.png" 
onmouseover="this.src='http://icons.iconarchive.com/icons/fasticon/angry-birds/128/red-bird-icon.png'"
onmouseout="this.src='http://icons.iconarchive.com/icons/fasticon/angry-birds/128/yellow-bird-icon.png'"
border="0" alt=""/></a>

演示

http://jsfiddle.net/ssuryar/wcmHu/429/


5
在此示例中,每次将鼠标悬停时,都会在网络上加载两个图像(但是,第一次尝试后应将其缓存)。这是预期的行为。有时,在页面上具有图像元素很重要,例如,出于可访问性要求,但是最好使用css显示/隐藏两个图像元素。在大多数情况下,使用JS更改图片的src属性是一个坏主意,请尝试使用background-image。
2015年

18

我有一个类似的问题,但是我的解决方案是要有两张图像,一张隐藏(显示:无),一张可见。将鼠标悬停在周围跨度上时,原始图像将更改为display:none,另一图像将变为display:block。(根据您的情况,可以使用“内联”代替)

本示例使用两个span标签而不是图像,因此您可以在此处运行时查看结果。不幸的是,我没有任何在线图像来源可以使用。

#onhover {
  display: none;
}
#surround:hover span[id="initial"] {
  display: none;
}
#surround:hover span[id="onhover"] {
  display: block;
}
<span id="surround">
    <span id="initial">original</span>
    <span id="onhover">replacement</span>
</span>


2
仅供参考,您可以span#initial代替span[id="initial"]
亚当·卡兹

16

你可以做的是设置骗一点点width,并height以0隐藏实际的图像并应用一些CSS做你想要什么:

#aks {
    width:0px;
    height:0px;
    background:url('http://dummyimage.com/100x100/000/fff');
    padding:50px;
}

#aks:hover {
    background: url('http://dummyimage.com/100x100/eb00eb/fff');
}

填充使img标签具有所需大小(实际图像大小的一半)。

小提琴


为什么您会通过使用DIV来做到这一点?
gdbj

14

这是使用纯CSS的替代方法。这个想法是在HTML标记中包含两个图像,并在:hover上相应地显示或隐藏这些图像。

的HTML

<a>
   <img src="https://cdn4.iconfinder.com/data/icons/imoticons/105/imoticon_15-128.png" /> 
   <img src="https://cdn4.iconfinder.com/data/icons/imoticons/105/imoticon_12-128.png" />
</a>

的CSS

a img:last-child {
  display: none;  
}
a:hover img:last-child {
  display: block;  
}
a:hover img:first-child {
  display: none;  
}

jsfiddle:https ://jsfiddle.net/m4v1onyL/

请注意,所使用的图像尺寸相同,无法正确显示。此外,这些图像文件的大小非常小,因此在这种情况下加载多个图像不是问题,但是如果您要切换大尺寸图像的显示,则可能是这样。


3
@putvande的方法可能相似,但这是一个完整且简化的工作示例,可以更好地利用CSS选择器
jcruz,2016年

7

关于语义,到目前为止,我不喜欢任何解决方案。因此,我个人使用以下解决方案:

.img-wrapper {
  display: inline-block;
  background-image: url(https://www.w3schools.com/w3images/fjords.jpg);
}

.img-wrapper > img {
  vertical-align: top;
}

.img-wrapper > img:hover {
  opacity: 0;
}
<div class="img-wrapper">
  <img src="https://www.w3schools.com/w3css/img_lights.jpg" alt="image" />
</div>

这是具有良好浏览器兼容性的纯CSS解决方案。它利用图像包装器,该包装器的背景最初被图像本身隐藏。悬停时,图像通过不透明度隐藏,因此背景图像变得可见。这样,在标记代码中就不会有一个空的包装,而是一个真实的图像。


5

我还有一个解决方案。如果有人使用AngularJs:http : //jsfiddle.net/ec9gn/30/

<div ng-controller='ctrl'>
    <img ng-mouseover="img='eb00eb'"  ng-mouseleave="img='000'"
         ng-src='http://dummyimage.com/100x100/{{img}}/fff' />
</div>

Javascript:

function ctrl($scope){
    $scope.img= '000';
}

没有CSS ^^。


1
如果OP不希望使用Javascript,那么使用JS框架的解决方案就不太可能是相关的吧?
沙拉德2014年

1
甚至更好(如果没人介意为此使用Angular):jsfiddle.net/ec9gn/420(添加了ng-init并完全删除了控制器)。
拉胡尔·德赛

4

我有类似的问题-我想替换:hover上的图片,但由于缺少Bootstrap的自适应设计,因此无法使用BACKGRUND-IMAGE。

如果您喜欢我,只想在:hover上更改图片(但不坚持更改某些图像标签的SRC),则可以执行以下操作-这是仅CSS的解决方案。

HTML:

<li>
  <img src="/picts/doctors/SmallGray/Zharkova_smallgrey.jpg">
  <img class="hoverPhoto" src="/picts/doctors/Small/Zharkova_small.jpg">
</li>

CSS:

li { position: relative; overflow: hidden; }
li img.hoverPhoto {
  position: absolute;
  top: 0;
  right: 0;
  left: 0;
  bottom: 0;
  opacity: 0;
}
li.hover img { /* it's optional - for nicer transition effect */
  opacity: 0;
  -web-kit-transition:  opacity 1s ease;
  -moz-transition:  opacity 1s ease;li 
  -o-transition:    opacity 1s ease;
  transition:   opacity 1s ease;
}
li.hover img.hoverPhoto { opacity: 1; }

如果您想要IE7兼容的代码,则可以通过定位而不是不透明来隐藏/显示:HOVER图像。


3

由于无法src使用CSS 更改,因此:如果选择jQuery,请检查此小提琴。

演示版

$('#aks').hover(
    function(){
      $(this).attr('src','http://dummyimage.com/100x100/eb00eb/fff')
    },
    function(){
      $(this).attr('src','http://dummyimage.com/100x100/000/fff')
    }
)

它基本上是使用.hover()方法...它需要两个函数来使其工作。当您进入悬停和退出时。

我们正在使用.attr(属性的缩写)更改src属性。

值得一提的是,您需要像小提琴一样包含jQuery库才能完成此工作。


3

小提琴

同意AshisKumar的回答,
有一种方法可以使用jQuery功能在鼠标悬停时更改图像网址,如下所示:

$(function() {
  $("img")
    .mouseover(function() { 
        var src = $(this).attr("src").match(/[^\.]+/) + "over.gif";
        $(this).attr("src", url1); //URL @the time of mouse over on image
    })
    .mouseout(function() {
        var src = $(this).attr("src").replace("over", "");
        $(this).attr("src", url2); //default URL
    });
 });

@Naveen以及awith display:block与div有何不同?主题入门者希望更改srcimg通过”的属性,css而不是一些遍历。
Cthulhu

2

就个人而言,我会选择一种JavaScript / jQuery解决方案。这不仅保持了HTML的语义(即,将图像显示为img元素,并在标记中定义了通常的src图像),而且,如果您使用JS / jQuery解决方案,那么您还可以使用JS / jQuery 预加载您的悬停图像。

预加载悬停图像将意味着当用户将鼠标悬停在原始图像上时,没有下载延迟,从而使您的网站表现得更加专业。

这确实意味着您对JS有依赖性,但是没有启用JS的极少数人可能不会太着急-并且其他所有人都会获得更好的体验...并且您的代码也将很好!


1

您不能使用来更改img标签的src属性CSS。可以使用Javascript onmouseover()事件处理程序。

HTML:

<img id="my-img" src="http://dummyimage.com/100x100/000/fff" onmouseover='hover()'/>

Javascript:

function hover() {
  document.getElementById("my-img").src = "http://dummyimage.com/100x100/eb00eb/fff";
}

此功能有效,但是当用户将鼠标移离图像时,图像不会变回原始图像。您能帮忙编写该代码吗?谢谢

1

您不能使用css更改img src。您可以使用以下纯CSS解决方案。HTML:

<div id="asks"></div>

CSS:

#asks {
  width: 100px;
  height: 100px;
  background-image: url('http://dummyimage.com/100x100/0000/fff');
}

#asks:hover {
  background-image: url('http://dummyimage.com/100x100/eb00eb/fff');
}

或者,如果您不想在背景图片中使用div,则可以使用javascript / jQuery解决方案。HTML:

<img id="asks" src="http://dummyimage.com/100x100/000/fff" />

jQuery的:

$('#asks')
  .mouseenter(function(){$('#asks').attr('src', 'http://dummyimage.com/100x100/eb00eb/fff');})
  .mouseleave(function(){$('#asks').attr('src', 'http://dummyimage.com/100x100/000/fff');});

1

为此,您可以使用以下代码

1)HTML

<div id = "aks">

</div>

2)CSS

#aks
    {
        width:100px;
height:100px;    

        background-image:url('http://dummyimage.com/100x100/000/fff');}

#aks:hover {
    background-image:url('http://dummyimage.com/100x100/eb00eb/fff');

}

1

在较旧的浏览器上,:hover仅适用于<a>元素。因此,您必须执行以下操作才能使其正常工作。

<style>
a#aks
{
    width:100px;
    height:100px;
    display:block;
}

a#aks:link
{
  background-image: url('http://dummyimage.com/100x100/000/fff');
}

a#aks:hover
{
  background-image: url('http://dummyimage.com/100x100/eb00eb/fff');
}
</style>

<a href="#" id="aks"></a>

1

以下代码适用于Chrome和Firefox

<a href="#"><img src="me-more-smile.jpg" onmouseover="this.src='me-thinking-about-a-date.jpg'" onmouseout="this.src='me-more-smile.jpg'" border="0" alt=""/></a>

0

这是纯CSS解决方案。将可见图像放置在img标签中,将第二个图像作为背景放置在CSS中,然后在悬停时隐藏该图像。

.buttons{
width:90%;
margin-left:5%;
margin-right:5%;
margin-top:2%;
}
.buttons ul{}   
.buttons ul li{
display:inline-block;
width:22%;
margin:1%;
position:relative;
}
.buttons ul li a p{
position:absolute;
top:40%;
text-align:center;
}   
.but1{
background:url('scales.jpg') center no-repeat;
background-size:cover;
}
.but1 a:hover img{
visibility:hidden;
}   
.but2{
background:url('scales.jpg') center no-repeat;
background-size:cover;
}
.but2 a:hover img{
visibility:hidden;
}   
.but3{
background:url('scales.jpg') center no-repeat;
background-size:cover;
}
.but3 a:hover img{
visibility:hidden;
}   
.but4{
background:url('scales.jpg') center no-repeat;
background-size:cover;
}   
.but4 a:hover img{
visibility:hidden;
}           

<div class='buttons'>
<ul>
<li class='but1'><a href='#'><img src='scalesb.jpg' height='300' width='300' alt='' /><p>Blog</p></a></li>
<li class='but2'><a href='#'><img src='scalesb.jpg' height='300' width='300' alt='' /> <p>Herrero</p></a></li>
<li class='but3'><a href='#'><img src='scalesb.jpg' height='300' width='300' alt='' /><p>Loftin</p></a></li>
<li class='but4'><a href='#'><img src='scalesb.jpg' height='300' width='300' alt='' /><p>Contact</p></a></li>
</ul>
</div>


0

尝试此代码。

   .card {

            width: 200px;

            height: 195px;

            position: relative;

            display: inline-block;

        }

        .card .img-top {

            display: none;

            position: absolute;

            top: 0;

            left: 0;
           
            z-index: 99;
width:200px;
        }

        .card:hover .img-top {

            display: inline;

        }
 <!DOCTYPE html>

    <html lang="en">

    <head>

    <title>Image Change on Hover with CSS</title>

 
    </head>

    <body>

        <div class="card">

            <img src="http://www.dhresource.com/200x200s/f2-albu-g5-M00-EC-97-rBVaJFkAobCAHD9XAADvz9DDocA266.jpg/diy-wall-stickers-home-decor-nature-colorful.jpg" alt="Card Back" style="width:200px">

            <img src="https://s-media-cache-ak0.pinimg.com/236x/31/17/98/3117987a0be0a7d8976869aabf54d2d7.jpg" class="img-top" alt="Card Front">

        </div>

    </body>

    </html>


0

还有一种仅使用HTML和CSS的简单方法!像这样用div

包装<img>标签:

<div class="image-wrapper">
    <img src="http://dummyimage.com/100x100/000/fff">
</div>

然后,在CSS文件中隐藏img并为包装的div元素设置背景图片:

.image-wrapper:hover {
    background-image: url(http://dummyimage.com/100x100/eb00eb/fff);
    background-size: contain;
    background-repeat: no-repeat;
}

.image-wrapper:hover img {
    display: none;
}


等等!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.