Changer une image d'arrière-plan DIV avec jQuery

207

Je crée un tableau des taux d'appels pour développer / réduire pour l'entreprise pour laquelle je travaille. J'ai actuellement une table avec un bouton en dessous pour le développer, le bouton dit "Expand". Il est fonctionnel, sauf que j'ai besoin du bouton pour passer à "Réduire" quand il est cliqué, puis bien sûr revenir à "Développer" quand il est à nouveau cliqué. L'écriture sur le bouton est une image de fond.

Donc, fondamentalement, tout ce dont j'ai besoin est de changer l'image d'arrière-plan d'un div quand il est cliqué, sauf un peu comme une bascule.

zuk1
la source
3
Pourquoi une image de fond? Pourquoi pas du texte ?
uınbɐɥs
1
J'ai voté contre parce qu'il n'a pas accepté la réponse dans plusieurs années, j'espère qu'il va bien @ user1040899!
gsamaras
@ user1040899 zuk1 Vu pour la dernière fois Aug 9 '10 at 0:42à SO, c'est peut-être pourquoi :(
M. Junaid Salaat

Réponses:

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

Devrait faire l'affaire, il suffit de le brancher dans un événement de clic sur l'élément

$('#divID').click(function()
{
  // do my image switching logic here.
});
pseudo
la source
@fuccboi c'est le cas, car j'utilise ce code pour déclencher une coche svg animée lorsqu'un utilisateur sélectionne une option. :)
norcal johnny
Bonne réponse, je veux faire remarquer >> url () FAIT PARTIE DE LA CHAÎNE << ce qui est vraiment déroutant si vous venez d'une langue typedef forte
clockw0rk
62

Personnellement, j'utiliserais simplement le code JavaScript pour basculer entre 2 classes.

Demandez au CSS de décrire tout ce dont vous avez besoin sur votre div MOINS la règle d'arrière-plan, puis ajoutez deux classes (par exemple: développées et réduites) en tant que règles avec chacune l'image d'arrière-plan correcte (ou la position d'arrière-plan si vous utilisez un sprite).

CSS avec différentes images

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

Ou CSS avec image-sprite

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

.expanded {background-position: left bottom;}

Ensuite...

Code JavaScript avec images

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

JavaScript avec sprite

Remarque: l'élégant toggleClass ne fonctionne pas dans Internet Explorer 6, mais la méthode ci addClass- dessous / removeClassfonctionnera bien dans cette situation également

La solution la plus élégante (malheureusement pas compatible avec 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');
            }
        });
    }

Pour autant que je sache, cette méthode fonctionnera sur tous les navigateurs, et je me sentirais beaucoup plus à l'aise avec le CSS et les classes qu'avec les changements d'URL dans le script.

Kelly
la source
"Remarque: l'élégant toggleClass ne fonctionne pas dans Internet Explorer 6"
Chaoley
43

Il existe deux façons différentes de modifier une image CSS d'arrière-plan avec jQuery.

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

Regardez attentivement pour noter les différences. Dans le second, vous pouvez utiliser le CSS conventionnel et chaîne plusieurs propriétés CSS ensemble.

Ecropolis
la source
6
2. est incorrect et invalide. La chaîne de plusieurs propriétés se fait comme suit: $ ('selector'). Css ({'background-color': 'yellow', 'background-image': 'url ()'})
codecowboy
Si j'essaye 2., j'obtiens une erreur - Uncaught SyntaxError: Jeton inattendu:
geeky_monster
17

Si vous utilisez un sprite CSS pour les images d'arrière-plan, vous pouvez augmenter le décalage d'arrière-plan de +/- n pixels selon que vous étiez en train de développer ou de réduire. Pas une bascule, mais plus proche que d'avoir à changer d'URL d'image d'arrière-plan.

Dave Ward
la source
2
Bonus: si vous utilisez des images séparées, seule celle qui est affichée lors du chargement est réellement chargée. Il y aura un petit délai lors du changement d'images avant le chargement du deuxième état. Avec un sprite, vous n'avez qu'une seule image et elle sera déjà là.
Lasar
14

