Expandable Panels

by Martin Murciego

HTML

<div id="container">
    <div class="expandable-panel" id="cp-1">
        <div class="expandable-panel-heading">
            <h2>Content heading 1<span class="icon-close-open"></span></h2>
         </div>
        <div class="expandable-panel-content">
            <p>First Panel HTML...</p>
        </div>
    </div>
     
    <div class="expandable-panel" id="cp-2">
        <div class="expandable-panel-heading">
            <h2>Content heading 2<span class="icon-close-open"></span></h2>
         </div>
        <div class="expandable-panel-content">
            <p>Second Panel HTML...</p>
             
        </div>
  </div>
     
  <div class="expandable-panel" id="cp-3">
     <div class="expandable-panel-heading">
         <h2>Content heading 3<span class="icon-close-open"></span></h2>
     </div>
     <div class="expandable-panel-content">
         <p>Third Panel HTML...</p>
     </div>
  </div> 
</div>









<!-- Post Info -->
<div style='position:fixed;bottom:0;left:0;    
            background:lightgray;width:100%;'>
    Code Sample Taken From: <a href='http://www.webdevdoor.com/jquery/expandable-collapsible-panels-jquery/'>Web Dev Door</a>
<div>

CSS

h2, p, ol, ul, li {
    margin:0px;
    padding:0px;
    font-size:13px;
    font-family:Arial, Helvetica, sans-serif;
}
#container {
    width:300px;
    margin:auto;
    margin-top:100px;
}
/* --------- COLLAPSIBLE PANELS ----------*/
 .expandable-panel {
    width:100%;
    position:relative;
    min-height:50px;
    overflow:auto;
    margin-bottom: 20px;
    border:1px solid #999;
}
.expandable-panel-heading {
    width:100%;
    cursor:pointer;
    min-height:50px;
    clear:both;
    background-color:#E5E5E5;
    position:relative;
}
.expandable-panel-heading:hover {
    color:#666;
}
.expandable-panel-heading h2 {
    padding:14px 10px 9px 15px;
    font-size:18px;
    line-height:20px;
}
.expandable-panel-content {
    padding:0 15px 0 15px;
    margin-top:-999px;
}
.expandable-panel-content p {
    padding:4px 0 6px 0;
}
.expandable-panel-content p:first-child {
    padding-top:10px;
}
.expandable-panel-content p:last-child {
    padding-bottom:15px;
}
.icon-close-open {
    width:20px;
    height:20px;
    position:absolute;
    background-image:url(http://i.imgur.com/Ir4S1H7.png);
    right:15px;
}

JavaScript

$(function () {
    /*-------------------- EXPANDABLE PANELS ----------------------*/
    var panelspeed = 500; //panel animate speed in milliseconds
    var totalpanels = 3; //total number of collapsible panels   
    var defaultopenpanel = 0; //leave 0 for no panel open   
    var accordian = false; //set panels to behave like an accordian, with one panel only ever open at once      

    var panelheight = new Array();
    var currentpanel = defaultopenpanel;
    var iconheight = parseInt($('.icon-close-open').css('height'));

    //Initialise collapsible panels
    function panelinit() {
        for (var i = 1; i <= totalpanels; i++) {
            panelheight[i] = parseInt($('#cp-' + i).find('.expandable-panel-content').css('height'));
            $('#cp-' + i).find('.expandable-panel-content').css('margin-top', -panelheight[i]);
            if (defaultopenpanel == i) {
                $('#cp-' + i).find('.icon-close-open').css('background-position', '0px -' + iconheight + 'px');
                $('#cp-' + i).find('.expandable-panel-content').css('margin-top', 0);
            }
        }
    }



    $('.expandable-panel-heading').click(function () {
        var obj = $(this).next();
        var objid = parseInt($(this).parent().attr('ID').substr(3, 2));
        currentpanel = objid;
        if (accordian == true) {
            resetpanels();
        }

        if (parseInt(obj.css('margin-top')) <= (panelheight[objid] * -1)) {
            obj.clearQueue();
            obj.stop();
            obj.prev().find('.icon-close-open').css('background-position', '0px -' + iconheight + 'px');
            obj.animate({
                'margin-top': 0
            }, panelspeed);
        } else {
            obj.clearQueue();
            obj.stop();
            obj.prev().find('.icon-close-open').css('background-position', '0px 0px');
            obj.animate({
                'margin-top': (panelheight[objid] * -1)
            }, panelspeed);
        }
    });

   ...