CSS: Ubah gambar src pada img: hover


117

Saya perlu mengubah <img>URL sumber di hover.

Saya telah mencoba ini tetapi tidak berhasil:

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

Bantuan apa pun akan dihargai.

Memperbarui:

Ini hanya berfungsi untuk Webkit / Google Chrome.


contenthanya bekerja dengan :beforeatau :afterbegitu ini tidak akan berhasil. Mengapa tidak menggunakan a divdengan gambar latar belakang dan langsung mengubah gambar latar belakang itu?
putvande

Saya tidak ingin menggunakan DIV.
Hamed Kamrava

Saya tidak percaya bahwa Anda dapat mengubah atribut sumber hanya dengan CSS. jQuery atau JavaScript normal adalah kandidat yang baik untuk melakukan yang sederhana .... dan saya setuju dengan @putvande, content:satu - satunya berfungsi dengan :beforeatau:after
sulfureous

Nah ... Anda dapat mengatur gambar latar belakang imgtag dan hanya menghapusnya srcdari gambar Anda. Meskipun itu agak aneh, itu akan berhasil. @HamedKamrava: Anda hanya dapat menggunakan gambar atau dapatkah Anda menggunakan yang lain?
putvande

3
Ini hanya tidak berfungsi untuk CSS2. Di CSS3 solusi Anda harus bekerja dengan sempurna karena tidak perlu :beforeatau :afterpseudo class untuk digunakan content:url(...). Pembaruan: Ini hanya berfungsi untuk Webkit / Google Chrome.
Timo

Jawaban:


154

Dengan hanya html dan css, tidak memungkinkan untuk mengubah src gambar. Jika Anda mengganti tag img dengan tag div, maka Anda mungkin bisa mengubah gambar yang disetel sebagai latar belakang seperti

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

Dan jika Anda berpikir Anda bisa menggunakan beberapa kode javascript maka Anda harus bisa mengubah src dari tag img seperti di bawah ini

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);" />


1
Selain itu, jika Anda menggunakan opsi CSS, jika Anda tidak ingin gambar 'berkedip' saat gambar perlu dimuat saat hover, Anda dapat melakukan pramuat di halaman Anda dengan meletakkannya di suatu tempat tersembunyi:<img src="..." style="visibility: hidden" />
Steven Jeuris

111

Saya telah mengubah beberapa perubahan yang terkait dengan 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>

DEMO

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


5
Dalam contoh ini, setiap kali Anda mengarahkan kursor ke atas dan ke luar, dua gambar dimuat melalui jaringan (harus disimpan dalam cache, setelah percobaan pertama). Dan inilah perilaku yang diharapkan. Terkadang penting untuk memiliki elemen gambar di halaman, misalnya untuk persyaratan aksesibilitas, tetapi lebih baik menampilkan / menyembunyikan dua elemen gambar dengan css. Dalam kebanyakan kasus, mengubah atribut src gambar dengan JS adalah ide yang buruk, coba gunakan gambar latar belakang jika Anda bisa.
Alexander Burakevych

18

Saya memiliki masalah serupa tetapi solusi saya adalah memiliki dua gambar, satu tersembunyi (tampilan: tidak ada) dan satu terlihat. Saat mengarahkan kursor ke rentang sekitar, gambar asli berubah menjadi display: none dan gambar lain menjadi display: block. (Mungkin menggunakan 'inline' tergantung pada keadaan Anda)

Contoh ini menggunakan dua tag span alih-alih gambar sehingga Anda dapat melihat hasilnya saat menjalankannya di sini. Sayangnya, saya tidak memiliki sumber gambar online untuk digunakan.

#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
FYI, Anda dapat mengatakan span#initialsebagai penggantispan[id="initial"]
Adam Katz

16

Yang dapat Anda lakukan adalah menipu sedikit dengan menyetel widthdan heightke 0 untuk menyembunyikan gambar sebenarnya dan menerapkan beberapa CSS untuk melakukan apa yang Anda inginkan:

#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');
}

Dan bantalan membuat imgtag dengan ukuran yang Anda inginkan (setengah ukuran gambar Anda yang sebenarnya).

Biola


mengapa Anda melakukan ini selama menggunakan DIV?
gdbj

15

Berikut adalah pendekatan alternatif menggunakan CSS murni. Idenya adalah untuk menyertakan kedua gambar dalam markup HTML dan menampilkan atau menyembunyikannya sesuai dengan itu pada: 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/

Perhatikan bahwa gambar yang digunakan memiliki dimensi yang sama untuk tampilan yang sesuai. Selain itu, ukuran file gambar ini cukup kecil sehingga memuat beberapa tidak menjadi masalah dalam kasus ini tetapi mungkin jika Anda ingin beralih tampilan gambar berukuran besar.


3
@putvande pendekatannya mungkin serupa tetapi ini adalah contoh kerja yang lengkap dan disederhanakan yang membuat penggunaan pemilih CSS lebih baik
jcruz

7

