这是一个简单的jQuery和css3手风琴效果。效果上类似于目录结构。
HTML
<ul id="cbp-ntaccordion" class="cbp-ntaccordion"> <li> <h3 class="cbp-nttrigger">Oat cake tootsie roll</h3> <div class="cbp-ntcontent"> <p><!-- ... --></p> <ul class="cbp-ntsubaccordion"> <li> <h4 class="cbp-nttrigger">Donut pastry</h4> <div class="cbp-ntcontent"><!-- ... --></div> </li> <li> <h4 class="cbp-nttrigger">Carrot cake</h4> <div class="cbp-ntcontent"> <!-- ... --> <ul class="cbp-ntsubaccordion"> <li> <h5 class="cbp-nttrigger">Donut pastry</h5> <div class="cbp-ntcontent"><!-- ... --></div> </li> <li><!-- ... --></li> <li><!-- ... --></li> </ul> </div> </li> <li> <h4 class="cbp-nttrigger">Tootsie roll marshmallow</h4> <div class="cbp-ntcontent"> <!-- ... --> </div> </li> </ul> </div> </li> <li><!-- ... --></li> <li><!-- ... --></li> <li><!-- ... --></li> </ul>
JAVASCRIPT
;( function( $, window, undefined ) { 'use strict'; // global var $body = $( 'html, body' ); $.CBPNTAccordion = function( options, element ) { this.$el = $( element ); this._init( options ); }; // the options $.CBPNTAccordion.defaults = {}; $.CBPNTAccordion.prototype = { _init : function( options ) { // options this.options = $.extend( true, {}, $.CBPNTAccordion.defaults, options ); // cache some elements and initialize some variables this._config(); // initialize/bind the events this._initEvents(); }, _config : function() { // the clickable items this.$items = this.$el.find( '.cbp-nttrigger' ); }, _initEvents : function() { this.$items.on( 'click.cbpNTAccordion', function() { var $listItem = $( this ).parent(); if( $listItem.hasClass( 'cbp-ntopen' ) ) { $listItem.removeClass( 'cbp-ntopen' ); } else { $listItem.addClass( 'cbp-ntopen' ); $body.scrollTop( $listItem.offset().top ); } } ); }, destroy : function() { this.$items.off( '.cbpNTAccordion' ).parent().removeClass( 'cbp-ntopen' ); } }; var logError = function( message ) { if ( window.console ) { window.console.error( message ); } }; $.fn.cbpNTAccordion = function( options ) { if ( typeof options === 'string' ) { var args = Array.prototype.slice.call( arguments, 1 ); this.each(function() { var instance = $.data( this, 'cbpNTAccordion' ); if ( !instance ) { logError( "cannot call methods on cbpNTAccordion prior to initialization; " + "attempted to call method '" + options + "'" ); return; } if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) { logError( "no such method '" + options + "' for cbpNTAccordion instance" ); return; } instance[ options ].apply( instance, args ); }); } else { this.each(function() { var instance = $.data( this, 'cbpNTAccordion' ); if ( instance ) { instance._init(); } else { instance = $.data( this, 'cbpNTAccordion', new $.CBPNTAccordion( options, this ) ); } }); } return this; }; } )( jQuery, window );