Przełączanie obrazu tła DIV za pomocą jQuery

207

Tworzę tabelę rozwijania / zwijania stawek dla firmy, dla której pracuję. Obecnie mam pod stołem przycisk, aby go rozwinąć, przycisk mówi „Rozwiń”. Jest funkcjonalny, z wyjątkiem tego, że potrzebuję przycisku, aby przejść do „Zwiń” po kliknięciu, a następnie oczywiście z powrotem do „Rozwiń” po ponownym kliknięciu. Napis na przycisku jest obrazem tła.

Zasadniczo wszystko, czego potrzebuję, to zmienić obraz tła div po kliknięciu, z wyjątkiem czegoś w rodzaju przełącznika.

zuk1
źródło
3
Dlaczego obraz tła? Dlaczego nie SMS ?
uınbɐɥs
1
Głosowałem za odrzuceniem, ponieważ nie przyjął odpowiedzi za kilka lat, mam nadzieję, że jest w porządku @ user1040899!
gsamaras,
@ user1040899 zuk1 Ostatnio widziany Aug 9 '10 at 0:42w SO być może dlatego :(
M. Junaid Salaat

Odpowiedzi:

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

Powinien załatwić sprawę, wystarczy podłączyć go do zdarzenia kliknięcia na elemencie

$('#divID').click(function()
{
  // do my image switching logic here.
});
Nacięcie
źródło
@fuccboi robi, ponieważ używam tego kodu, aby uruchomić animowany znacznik wyboru svg, gdy użytkownik wybierze opcję. :)
norcal johnny
Dobra odpowiedź, chcę wskazać >> url () JEST CZĘŚCIĄ STRINGU <<, co jest bardzo mylące, jeśli pochodzisz z silnego języka typedef
clockw0rk
62

Ja osobiście używałbym kodu JavaScript do przełączania między 2 klasami.

Poproś CSS, aby nakreślił wszystko, czego potrzebujesz na div MINUS, regułę tła, a następnie dodaj dwie klasy (np. Rozwinięte i zwinięte) jako reguły, z których każda ma prawidłowy obraz tła (lub pozycję tła, jeśli używasz duszka).

CSS z różnymi obrazami

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

Lub CSS z obrazkiem

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

.expanded {background-position: left bottom;}

Następnie...

Kod JavaScript z obrazkami

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

JavaScript z ikoną

Uwaga: elegancki toggleClass nie działa w Internet Explorerze 6, ale poniższa addClass/ removeClassmetoda również będzie działać dobrze w tej sytuacji

Najbardziej eleganckie rozwiązanie (niestety nie przyjazne dla Internet Explorera 6)

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

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

O ile wiem, ta metoda będzie działać w różnych przeglądarkach i czułbym się znacznie bardziej komfortowo grając z CSS i klasami niż ze zmianami adresów URL w skrypcie.

Kelly
źródło
„Uwaga: elegancki toggleClass nie działa w Internet Explorerze 6”
Chaoley,
43

Istnieją dwa różne sposoby zmiany CSS obrazu tła za pomocą jQuery.

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

Przyjrzyj się uważnie, aby zauważyć różnice. W drugim przypadku możesz użyć konwencjonalnego CSS i połączyć wiele właściwości CSS razem.

Ecropolis
źródło
6
2. jest niepoprawny, nieważny. Łączenie wielu właściwości odbywa się w następujący sposób: $ ('selektor'). Css ({'background-color': 'yellow', 'background-image': 'url ()'})
codecowboy
Jeśli spróbuję 2.,
pojawia się błąd
17

Jeśli używasz duszka CSS dla obrazów tła, możesz podnieść przesunięcie tła +/- n pikseli w zależności od tego, czy rozwijałeś się, czy zwinąłeś. Nie przełącznik, ale bliżej niż przełączanie adresów URL obrazów tła.

Dave Ward
źródło
2
Premia: Jeśli używasz osobnych obrazów, w rzeczywistości ładowany jest tylko ten, który jest wyświetlany podczas ładowania. Wystąpi niewielkie opóźnienie podczas przełączania obrazów przed załadowaniem drugiego stanu. W przypadku duszka masz tylko jedno zdjęcie, które już tam będzie.
Lasar
14

