Cambiare un'immagine di sfondo DIV con jQuery


207

Sto creando una tabella dei tassi di chiamata per espandere / comprimere l'azienda per cui lavoro. Al momento ho una tabella con un pulsante sotto per espanderlo, il pulsante dice "Espandi". È funzionale, tranne per il fatto che ho bisogno del pulsante per passare a "Comprimi" quando si fa clic e, naturalmente, di nuovo a "Espandi" quando si fa nuovamente clic. La scritta sul pulsante è un'immagine di sfondo.

Quindi praticamente tutto ciò di cui ho bisogno è cambiare l'immagine di sfondo di un div quando viene cliccato, tranne una sorta di interruttore.


3
Perché un'immagine di sfondo? Perché non mandare un sms ?
uınbɐɥs

1
Ho votato verso il basso perché non ha accettato la risposta tra qualche anno, spero che sia OK anche se @ user1040899!
gsamaras,

@ user1040899 zuk1 Visto l'ultima volta Aug 9 '10 at 0:42a SO, forse è per questo che :(
M. Junaid Salaat,

Risposte:


443
$('#divID').css("background-image", "url(/myimage.jpg)");  

Dovresti fare il trucco, basta collegarlo in un evento click sull'elemento

$('#divID').click(function()
{
  // do my image switching logic here.
});

@fuccboi lo fa, poiché uso questo codice per attivare un segno di spunta animato svg quando un utente seleziona un'opzione. :)
norcal johnny il

Buona risposta, voglio sottolineare >> url () È PARTE DELLA STRING << che è davvero confuso se vieni da un linguaggio
tipicamente

62

Personalmente userei semplicemente il codice JavaScript per passare tra 2 classi.

Chiedi al CSS di delineare tutto ciò di cui hai bisogno sul tuo div MENO la regola di sfondo, quindi aggiungi due classi (ad esempio: espanso e compresso) come regole ognuna con l'immagine di sfondo corretta (o la posizione di sfondo se usi uno sprite).

CSS con immagini diverse

.div {
    /* button size etc properties */
}

.expanded {background: url(img/x.gif) no-repeat left top;}
.collapsed {background: url(img/y.gif) no-repeat left top;}

O CSS con sprite di immagini

.div {
    background: url(img/sprite.gif) no-repeat left top;
    /* Other styles */
}

.expanded {background-position: left bottom;}

Poi...

Codice JavaScript con immagini

$(function){
    $('#button').click(function(){
        if($(this).hasClass('expanded'))
        {
            $(this).addClass('collapsed').removeClass('expanded');
        }
        else
        {
            $(this).addClass('expanded').removeClass('collapsed');
        }
    });
}

JavaScript con sprite

Nota: l'elegante toggleClass non funziona in Internet Explorer 6, ma il metodo sottostante addClass/ removeClassfunzionerà bene anche in questa situazione

La soluzione più elegante (purtroppo non compatibile con Internet Explorer 6)

$(function){
        $('#button').click(function(){
            $(this).toggleClass('expanded');
        });
    }

$(function){
        $('#button').click(function(){
            if($(this).hasClass('expanded'))
            {
                $(this).removeClass('expanded');
            }
            else
            {
                $(this).addClass('expanded');
            }
        });
    }

Per quanto ne so questo metodo funzionerà attraverso i browser e mi sentirei molto più a mio agio giocando con CSS e classi che con le modifiche all'URL nello script.


"Nota: l'elegante toggleClass non funziona in Internet Explorer 6"
Chaoley,

43

Esistono due modi diversi per modificare un'immagine CSS di sfondo con jQuery.

  1. $('selector').css('backgroundImage','url(images/example.jpg)');
  2. $('selector').css({'background-image':'url(images/example.jpg)'});

Guarda attentamente per notare le differenze. Nel secondo, è possibile utilizzare CSS convenzionali e mettere insieme più proprietà CSS.


6
2. non è corretto, non è valido. Il raggruppamento di più proprietà viene eseguito in questo modo: $ ('selettore'). Css ({'background-color': 'yellow', 'background-image': 'url ()'})
codecowboy

Se provo 2., ottengo un errore - Uncaught SyntaxError: imprevisto token:
geeky_monster

17

Se usi uno sprite CSS per le immagini di sfondo, potresti aumentare l'offset di sfondo +/- n pixel a seconda che tu stia espandendo o collassando. Non un interruttore, ma più vicino ad esso che dover cambiare gli URL delle immagini di sfondo.


2
Bonus: se usi immagini separate, viene caricata solo quella visualizzata al caricamento. Si verificherà un piccolo ritardo durante il passaggio delle immagini prima che venga caricato il secondo stato. Con uno sprite, hai solo un'immagine e sarà già lì.
Lasar,

14

Ecco come lo faccio:

CSS

#button{
   background-image: url("initial_image.png");
}

#button.toggled{
  background-image:url("toggled_image.png");
}

JS

$('#button').click(function(){
  $('#my_content').toggle();
  $(this).toggleClass('toggled');
});

alla fine potresti usare la .toggleClass()funzione jQuery .
Paulo Bueno,

Ho scoperto toggleClass due giorni dopo aver pubblicato questo: P
Loupax il

10

Un modo per farlo è inserire entrambe le immagini in HTML, all'interno di uno SPAN o DIV, è possibile nascondere il valore predefinito con CSS o con JS al caricamento della pagina. Quindi puoi attivare / disattivare il clic. Ecco un esempio simile che sto usando per mettere le icone sinistra / giù in un elenco:

$(document).ready(function(){
    $(".button").click(function () {
        $(this).children(".arrow").toggle();
            return false;
    });
});