Mengenai semantik, saya tidak suka solusi yang diberikan sejauh ini. Oleh karena itu, saya pribadi menggunakan solusi berikut:

.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>

Ini adalah solusi khusus CSS dengan kompatibilitas browser yang baik. Itu menggunakan pembungkus gambar yang memiliki latar belakang yang awalnya disembunyikan oleh gambar itu sendiri. Saat hover, gambar disembunyikan melalui opacity, sehingga gambar latar menjadi terlihat. Dengan cara ini, seseorang tidak memiliki pembungkus kosong tetapi gambar asli dalam kode markup.


5

Saya punya satu solusi lagi. Jika ada yang menggunakan 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';
}

Tanpa CSS ^^.


1
Jika OP tidak menginginkan Javascript, kemungkinan besar solusi yang menggunakan kerangka JS tidak relevan bukan?
Sharadh

1
Bahkan lebih baik (jika tidak ada yang keberatan menggunakan Angular untuk ini): jsfiddle.net/ec9gn/420 (menambahkan ng-init dan menghapus pengontrol sepenuhnya).
Rahul Desai

4

Saya mengalami masalah yang sama - saya ingin mengganti gambar di: hover tetapi tidak dapat menggunakan BACKGRUND-IMAGE karena kurangnya desain adaptif Bootstrap.

Jika Anda menyukai saya hanya ingin mengubah gambar di: hover (tetapi tidak bersikeras mengubah SRC untuk tag gambar tertentu) Anda dapat melakukan sesuatu seperti ini - ini adalah solusi khusus 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; }

Jika Anda menginginkan kode yang kompatibel dengan IE7, Anda dapat menyembunyikan / menampilkan: gambar HOVER dengan memposisikan bukan berdasarkan opasitas.


3

Karena Anda tidak dapat mengubah srcdengan CSS: Jika jQuery adalah pilihan untuk Anda, periksa biola ini.

Demo

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

Ini pada dasarnya menggunakan .hover()metode ... dibutuhkan dua fungsi untuk membuatnya bekerja. Saat Anda memasukkan kursor dan saat Anda keluar.

Kami menggunakan .attr(kependekan dari atribut) untuk mengubah srcatribut.

Perlu dicatat bahwa Anda memerlukan pustaka jQuery yang disertakan seperti di biola untuk membuat ini berfungsi.


3

Biola

Setuju dengan jawaban AshisKumar,
ada cara untuk mengubah url gambar di mouse dengan menggunakan fungsi jQuery seperti di bawah ini:

$(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 Dan bagaimana menggunakan awith display:blockberbeda dari div? Pemula topik ingin mengubah srcatribut imgthrough cssdan bukan walkaround.
Cthulhu

2

Secara pribadi, saya akan menggunakan salah satu solusi JavaScript / jQuery. Ini tidak hanya menjaga semantik HTML Anda (yaitu, gambar ditampilkan sebagai elemen img dengan gambar src biasanya ditentukan dalam markup), tetapi jika Anda menggunakan solusi JS / jQuery maka Anda juga akan dapat menggunakan JS / jQuery untuk memuat gambar hover Anda.

Pramuat gambar hover berarti kemungkinan tidak ada penundaan download saat pengguna mengarahkan kursor ke gambar asli, sehingga situs Anda berperilaku jauh lebih profesional.

Ini berarti Anda memiliki ketergantungan pada JS, tetapi minoritas kecil yang tidak mengaktifkan JS mungkin tidak akan terlalu sibuk - dan semua orang akan mendapatkan pengalaman yang lebih baik ... dan kode Anda juga akan bagus!


1

Anda tidak dapat mengubah atribut imgtag srcmenggunakan CSS. Mungkin menggunakan event handler 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";
}

Fungsi ini berfungsi, tetapi ketika pengguna menggerakkan mouse menjauh dari gambar, gambar tidak berubah kembali ke gambar asli. Bisakah Anda membantu menulis kode itu? Terima kasih

1

Anda tidak dapat mengubah img src menggunakan css. Anda dapat menggunakan solusi css murni berikut. 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');
}

Atau, jika Anda tidak ingin menggunakan div dengan gambar latar belakang, Anda dapat menggunakan solusi 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

Untuk ini, Anda dapat menggunakan kode di bawah ini

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

Di browser lama, :hoverhanya bekerja pada <a>elemen. Jadi Anda harus melakukan sesuatu seperti ini untuk membuatnya bekerja.

<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

Kode berikut berfungsi di Chrome dan 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

Inilah solusi CSS murni. Letakkan gambar yang terlihat di tag img, letakkan gambar kedua sebagai latar belakang di css, lalu sembunyikan gambar di hover.

.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

Coba Kode Ini.

   .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

Ada cara sederhana lain hanya dengan menggunakan HTML dan CSS!

Cukup bungkus <img>tag Anda dengan div seperti ini:

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

Kemudian, di file CSS Anda sembunyikan img dan atur gambar latar belakang untuk elemen div pembungkus:

.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;
}


Et voila!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.