2011-12-22 10 views
10

Próbuję utworzyć fadeIn/oddalanie na miejscu stworzyłem (edit: site url skreślony)jQuery zmiana div background-image z fadeIn/Out

Wszystko działa świetnie z wyjątkiem po kliknięciu na jeden z kolory w palecie kolorów, zastępuje obraz bez efektu.

To jest mały skrypt, który napisałem, który jest uruchamiany onclick na jednym z kolorów.

function changeImage(newColor) { 

    //var previousImage = $('#image-holder').css("background-image"); 

    $('#image-holder').css("background", "url('images/design-" + newColor + ".jpg')"); 
}; 

Próbowałem grać z $('#image-holder').fadeOut(1500) a następnie $('#image-holder').fadeIn(1500) ale działa śmieszne ... to podwójna zanika obraz.

$('#image-holder').css("background", "url('images/design-" + newColor + ".jpg')").fadeOut(function(){$(this).fadeIn()}); 

Co chciałbym osiągnąć to onclick na pole koloru, aktualny obraz tła będzie Fadeout natomiast nowy obraz tła znikną w.

wiem, że to łatwiejsze do osiągnięcia, że ​​gdybym użyłem dwóch <img src="" /> i przełączam ich wyświetlanie/widoczność, ale niestety nie mogę tak bardzo zmienić HTML, więc szukam rozwiązania opartego na jQuery.

Doceń pomoc!

Odpowiedz

8

Rozwiązanie że pracował dla mnie:

var image = $('#image-holder'); 
    image.fadeOut(1000, function() { 
     image.css("background", "url('images/design-" + newColor + ".jpg')"); 
     image.fadeIn(1000); 
    }); 
+4

Przepraszamy za wskrzeszanie tego, ale to zanika cały pojemnik i nie tylko obraz tła. W większości przypadków jest to niepożądane. – Alex

0

Dlaczego nie używać jQuery do wstrzykiwania znaczników, których potrzebujesz?

var $image_holder = $('#imageHolder'), 
    $carousel_container = $('<div/>').attr('id', 'carousel_container'), 
    images = ['first.jpg', 'second.jpg', 'third.jpg']; 

for (var i=0; i<images.length; i++) 
{ 
    $('<img/>').attr('src', images[i]).appendTo($carousel_container); 
} 

$carousel_container.insertAfter($image_holder); 
$image_holder.hide(); 
-2

Można spróbować coś takiego

Wymień

$('#image-holder').css("background", "url('images/design-" + newColor + ".jpg')");

z

$('#image-holder').animate({background : url('images/design-' + newColor + '.jpg') }, 3000);

Regulacja 3000 jako niezbędne do zwiększenia t ilość czasu w animacji.

Całkowicie niesprawdzone

+0

wydaje się możliwe rozwiązanie, ale nie będzie nawet zmienić obraz ... może składnia jest źle? Przyjrzę się temu. –

+0

Powinien zmienić obraz, jeśli przechodzisz przez parametr funkcji 'changeImage (newColor)'. –

+0

Jestem ... przetestowany z alertem. Dostaje właściwy kolor, ale obraz się nie zmienia. Próbowałem grać ze składni, ale nic. –

1
var currentBackground = 0; 

var backgrounds = []; 

backgrounds[0] = 'images/BasePic1.jpg'; 

backgrounds[1] = 'images/BasePic2.jpg'; 

backgrounds[2] = 'images/BasePic3.jpg'; 

backgrounds[3] = 'images/BasePic4.jpg'; 

backgrounds[4] = 'images/BasePic5.jpg'; 

function changeBackground() { 

    currentBackground++; 

    if(currentBackground > 4) currentBackground = 0; 

    $('#image-holder').fadeOut(1500,function() { 
     $('#image-holder').css({ 
      'background-image' : "url('" + backgrounds[currentBackground] + "')" 
     }); 
     $('#image-holder').fadeIn(1500); 
    }); 


    setTimeout(changeBackground, 5000); 
} 

$(document).ready(function() { 

    setTimeout(changeBackground, 5000); 

}); 
16

Była to jedyna rozsądna rzecz znalazłem zanikać obraz tła.

<div id="foo"> 
    <!-- some content here --> 
</div> 

Twój CSS; teraz wzbogacony o CSS3 transition.

#foo { 
    background-image: url('a.jpg'); 
    transition: background 1s linear; 
} 

teraz zamienić się tło

$("#foo").css("background-image", "url(b.jpg)"); 

Albo zrobić z natywnym javascript

document.querySelector("#foo").style.backgroundImage = "url(b.jpg)"; 

voilà, to zanika!


Oczywiste Zastrzeżenie: jeśli Twoja przeglądarka nie obsługuje własności CSS3 transition, to nie będzie działać.

+3

najlepsza odpowiedź :) dlaczego warto używać jquery, gdy można dodać tylko jedną linię css: D – ucefkh

+0

Nie jest to świetna odpowiedź, powiedziałbym, ponieważ działa to tylko w Chrome, Safari, Opera. Firefox 33 i IE11 jeszcze tego nie obsługują. Przejścia obrazu tła nie są niestety częścią animacji CSS3, więc może to trochę potrwać. – Trevor

+0

@ Trevor, animacje tła są wyraźnie częścią CSS3. Twierdzę również, że wspieranie zbędnego efektu w starej przeglądarce jest głupim posunięciem. – naomik

0

Większość rozwiązań po prostu zaniknie w elemencie, a nie w tle. Oznacza to, że twoje informacje są ukryte podczas ładowania tła, co jest często nie tym, czego potrzebujesz.

Napisałem następujące rozwiązanie, które działa poprzez pobranie obrazu tła i dodanie go jako obrazu do elementu. Następnie rozładowuje się, gdy jest załadowany, a cały czas utrzymuje widoczne elementy dziecka.

Dodaje również gif do wstępnego ładowania, który znika po załadowaniu. Być może konieczne będzie przetestowanie z większym obrazem, aby zobaczyć to w akcji.

Kod i skrzypce/opis poniżej.

jQuery(document).ready(function() { 
 

 
    jQuery('.Loader').each(function(index, el) { 
 

 
    var sBG = jQuery(this).css('background-image'); 
 
    sBG = sBG.replace('url(', '').replace(')', '').replace('"', '').replace('"', ''); 
 

 
    jQuery(this).prepend('<img src="' + sBG + '" id="tmp_' + jQuery(this).attr('id') + '" class="BGImage" />'); 
 
    jQuery(this).css('background-image', 'url("http://www.arabianbusiness.com/skins/ab.main/gfx/loading_spinner.gif")'); 
 

 
    jQuery(".BGImage:not(.processed)").each(function() { 
 
     this.onload = function() { 
 

 
     var oElement = jQuery('#' + jQuery(this).attr('id').replace('tmp_', '')); 
 
     jQuery('#' + jQuery(oElement).attr('id')).css('background-image', 'none'); 
 
     oElement.removeClass('Loader'); 
 
     jQuery(this).fadeIn(3000); 
 

 
     } 
 
    }); 
 
    }); 
 

 
});
.Loader { 
 

 
    background-position: center; 
 

 
    background-repeat: no-repeat; 
 

 
    transition: background 0.5s linear; 
 

 
} 
 

 
.BGImage { 
 

 
    position: absolute; 
 

 
    z-index: -1; 
 

 
    display: none; 
 

 
} 
 

 
#Test { 
 

 
    height: 300px; 
 

 
    background-image: url(https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcTMa7lFP0VdTl63KgPAOotSies-YQ3qSslOuXWE6FnFxJ_EfF7tsA); 
 

 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<div id="Test" class="Loader">Some text</div>