// global variable is jQuery
// top level variable in smoothslide is infotown
/**
* smoothslide.js
*
* Copyright 2012 Sawai Hiroshi
* http://www.info-town.jp
*
*/
jQuery(function($) {
/**
* utilities
*/
// create object from object
if (!Object.create) {
(function() {
function F() {}
Object.create = function(object) {
F.prototype = object;
return new F();
};
}());
}
// namespace
var infotown = {};
// extend jQuery
$.extend({
'infotown': infotown
});
infotown.namespace = function() {
var object = this;
return function(name) {
if (typeof object[name] == "undefined") {
object[name] = {};
}
return object[name];
};
}();
// implement layout object and handler object
(function() {
/**
* common property
*/
var i, group, groupWidth = 0,
slideWidth = 0,
settings = {
'containerSelector': '#slide-container',
'groupSelector': '#slide-group',
'slideSelector': '.slide',
'scrollAmount': '',
'animateDuration': 470,
'timerDuration': 940
},
timer, isInterval = false,
currentSlide = 0,
maxSlide = 0;
/**
* Create layout object
*/
var layout = infotown.namespace('layout');
/**
* initialize layout object
*
* slide elemement align horizonal
* @param {Object} options optional argument
*/
function _init(options) {
var container;
$.extend(settings, options);
container = $(settings.containerSelector);
settings.scrollAmount = (settings.scrollAmount > 0) ? settings.scrollAmount : container.outerWidth();
container.css({
overflow: 'hidden',
position: 'relative'
});
// layout slideSelector class(default slideSelector is slide-page)
$(settings.slideSelector, container).each(function(i) {
var distanceX;
distanceX = i * $(settings.slideSelector).outerWidth();
$(this).css({
overflow: 'hidden',
top: 0,
left: distanceX
});
});
maxSlide = $(settings.slideSelector).length;
group = $(settings.groupSelector);
slideWidth = $($(settings.slideSelector).get(0)).outerWidth();
// calculate group width and layout(default groupSelector is slide-group)
$(settings.slideSelector, settings.groupSelector).each(function() {
groupWidth += $(this).outerWidth();
});
group.css({
position: 'absolute',
width: groupWidth,
top: 0,
left: 0
});
}
layout.init = _init;
/**
* implement handler object
*/
var handler = infotown.namespace('handler');
/**
* scroll on scrollAmount amount
* @param {String} type standard of interval
*/
var scroll = function(type) {
return function() {
if (currentSlide >= maxSlide - 1) {
group.stop(true, true).animate({
left: '+=' + (groupWidth - slideWidth)
}, settings.animateDuration, function() {
currentSlide = 0;
if (type === 'interval') {
timer = setTimeout(scroll('interval'), settings.timerDuration);
}
});
} else {
group.stop(true, true).animate({
left: '-=' + settings.scrollAmount
}, settings.animateDuration, function() {
currentSlide++;
});
if (type === 'interval') {
timer = setTimeout(scroll('interval'), settings.timerDuration);
}
}
};
};
/**
* scroll to next slide
*/
function next() {
if (typeof timer !== 'undefined' && isInterval === true) {
group.stop(true, true);
clearTimeout(timer);
isInterval = false;
}
if ($(settings.groupSelector + ':animated').length > 0) {
return false;
}(scroll('standard')());
}
handler.next = next;
/**
* interval scroll slide
*/
function intervalNext() {
if ($(settings.groupSelector + ':animated').length > 0) {
return false;
}
isInterval = true;
setTimeout(scroll('interval'), 500);
}
handler.intervalNext = intervalNext;
/**
* stop timer
*/
function stop() {
if (typeof timer !== 'undefined') {
clearTimeout(timer);
}
group.stop(true, true);
isInterval = false;
}
handler.stop = stop;
}());
});
jQuery(function() {
var layout = $.infotown.namespace('layout');
layout.init({
'animateDuration': 500,
'timerDuration': 24400
});
var handler = $.infotown.namespace('handler');
$('#next').click(function() {
handler.next();
});
$('#interval').click(function() {
handler.stop();
handler.intervalNext();
});
$('#stop').click(function() {
handler.stop();
});
});
<div id="slide-container">
<div id="slide-group">
<div class="slide">
<h2>Slide0</h2>
<p>
Vivamus vitae neque at lorem mollis blandit vel
</p>
</div><!-- slide -->
<div class="slide">
<h2>Page1</h2>
<p>
Lorem ipsum dolor sit amet, consectetur
</p>
</div><!-- slide -->
<div class="slide">
<h2>Page2</h2>
<p>
Pellentesque quis mauris
</p>
</div><!-- slide -->
<div class="slide">
<h2>Page3</h2>
<p>
Pellentesque quis mauris dui.
</p>
</div><!-- slide -->
<div class="slide">
<h2>Page4</h2>
<p>
Pellentesque quis mauris dui.
</p>
</div><!-- slide -->
</div><!-- slide-group -->
</div><!-- /slide-container -->
<ul id="slide-nav" class="clearfix">
<li><a id="next" href="#">next slide</a></li>
<li><a id="interval" href="#">timer</a></li>
<li><a id="stop" href="#">stop timer</a></li>
</ul>
@charset "utf-8";
/**
* Copyright 2012 Sawai Hiroshi
* http://www.info-town.jp
*
*/
/* -------------------------------------------------------------------
body
------------------------------------------------------------------- */
body {
}
a:link {
color: #666;
}
a:visited {
color: #666;
}
a:hover {
color: #666;
}
a:active {
color: #666;
}
/* -------------------------------------------------------------------
slide-nav
------------------------------------------------------------------- */
ul#slide-nav {
width: 740px;
margin: 0 auto;
}
ul#slide-nav li {
float: left;
}
ul#slide-nav li a {
display: block;
padding: 15px 20px;
text-decoration: none;
outline: none;
}
/* -------------------------------------------------------------------
slide-container
------------------------------------------------------------------- */
#slide-container {
overflow: hidden;
width: 980px;
height: 400px;
background: #EEE;
}
/* -------------------------------------------------------------------
slide-group
------------------------------------------------------------------- */
#slide-group {
position: absolute;
/* script caluculate width */
height: 400px;
background: #666;
}
/* -------------------------------------------------------------------
unit of slide
------------------------------------------------------------------- */
.slide {
clear: both;
position: absolute;
width: 980px;
height: 400px;
background: #DDD;
z-index: 2;
}
.slide h2 {
margin: 2em 2em 1em;
}
.slide p {
margin: 0 2em 1em;
}
/* -------------------------------------------------------------------
clearfix
------------------------------------------------------------------- */
.clearfix:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix {
display: inline-table;
min-height: 1%;
}
/* Hides from -mac \*/
* html .clearfix {height: 1%;}
.clearfix {display: block;}
/* End hide from -mac */