// 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 */