Folded Accordion-style Carousel With jQuery
| File Size: | 2.62 KB |
|---|---|
| Views Total: | 1477 |
| Last Update: | |
| Publish Date: | |
| Official Website: | Go to website |
| License: | MIT |
A folded accordion style photo gallery that expands the selected image into a full-size carousel with arrow navigation and collapse button.
How to use it:
1. Create an html list of images for the carousel.
<ul id="jsi-slider-container" class="slider-container"> <li><a href="javascript:void(0);"><img src="1.jpg" /></a></li> <li><a href="javascript:void(0);"><img src="2.jpg" /></a></li> <li><a href="javascript:void(0);"><img src="3.jpg" /></a></li> <li><a href="javascript:void(0);"><img src="4.jpg" /></a></li> <li><a href="javascript:void(0);"><img src="5.jpg" /></a></li> <li><a href="javascript:void(0);"><img src="6.jpg" /></a></li> ... </ul>
2. Add the navigation arrows & close button to the carousel.
<div id="jsi-close-trigger-container" class="close-trigger-container"><a href="javascript:void(0);">Close</a></div> <div id="jsi-previous-trigger-container" class="move-trigger-container previous"><a href="javascript:void(0);"><</a></div> <!-- Carousel Here --> <div id="jsi-next-trigger-container" class="move-trigger-container next"><a href="javascript:void(0);">></a></div>
3. Copy and paste the following CSS styles to your webpage.
.slider-container {
position: absolute;
margin: 0;
padding: 0;
list-style: none;
}
.slider-container > li {
float: left;
overflow: hidden;
width: 100px;
height: 100%;
}
.move-trigger-container {
display: none;
position: absolute;
top: 0;
height: 100%;
padding: 0;
z-index: 10;
background-color: rgba(0, 0, 0, 0.5);
}
.move-trigger-container > a {
position: relative;
display: inline-block;
padding: 10px;
top: 50%;
transform: translateY(-50%);
font-size: 50px;
color: #FFFFFF;
text-decoration: none;
}
.previous { left: 0; }
.next { right: 0; }
.close-trigger-container {
position: absolute;
display: none;
bottom: 10px;
left: 50%;
transform: translateX(-50%);
font-size: 16px;
font-weight: bold;
z-index: 10;
background-color: rgba(0, 0, 0, 0.5);
border-radius: 10px;
}
.close-trigger-container > a {
display: inline-block;
width: 100%;
height: 100%;
padding: 10px;
color: #FFFFFF;
text-decoration: none;
}
4. Place the latest version of the jQuery JavaScript library at the bottom of the page.
<script src="//code.jquery.com/jquery-3.2.1.min.js"></script>
5. The main function for the carousel.
var SLIDER_CONTROLLER = {
ADJUST_TIME : 600,
SLIDE_TIME : 600,
init : function(){
this.setParameters();
this.bindEvent();
},
setParameters : function(){
this.$container = $('#jsi-slider-container');
this.$cassettes = this.$container.children('li');
this.$previousTriggerContainer = $('#jsi-previous-trigger-container');
this.$previous = this.$previousTriggerContainer.children('a');
this.$nextTriggerContainer = $('#jsi-next-trigger-container');
this.$next = this.$nextTriggerContainer.children('a');
this.$closeTriggerContainer = $('#jsi-close-trigger-container');
this.$close = this.$closeTriggerContainer.children('a');
this.initContainerWidth = this.$container.outerWidth();
this.initCassetteWidth = this.$cassettes.outerWidth();
this.cassetteCount = this.$cassettes.length;
this.status = 0;
this.currentIndex = 0;
},
bindEvent : function(){
var myself = this;
this.$cassettes.each(function(index){
var $cassette = $(this);
$cassette.on('click', myself.extendCassetes.bind(myself, $cassette, index));
});
this.$close.on('click', this.shortenCassettes.bind(this));
this.$previous.on('click', this.goToPrevious.bind(this));
this.$next.on('click', this.goToNext.bind(this));
},
extendCassetes : function($cassette, index){
if(this.$container.is(':animated') || this.status == 1){
return;
}
$cassette.animate({width : this.initContainerWidth}, this.ADJUST_TIME);
this.$container.animate(
{width : this.initContainerWidth + (this.initContainerWidth - this.initCassetteWidth), left : -this.initCassetteWidth * index},
this.ADJUST_TIME,
this.finishToExtendCassettes.bind(this, index)
);
},
shortenCassettes : function(){
if(this.$container.is(':animated') || this.status == 0){
return;
}
this.$container
.width(this.initContainerWidth + this.initCassetteWidth * (this.cassetteCount - 1))
.css('left', -this.currentIndex * this.initCassetteWidth)
.animate(
{width : this.initContainerWidth, left : 0},
this.ADJUST_TIME,
this.finishToShortenCassettes.bind(this)
);
this.$cassettes.width(this.initCassetteWidth);
this.$cassettes.eq(this.currentIndex).width(this.initContainerWidth).animate({width : this.initCassetteWidth}, this.ADJUST_TIME);
this.$previousTriggerContainer.fadeOut();
this.$nextTriggerContainer.fadeOut();
this.$closeTriggerContainer.fadeOut();
},
finishToExtendCassettes : function(index){
this.$container
.width(this.initContainerWidth * this.cassetteCount)
.css('left', -index * this.initContainerWidth);
this.$cassettes.width(this.initContainerWidth);
this.status = 1;
this.currentIndex = index;
if(this.currentIndex != 0){
this.$previousTriggerContainer.fadeIn();
}
if(this.currentIndex != this.cassetteCount - 1){
this.$nextTriggerContainer.fadeIn();
}
this.$closeTriggerContainer.fadeIn();
},
finishToShortenCassettes : function(){
this.status = 0;
},
goToPrevious : function(){
if(this.currentIndex == 0 || this.$container.is(':animated')){
return;
}
this.currentIndex--;
this.moveContainer();
},
goToNext : function(){
if(this.currentIndex == this.cassetteCount - 1 || this.$container.is(':animated')){
return;
}
this.currentIndex++;
this.moveContainer();
},
moveContainer : function(){
this.$container.animate({left : -this.currentIndex * this.initContainerWidth}, this.SLIDE_TIME);
if(this.currentIndex == 0){
this.$previousTriggerContainer.fadeOut();
}else{
this.$previousTriggerContainer.fadeIn();
}
if(this.currentIndex == this.cassetteCount - 1){
this.$nextTriggerContainer.fadeOut();
}else{
this.$nextTriggerContainer.fadeIn();
}
}
};
6. Initialize the carousel on page load.
$(window).on('load', function(){
SLIDER_CONTROLLER.init();
});
This awesome jQuery plugin is developed by K-T. For more Advanced Usages, please check the demo page or visit the official website.