Oto jak to robię:

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
źródło
ostatecznie możesz skorzystać z .toggleClass()funkcji jQuery .
Paulo Bueno,
Dowiedziałem się o toggleClass dwa dni po tym, jak opublikowałem: P
Loupax
10

Jednym ze sposobów na to jest umieszczenie obu obrazów w kodzie HTML, wewnątrz SPAN lub DIV, możesz ukryć domyślne za pomocą CSS lub JS przy ładowaniu strony. Następnie możesz przełączać po kliknięciu. Oto podobny przykład, którego używam do umieszczania ikon lewo / dół na liście:

$(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
źródło
5

Działa to we wszystkich obecnych przeglądarkach w WinXP. Zasadniczo po prostu sprawdzam, jaki jest obecny obraz backgrond. Jeśli to zdjęcie1, pokaż zdjęcie2, w przeciwnym razie pokaż zdjęcie1.

Jsapi po prostu ładuje jQuery z CDN Google (łatwiejsze do testowania pliku misc na pulpicie).

Zamiennik jest kompatybilny z różnymi przeglądarkami (opera i np. Dodawaj cudzysłowy do adresu URL i Firefox, Chrome i Safari usuwaj cudzysłowy).

<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
źródło
1
właśnie to zrobiłem na przykład. W ten sposób cały fragment kodu działa sam.
enobrev
20
Ładowanie go z Google jest lepsze w przypadku publicznych witryn. Sieć CDN Google jest prawdopodobnie prawdopodobnie szybsza niż Twoja witryna, pozwala ona pobierać ją równolegle z czymś innym w Twojej witrynie, a im więcej witryn, które z niej korzystają, tym bardziej prawdopodobne jest użycie kopii w pamięci podręcznej z przeglądarki użytkownika.
Dave Ward
2
Jeśli Google przestanie działać, a ja nadal będę żył; daj mi znać.
greenimpala,
1
@Nick Przejdź do jQuery.com, znajdziesz własne zastosowania witryny<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
meagar
2
@Nick Pytanie powinno naprawdę brzmieć, dlaczego nie chcesz ładować, jeśli wyłączasz Google. :-)
John Parker,
5

Mój jest animowany:

$(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
źródło
4

Zrobiłem to używając wyrażeń regularnych, ponieważ chciałem zachować ścieżkę względną i nie używać funkcji addClass. Chciałem tylko, żeby to było zawiłe, 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);
                }
            }
        );
użytkownik2220104
źródło
3

Stary post, ale pozwoliłoby to na użycie duszka obrazka i dostosowanie powtarzania, a także pozycjonowania za pomocą skrótu dla właściwości css (tło, powtórzenie, lewy górny).

$.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
źródło
2

Znalazłem rozwiązanie na forum, Toggle Background Img .

Sebastian Wolf
źródło
Witamy w Stack Overflow, Sebastian. To pytanie zostało zadane ponad rok temu i ma już kilka akceptowalnych odpowiedzi.
rjh
2

Duszki CSS działają najlepiej. Próbowałem przełączać klasy i manipulować właściwością „background-image” za pomocą jQuery, żadna nie działała. Myślę, że dzieje się tak, ponieważ przeglądarki (przynajmniej najnowszy stabilny Chrome) nie mogą „przeładować” obrazu już załadowanego.

Bonus: duszki CSS można szybciej pobierać i wyświetlać. Mniej żądań HTTP oznacza szybsze ładowanie strony. Zmniejszenie liczby HTTP jest najlepszym sposobem na poprawę wydajności interfejsu, dlatego polecam cały czas iść tą drogą.

DjebbZ
źródło
2

Jest to dość prosta odpowiedź, która zmienia tło witryny za pomocą listy elementów

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

źródło
Prosty? To może być znacznie prostsze. Dlaczego losowy?
uınbɐɥs
Ponieważ użytkownik łatwiej jest zobaczyć, co zmienia tło i zmienić :). Przepraszam za mój angielski
0

Zawsze używam znacznika czasu, aby przeglądarki nie buforowały obrazu. Na przykład, jeśli użytkownik obraca swojego awatara, często zostanie on zbuforowany i wydaje się, że się nie zmienia.

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

$('#avatar').css("background-image", "url(" + iPath + "?" + t + ")");
AdamVanBuskirk
źródło