<a href="#" class="button">
    <span class="arrow">
        <img src="/images/icons/left.png" alt="+" />
    </span>
    <span class="arrow" style="display: none;">
        <img src="/images/down.png" alt="-" />
    </span>
</a>

5

Funziona su tutti i browser attuali su WinXP. Fondamentalmente solo controllando quale sia l'attuale immagine di backgrond. Se è image1, mostra image2, altrimenti mostra image1.

Il materiale jsapi carica jQuery dal CDN di Google (più semplice per testare un file misc sul desktop).

Il sostituto è per la compatibilità tra browser (opera e cioè aggiungere citazioni a url e firefox, chrome e safari rimuovere le virgolette).

<html>
    <head>
        <script src="http://www.google.com/jsapi"></script>
        <script>
          google.load("jquery", "1.2.6");
          google.setOnLoadCallback(function() {
            var original_image = 'url(http://stackoverflow.com/Content/img/wmd/link.png)';
            var second_image = 'url(http://stackoverflow.com/Content/img/wmd/code.png)';

            $('.mydiv').click(function() {
                if ($(this).css('background-image').replace(/"/g, '') == original_image) {
                    $(this).css('background-image', second_image);
                } else {
                    $(this).css('background-image', original_image);
                }

                return false;
            });
          });
        </script>

        <style>
            .mydiv {
                background-image: url('http://stackoverflow.com/Content/img/wmd/link.png');
                width: 100px;
                height: 100px;
            }
        </style>
    </head>
    <body>
        <div class="mydiv">&nbsp;</div>
    </body>
</html>

1
l'ho appena fatto per l'esempio. In questo modo, l'intero snippet di codice funziona da solo.
enobrev,

20
Il caricamento da Google è preferibile per i siti pubblici. La CDN di Google è molto probabilmente più veloce del tuo sito, consente il download in parallelo con qualcos'altro sul tuo sito e più siti lo utilizzano, più è probabile che venga utilizzata una copia cache dal browser dell'utente.
Dave Ward,

2
Se Google va giù e sono ancora vivo; fammi sapere.
Greenimpala,

1
@Nick Vai su jQuery.com, troverai i loro usi del sito Web<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
meagar

2
@Nick La domanda dovrebbe davvero essere, perché non dovresti caricarla se non su Google. :-)
John Parker

5

Il mio è animato:

$(this).animate({
    opacity: 0
}, 100, function() {
    // Callback
    $(this).css("background-image", "url(" + new_img + ")").promise().done(function(){
        // Callback of the callback :)
        $(this).animate({
            opacity: 1
        }, 600)
    });    
});

4

Ho fatto il mio usando espressioni regolari, poiché volevo preservare un percorso relativo e non usare aggiungere la funzione addClass. Volevo solo renderlo contorto, lol.

$(".travelinfo-btn").click(
            function() {
                $("html, body").animate({scrollTop: $(this).offset().top}, 200);
                var bgImg = $(this).css('background-image')
                var bgPath = bgImg.substr(0, bgImg.lastIndexOf('/')+1)
                if(bgImg.match(/collapse/)) {
                    $(this).stop().css('background-image', bgImg.replace(/collapse/,'expand'));
                    $(this).next(".travelinfo-item").stop().slideToggle(400);
                } else {
                    $(this).stop().css('background-image', bgImg.replace(/expand/,'collapse'));
                    $(this).next(".travelinfo-item").stop().slideToggle(400);
                }
            }
        );

3

Vecchio post, ma ciò ti consentirebbe di utilizzare uno sprite di immagini e regolare la ripetizione e il posizionamento utilizzando la scorciatoia per la proprietà css (sfondo, ripetizione, in alto a sinistra).

$.each($('.smallPreview'), function(i){
  var $this = $(this);

  $this.mouseenter(function(){
    $this.css('background', 'url(Assets/imgs/imgBckg-Small_Over.png) no-repeat 0 0');
  });

  $this.mouseleave(function(){
    $this.css('background', 'url(Assets/imgs/imgBckg-Small.png) no-repeat 0 0');
  });

});


2

Gli Sprite CSS funzionano meglio. Ho provato a cambiare classe e manipolare la proprietà 'background-image' con jQuery, nessuno ha funzionato. Penso che sia perché i browser (almeno l'ultimo Chrome stabile) non possono "ricaricare" un'immagine già caricata.

Bonus: gli Sprite CSS sono più veloci da scaricare e più veloci da visualizzare. Meno richieste HTTP significano un caricamento più veloce della pagina. Ridurre il numero di HTTP è il modo migliore per migliorare le prestazioni del front-end, quindi ti consiglio di seguire questa strada continuamente.


2

Questa è una risposta abbastanza semplice che modifica lo sfondo del sito con un elenco di elementi

function randomToN(maxVal) {
    var randVal = Math.random() * maxVal;
    return typeof 0 == 'undefined' ? Math.round(randVal) : randVal.toFixed(0);
};
var list = [ "IMG0.EXT", "IMG2.EXT","IMG3.EXT" ], // Images
    ram = list[parseFloat(randomToN(list.length))], // Random 1 to n
    img = ram == undefined || ram == null ? list[0] : ram; // Detect null
$("div#ID").css("backgroundImage", "url(" + img + ")"); // push de background

Semplice? Potrebbe essere molto più semplice. Perché casuale?
uınbɐɥs

Perché l'utente è più facile vedere cosa cambia lo sfondo e cambia :).

0

Uso sempre anche un timestamp per impedire ai browser di memorizzare nella cache l'immagine. Ad esempio, se l'utente sta ruotando il proprio avatar, spesso viene memorizzato nella cache e sembra non cambiare.

var d = new Date();
var t = d.getTime();

$('#avatar').css("background-image", "url(" + iPath + "?" + t + ")");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.