Voici comment je le fais:

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');
});
Loupax
la source
vous pouvez éventuellement utiliser la .toggleClass()fonction jQuery .
Paulo Bueno
J'ai découvert toggleClass deux jours après avoir posté ceci: P
Loupax
10

Une façon de le faire est de mettre les deux images dans le HTML, à l'intérieur d'un SPAN ou DIV, vous pouvez masquer la valeur par défaut soit avec CSS, soit avec JS au chargement de la page. Ensuite, vous pouvez basculer sur le clic. Voici un exemple similaire que j'utilise pour mettre des icônes gauche / bas sur une liste:

$(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>
alexp206
la source
5

Cela fonctionne sur tous les navigateurs actuels sur WinXP. Fondamentalement, il suffit de vérifier quelle est l'image d'arrière-plan actuelle. Si c'est image1, montrez image2, sinon montrez image1.

Le truc jsapi charge juste jQuery à partir du CDN Google (plus facile pour tester un fichier divers sur le bureau).

Le remplacement est pour la compatibilité entre les navigateurs (opéra et ie ajouter des citations à l'url et firefox, chrome et safari supprimer les citations).

<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>
enobrev
la source
1
vient de le faire pour l'exemple. De cette façon, l'extrait de code entier fonctionne de lui-même.
enobrev
20
Le chargement à partir de Google est préférable pour les sites accessibles au public. Le CDN de Google est très probablement plus rapide que votre site, lui permet de télécharger en parallèle avec autre chose sur votre site, et plus il y a de sites qui l'utilisent, plus il est probable qu'une copie en cache du navigateur de l'utilisateur soit utilisée.
Dave Ward
2
Si Google tombe en panne et que je suis toujours en vie; faites le moi savoir.
greenimpala
1
@Nick Allez sur jQuery.com, vous trouverez leurs propres utilisations de sites Web<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
meagar
2
@Nick La question devrait vraiment être, pourquoi ne voudriez- vous pas charger si hors Google. :-)
John Parker
5

Le mien est animé:

$(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)
    });    
});
yPhil
la source
4

J'ai fait le mien en utilisant des expressions régulières, car je voulais conserver un chemin relatif et ne pas utiliser ajouter la fonction addClass. Je voulais juste le compliquer, 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);
                }
            }
        );
user2220104
la source
3

Ancien article, mais cela vous permettrait d'utiliser un sprite d'image et d'ajuster la répétition ainsi que le positionnement en utilisant le raccourci pour la propriété css (arrière-plan, répétition, en haut à gauche).

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

});
bphillips
la source
2

J'ai trouvé une solution dans un forum, Toggle Background Img .

Sebastian Wolf
la source
Bienvenue dans Stack Overflow, Sebastian. Cette question a été posée il y a plus d'un an et contient déjà plusieurs réponses acceptables.
rjh
2

Les sprites CSS fonctionnent mieux. J'ai essayé de changer de classe et de manipuler la propriété 'background-image' avec jQuery, aucune n'a fonctionné. Je pense que c'est parce que les navigateurs (au moins le dernier Chrome stable) ne peuvent pas "recharger" une image déjà chargée.

Bonus: les sprites CSS sont plus rapides à télécharger et plus rapides à afficher. Moins de requêtes HTTP signifie un chargement de page plus rapide. Réduire le nombre de HTTP est le meilleur moyen d'améliorer les performances frontales, je recommande donc de suivre cette voie tout le temps.

DjebbZ
la source
2

Il s'agit d'une réponse assez simple qui modifie l'arrière-plan du site avec une liste d'éléments

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

la source
Facile? Cela pourrait être beaucoup plus simple. Pourquoi aléatoire?
uınbɐɥs
Parce que l'utilisateur est plus facile de voir ce qui change l'arrière-plan et de le faire :). Désolé pour mon anglais
0

J'utilise toujours également un horodatage pour empêcher les navigateurs de mettre l'image en cache. Par exemple, si l'utilisateur fait tourner son avatar, il sera souvent mis en cache et semblera ne pas changer.

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

$('#avatar').css("background-image", "url(" + iPath + "?" + t + ")");
AdamVanBuskirk
la source