Tell me more ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

I am writing code for a very basic jQuery slider with the following features:

  1. Slide the content left or right on click of next/previous links till there is no more content on the clicked side.
  2. If any content is added dynamically, the entire content should slide.

While there are still many additions and modifications necessary, I would like to know if my approach is correct and the code that I am writing is going the correct way.

HTML:

<div id="container">
    <div class="currentLeft">
        First Div
    </div>
    <div class="current">
     Second Div
    </div>
    <div class="currentRight">
     Third Div
    </div>    
</div>
<a href="#" id="previous">Previous</a>
<a href="#" id="next">Next</a>
<a href="#" id="add">Add content</a>
​

CSS:

/*the main div that contains all the sliding div*/
#container{
    width:100px;
    border:1px solid #000;
    height:20px;
    position: relative;
    overflow:hidden;
}
/*there are 3 different classes 
* current - div that is presently visible
* currentLeft - div that should slide from left on pressing previous
* currentRight - div that should slide from right on pressing next
*/
.current{
    width:99px;
    height:auto;
    position: absolute;
    float: left;
    left:0px;
}

.currentLeft{
    width:99px;
    height:auto;
    position: absolute;
    left:-100px;
    float:left;
}
.currentRight{
    width:99px;
    height:auto;
    position: absolute;
    left:100px;
    float:left;
}

jQuery:

$('#next').click(function(){
  //slide a div only if there is a next element
  if($('.currentRight').length >0)
  {        
    $('.current').animate({left:'-100px'}).removeClass('current').addClass('currentLeft').next().animate({left:'0px'}).removeClass('currentRight').addClass('current');
  }
});

$('#previous').click(function(){
  //slide a div only if there is a previous element  
  if($('.currentLeft').length >0)
  {
     $('.current').animate({left:'100px'}).removeClass('current').addClass('currentRight').prev().animate({left:'0px'}).removeClass('currentLeft').addClass('current');
  }
});

$('#add').click(function(){
  //it is used for simplicity's sake. I intend to use append()/prepend() to add more content
  var cont = $('.current').html()+'More<br/>';
  $('.current').html(cont);   
  var ht = $('.current').css('height');
  $('#container').css('height',ht);    
});    

​The demo can be seen at : http://jsfiddle.net/gentrobot/RY3TH/2/

I am planning to write a plugin for this later.

share|improve this question
1  
On code review one is supposed to include at least part of one's code in the question. – Inkbug Jul 16 '12 at 9:50
The link for the fiddle has the entire code. I thought it would be easier to review the code at the fiddle since the jQuery, CSS and HTML are separated and also are working. – gentrobot Jul 16 '12 at 10:05
@Inkbug: Included the code. Thanks for improvement suggestions :) – gentrobot Jul 16 '12 at 10:10

1 Answer

up vote 2 down vote accepted

JsFiddle

Not writing this as a plugin here are some suggestions:

  1. instead of removeClass('a').addClass('b') use toggleClass('a b')
  2. instead of searching the entire DOM for .current you should constrain it to the children of #container
  3. instead of css('height') use height()
  4. you should set the container height to the maximum height of all child elements, not just the height of the current visible one
share|improve this answer
Thanks a ton. Your suggestions are really valuable and the modifications that you have made to the code. I'll get to learn a lot from it. – gentrobot Jul 16 '12 at 17:03

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.