Adaptor is a light-weight content slider that aims to provide a simple interface for developers to create cool 2D or 3D slide animation transitions.
Currently, I've only added 3D support for webkit and Firefox, all other browsers will fallback gracefully to a simple fade transition when using the 3D effects.
All 2D slide transitions have been tested in IE6+ and all other modern browsers.
Create a view port for the 3D perspective and within that add the HTML to create a box containing slides of content.
<div class="slider-viewport"><!-- works as a viewport for the 3D transitions -->
<div id="content-box"><!-- the 3d box -->
<figure><!-- slide -->
<img src="img/slide-1.png">
<figcaption>This is slide one's description</figcaption>
</figure>
<figure>
<img src="img/slide-2.png">
<figcaption>This is slide two's description</figcaption>
</figure>
<figure>
<img src="img/slide-3.png">
<figcaption>This is slide three's description</figcaption>
</figure>
<figure class="slide">
<img src="img/slide-4.png">
<figcaption>This is slide four's description</figcaption>
</figure>
</div>
</div>
Technically no CSS is required but if the outer box div.slider-viewport
is
statically positioned the plugin will apply relative positioning to it so that
it can hold the absolutely positioned box. It should be noted that the viewport
and box should be the same width and height as the content slides so that the
rotation does not appear off center. It is also a good idea to constrain the
size of the viewport so that the slides don't spew down the page at load time.
/* overfow will get set to visible on initialisation of the plugin */
.slider-viewport { width: 560px; height: 380px; overflow: hidden }
Include the box-slider.jquery.js
(this one first) and the desired effect
scripts (these second) in your page and then on page load the usual jQuery
sugaryness applies...
$('#content-box').boxSlider( /* options */ );
speed (default: 800)
The time interval in milliseconds within which the slide animation will completeautoScroll (default: false)
Set true to automatically transition through the slidestimeout (default: 5000)
The time interval between slide transitions. For use with autoscrollpause (default: null)
A DOM element, jQuery object or selector for an element that when clicked will toggle the autoscoll state of the slider. When the slider is in a paused state the element will be applied a class name of pausedpauseOnHover (default: false)
Pause an auto-scrolling slider when the users mouse hovers over it. For use with autoscrollnext (default: null)
A DOM element, jQuery object or selector for an element that when clicked will advance the slider to the next slideprev (default: null)
A DOM element, jQuery object or selector for an element that when clicked will advance the slider to the previous slideeffect (default: 'scrollVert3d')
The slide animation effect to use when scrolling through content slides
perspective (default: 1000)
The 3D perspective at which the content slides are placed from the view port during transition
Shows a slide at the specified index starting from 0
$('#content-box').boxSlider('showSlide', 3); // show 4th slide
Start autoScrolling a slideshow or pause an already running slideshow
$('#content-box').boxSlider('playPause');
Get or set a specific option
$('#content-box').boxSlider('option', 'speed'); // returns speed option value
$('#content-box').boxSlider('option', 'speed', 1200); // sets the speed option to 1200
Destroys the plugin for the selected sliders
$('#content-box').boxSlider('destroy');
Moves the slider to the next slide
$('#content-box').boxSlider('next');
Moves the slider to the previous slide
$('#content-box').boxSlider('prev');
Fires before each slide transition starts. The function parameter will be bound to the jQuerified box and will receive the current slide as it's first parameter, the next slide as its second, the current slide index as it's third and the next slide index as it's last.
$('#content-box').boxSlider('option', 'onbefore', function ($currentSlide, $nextSlide, currIndex, nextIndex) {
// 'this' is effectively $('#content-box')
});
Fires after each slide transition is complete. The function parameter will be bound to the jQuerified box and will receive the previous slide as it's first parameter, the next slide as its second, the current slide index as it's third and the next slide index as it's last.
$('#content-box').boxSlider('option', 'onafter', function ($previousSlide, $currentSlide, currIndex, nextIndex) {
// 'this' is effectively $('#content-box')
});
The animation effects come as adaptors that are registered with the main box slider plugin
using the registerAnimator
method in one of the following ways. If the adaptor supports
more than one animation effect then these must be passed in as a comma separated list.
$.fn.boxSlider('registerAnimator', 'effectName', AnimatorObject); // on $.fn
window.jqBoxSlider.registerAnimator('effect1,effect2' AnimatorObject); // on the global alias
Slide animators must implement the following interface and adhere to some fundamental rules.
This method is optional and is called during the adaptor registration process. The supports3D
parameter identifies whether the host browser supports 3D CSS transformations and the vendorPrefix
parameter provides the host browser CSS vendor prefix if it exists, e.g '-moz-'
, '-webkit-'
.
adaptor.configure = function (supports3D, vendorPrefix) {
// implementation omitted
};
This method is required and sets up the initial state of each content slider. The first parameter
$box
is the jQuery content sliders main box (the selected element when the plugin is initialised), the
second parameter is the jQuery $slides
object containing all of the individual slide elements and
the third parameter settings
is the settings for the current content slider.
adaptor.initialize = function ($box, $slides, settings) {
// implementation omitted
};
During the initialisation process you may set the _slideFilter
attribute on settings
which will
be used to filter the set of slides ($slides
) before the transition takes place. An example of this
can be seen in the box-slider-fx-blinds.js
adaptor. This filter uses the jQuery filter method but
if you pass a function then that function will be bound to the unfiltered $slides
jQuery object and will
recieve the index as the first paramter and the plugin settings as the second.
adaptor.initialize = function ($box, $slides, settings) {
// implementation omitted
settings._slideFilter = function (index, settings) {
return this.get(index) !== settings.$blinds; // 'this' will be $slides
}
};
This method is required and completes the transition from the current slide to the next slide.
The settings
parameter is the plugin settings for the content slider extended with the following.
{
$box: // jQuery object containing the content slider box
, $slides: // jQuery object containing all of the content slides
, $currSlide: // jQuery object containing the current visible slide
, $nextSlide: // jQuery object containing the next slide to show
, reverse: // the direction in which to travel (read forwards, backwards)
, currIndex: // the index at which $currSlide resides within $slides
, nextIndex: // the index at which $nextSlide resides within $slides
}
This method must support browsers that do not support 3D transformations by degrading gracefully to some other method of transitioning the slides. Any settings that need to be cached against the content slider for the next transition should be returned as a simple object which will be mixed into the plugin settings.
adaptor.transition = function (settings) {
// move to the next previous slides
return { mycustomsetting: 'value' };
};
This method is optional and provides a method to reset the state of the plugin when an option is updated
or the plugin is re-initialised. The first parameter $box
is the content slider and the second settings
is the options for the content slider.
adaptor.reset($box, settings) {
// reset the content slider's state
}
This method is required and handles the clean up required to return the
element contained in the $box
jQuery object back to it's original state
before initialize
was called. Any additional settings applied to settings
should also be removed.
adaptor.destroy = function ($box, settings) {
// reset css and remove any additional settings
};
You do not need to define this method as it will be applied to the animation adaptor at
the time it is registered with the plugin through the call to registerAnimator
. This
method will cache the original CSS of the given jQuery object in the
bssettings
data set for the slider, the settings
object passed to all of the adaptor
functions, so that the original CSS may be applied when the plugin is destroyed or reset.
By default the following CSS attributes are cached position, top, left, display, overflow, width, height
.
Any additional attributes should be passed in as an array or strings in the extraAttributes
parameter.
adaptor.initialize = function ($box, $slides, settings) {
// cache the original css for reset or destroy
adaptor._cacheOriginalCSS($box, 'box', settings);
adaptor._cacheOriginalCSS($slides, 'slides', settings, [
vendorPrefix + 'transform'
, vendorPrefix + 'transition'
]);
// implementation omitted
}
The cached CSS will then be available on the slider settings via the
origCSS
object under the item name
provided when _cacheOriginalCSS
was called.
adaptor.destroy = function ($box, settings) {
// reset the original css
$box.children().css(settings.origCSS.slides);
$box.css(settings.origCSS.box);
};
Below is an example of a simple 2D fade transition registered with the plugin
as the fade
effect.
;(function (w, $, undefined) {
w.jqBoxSlider.registerAnimator('fade', (function () {
var adaptor = {};
// setup slide and box css
adaptor.initialize = function ($box, $slides, settings) {
// cache the original css for reset or destroy
adaptor._cacheOriginalCSS($box, 'box', settings);
adaptor._cacheOriginalCSS($slides, 'slides', settings);
if ('static auto'.indexOf($box.css('position')) !== -1) {
$box.css('position', 'relative');
}
$box.css({height: $slides.eq(0).height(), overflow: 'hidden'});
$slides
.css({ position: 'absolute', top: 0, left: 0 })
.filter(':gt(0)').hide();
};
// fade current out and next in
adaptor.transition = function (settings) {
settings.$nextSlide.fadeIn(settings.speed);
settings.$currSlide.fadeOut(settings.speed);
};
// reset the original css
adaptor.destroy = function ($box, settings) {
$box.children().css(settings.origCSS.slides);
$box.css(settings.origCSS.box);
};
return adaptor;
}()));
}(window, jQuery || Zepto));