This is my website http://www.alienchela.com/portfolio.html.
First click any client image it's OK.
But if you click on next button every time then you can see. First the previous image is come then the next image is load.
Here is the code:
var ticker = $('.img_wrap');
$('.next').click(function () {
$('.img_panel:visible').fadeOut(1000, function() {
$(this).appendTo(ticker);
ticker.children().first().show(function(){
var artit = $(this).attr('title');
$(this).load(artit+'.txt');
});
});
$(ticker).hide().delay(1500).fadeIn(1000);
});
I did a hack. I made the transition with some delay.
$(ticker).hide().delay(1500).fadeIn(1000);
I am not so good is JS.
Any help is appreciated.
Here you go:
Analysis
1. Initial state
<div class="img_wrap">
<div class="img_panel" title="pixi">pixi</div>
<div class="img_panel" title="mus">mus</div>
<div class="img_panel" title="flash">flash</div>
<div class="img_panel" title="dir">dir</div>
<div class="img_panel" title="rpi">rpi</div>
<div class="img_panel" title="ac">ac</div>
<div class="img_panel" title="css">css</div>
<div class="img_panel" title="nagraj">nagraj</div>
</div>
2. Click on "AC"
<div class="img_wrap">
<div class="img_panel" title="pixi">
<img src="img/clients/ac/ac_top.jpg" width="1040" height="217" alt="aucourant"><img src="img/clients/ac/ac1.jpg" width="1040" height="502" alt="aucourant">
</div>
<div class="img_panel" title="mus">
<img src="img/clients/ac/ac_top.jpg" width="1040" height="217" alt="aucourant"><img src="img/clients/ac/ac1.jpg" width="1040" height="502" alt="aucourant">
</div>
<div class="img_panel" title="flash">
<img src="img/clients/ac/ac_top.jpg" width="1040" height="217" alt="aucourant"><img src="img/clients/ac/ac1.jpg" width="1040" height="502" alt="aucourant">
</div>
<div class="img_panel" title="dir">
<img src="img/clients/ac/ac_top.jpg" width="1040" height="217" alt="aucourant"><img src="img/clients/ac/ac1.jpg" width="1040" height="502" alt="aucourant">
</div>
<div class="img_panel" title="rpi">
<img src="img/clients/ac/ac_top.jpg" width="1040" height="217" alt="aucourant"><img src="img/clients/ac/ac1.jpg" width="1040" height="502" alt="aucourant">
</div>
<div class="img_panel" title="ac" style="display: block;">
<img src="img/clients/ac/ac_top.jpg" width="1040" height="217" alt="aucourant"><img src="img/clients/ac/ac1.jpg" width="1040" height="502" alt="aucourant">
</div>
<div class="img_panel" title="css">
<img src="img/clients/ac/ac_top.jpg" width="1040" height="217" alt="aucourant"><img src="img/clients/ac/ac1.jpg" width="1040" height="502" alt="aucourant">
</div>
<div class="img_panel" title="nagraj">
<img src="img/clients/ac/ac_top.jpg" width="1040" height="217" alt="aucourant"><img src="img/clients/ac/ac1.jpg" width="1040" height="502" alt="aucourant">
</div>
</div>
Explanation
Each img_panel
has the header image for "AC". And they don't have the CSS display:none;
, meaning those divs are visible. When you execute,
$('.img_panel:visible').fadeOut(1000, function() {
$(this).appendTo(ticker);
ticker.children().first().show(function(){
var artit = $(this).attr('title');
$(this).load(artit+'.txt');
});
the current item is hidden and next one is shown. During the transition period, both the current and the next items will be partially hidden, and the image in the background div shows.
Problematic Code
$('.work li').click(function(){
var clientitle = $(this).attr('title');
$('.work').fadeOut(500), $('.big_images').delay(500).fadeIn();
$('.img_panel[title="'+clientitle+'"]').fadeIn();
var cltxt = clientitle+'.txt'
$('.img_panel').load(cltxt);
});
Solution
// Only load data to active div
$('.img_panel[title="' + clientitle + '"]').load(cltxt);
Also, it is better to do this:
// Hide all divs
$('.img_panel').hide();
// Load and unhide active div
$('.img_panel[title="' + clientitle + '"]').load(cltxt).show();
Problem 2
When you click on "AC" and then click Next
, the code becomes this:
<div class="img_wrap" style="display: block;">
<div class="img_panel" title="pixi" style="display: block;">...</div>
<div class="img_panel" title="mus">...</div>
<div class="img_panel" title="flash">...</div>
<div class="img_panel" title="dir">...</div>
<div class="img_panel" title="rpi">...</div>
<div class="img_panel" title="css">...</div>
<div class="img_panel" title="nagraj">...</div>
<div class="img_panel" title="ac" style="display: none;">...</div>
</div>
See, the ac
element goes to the last, making the order wrong for next iterations.
Solution
There is no need to rearrange the div
elements. Just use an array of titles and a index to handler next
and prev
.
var ticker = $('.img_wrap');
$('.next').click(function () { //When the next button is clicked
$('.img_panel:visible').fadeOut(1000, function() { //Fade out the current active image
$(this).appendTo(ticker); //And move its div to the bottom of ticker
ticker.children().first().show(function(){ //Then show the first div in ticker
var artit = $(this).attr('title');
$(this).load(artit+'.txt');
});
});
$(ticker).hide().delay(1500).fadeIn(1000);
});
The default order is: pixi mus flash dir rpi ac css nagraj.
The problem with your code is that when the page is freshly loaded and you select an image from the menu, it will take you there. It assumes, once it has taken you there, that the active div is at the top, when it could be anywhere, including the middle.
To solve this, you want to move all divs in ticker
to the bottom such that the original order of pixi mus flash dir rpi ac css nagraj is preserved, but the one that is active is at the top as it should be.
Your relevant code is actually here, when an item is selected from the menu:
$('.work li').click(function(){
var clientitle = $(this).attr('title');
$('.work').fadeOut(500), $('.big_images').delay(500).fadeIn();
$('.img_panel[title="'+clientitle+'"]').fadeIn();
var cltxt = clientitle+'.txt'
$('.img_panel').load(cltxt);
});
Something like this should fix the problem:
$('.work li').click(function(){
var clientitle = $(this).attr('title');
$('.work').fadeOut(500), $('.big_images').delay(500).fadeIn();
$('.img_wrap').children().each(function() {
if ($(this).attr('title') == clientitle) {
return false;
}
$(this).appendTo($('.img_wrap'));
});
$('.img_panel[title="'+clientitle+'"]').fadeIn();
var cltxt = clientitle+'.txt'
$('.img_panel').load(cltxt);
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With