From our sponsor: Meco is a distraction-free space for reading and discovering newsletters, separate from the inbox.
An autoplay rotator for quotes (or any kind of content). An indicator above the content shows the progress. A blockquote with an image is used as an example. Also, an example media query shows how to resize the content for smaller screens.
The HTML
<div id="cbp-qtrotator" class="cbp-qtrotator"> <div class="cbp-qtcontent"> <img src="images/1.jpg" alt="img01" /> <blockquote> <p>People eat meat and think they will become as strong as an ox, forgetting that the ox eats grass.</p> <footer>Pino Caruso</footer> </blockquote> </div> <div class="cbp-qtcontent"> <!-- ... --> </div> <div class="cbp-qtcontent"> <!-- ... --> </div> <div class="cbp-qtcontent"> <!-- ... --> </div> </div>
The CSS
.cbp-qtrotator { position: relative; margin: 3em auto 5em auto; max-width: 800px; width: 100%; min-height: 400px; } .cbp-qtrotator .cbp-qtcontent { position: absolute; min-height: 200px; border-top: 1px solid #f4f4f4; border-bottom: 1px solid #f4f4f4; padding: 2em 0; top: 0; z-index: 0; opacity: 0; width: 100%; } .no-js .cbp-qtrotator .cbp-qtcontent { border-bottom: none; } /* Currently visible */ .cbp-qtrotator .cbp-qtcontent.cbp-qtcurrent, .no-js .cbp-qtrotator .cbp-qtcontent { position: relative; z-index: 100; pointer-events: auto; opacity: 1; } .cbp-qtrotator .cbp-qtcontent:before, .cbp-qtrotator .cbp-qtcontent:after { content: " "; display: table; } .cbp-qtrotator .cbp-qtcontent:after { clear: both; } .cbp-qtprogress { position: absolute; background: #47a3da; height: 1px; width: 0%; top: 0; z-index: 1000; } .cbp-qtrotator blockquote { margin: 0; padding: 0; } .cbp-qtrotator blockquote p { font-size: 2em; color: #888; font-weight: 300; margin: 0.4em 0 1em; } .cbp-qtrotator blockquote footer { font-size: 1.2em; } .cbp-qtrotator blockquote footer:before { content: '? '; } .cbp-qtrotator .cbp-qtcontent img { float: right; margin-left: 3em; } /* Example for media query */ @media screen and (max-width: 30.6em) { .cbp-qtrotator { font-size: 70%; } .cbp-qtrotator img { width: 80px; } }
Tiny break: 📬 Want to stay up to date with frontend and trends in web design? Subscribe and get our Collective newsletter twice a tweek.
The JavaScript
/** * jquery.cbpQTRotator.js v1.0.0 * http://www.codrops.com * * Licensed under the MIT license. * http://www.opensource.org/licenses/mit-license.php * * Copyright 2013, Codrops * http://www.codrops.com */ ;( function( $, window, undefined ) { 'use strict'; // global var Modernizr = window.Modernizr; $.CBPQTRotator = function( options, element ) { this.$el = $( element ); this._init( options ); }; // the options $.CBPQTRotator.defaults = { // default transition speed (ms) speed : 700, // default transition easing easing : 'ease', // rotator interval (ms) interval : 8000 }; $.CBPQTRotator.prototype = { _init : function( options ) { // options this.options = $.extend( true, {}, $.CBPQTRotator.defaults, options ); // cache some elements and initialize some variables this._config(); // show current item this.$items.eq( this.current ).addClass( 'cbp-qtcurrent' ); // set the transition to the items if( this.support ) { this._setTransition(); } // start rotating the items this._startRotator(); }, _config : function() { // the content items this.$items = this.$el.children( 'div.cbp-qtcontent' ); // total items this.itemsCount = this.$items.length; // current item´s index this.current = 0; // support for CSS Transitions this.support = Modernizr.csstransitions; // add the progress bar if( this.support ) { this.$progress = $( '<span class="cbp-qtprogress"></span>' ).appendTo( this.$el ); } }, _setTransition : function() { setTimeout( $.proxy( function() { this.$items.css( 'transition', 'opacity ' + this.options.speed + 'ms ' + this.options.easing ); }, this ), 25 ); }, _startRotator: function() { if( this.support ) { this._startProgress(); } setTimeout( $.proxy( function() { if( this.support ) { this._resetProgress(); } this._next(); this._startRotator(); }, this ), this.options.interval ); }, _next : function() { // hide previous item this.$items.eq( this.current ).removeClass( 'cbp-qtcurrent' ); // update current value this.current = this.current < this.itemsCount - 1 ? this.current + 1 : 0; // show next item this.$items.eq( this.current ).addClass('cbp-qtcurrent'); }, _startProgress : function() { setTimeout( $.proxy( function() { this.$progress.css( { transition : 'width ' + this.options.interval + 'ms linear', width : '100%' } ); }, this ), 25 ); }, _resetProgress : function() { this.$progress.css( { transition : 'none', width : '0%' } ); }, destroy : function() { if( this.support ) { this.$items.css( 'transition', 'none' ); this.$progress.remove(); } this.$items.removeClass( 'cbp-qtcurrent' ).css( { 'position' : 'relative', 'z-index' : 100, 'pointer-events' : 'auto', 'opacity' : 1 } ); } }; var logError = function( message ) { if ( window.console ) { window.console.error( message ); } }; $.fn.cbpQTRotator = function( options ) { if ( typeof options === 'string' ) { var args = Array.prototype.slice.call( arguments, 1 ); this.each(function() { var instance = $.data( this, 'cbpQTRotator' ); if ( !instance ) { logError( "cannot call methods on cbpQTRotator prior to initialization; " + "attempted to call method '" + options + "'" ); return; } if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) { logError( "no such method '" + options + "' for cbpQTRotator instance" ); return; } instance[ options ].apply( instance, args ); }); } else { this.each(function() { var instance = $.data( this, 'cbpQTRotator' ); if ( instance ) { instance._init(); } else { instance = $.data( this, 'cbpQTRotator', new $.CBPQTRotator( options, this ) ); } }); } return this; }; } )( jQuery, window );
awesome as usually, but specially i like the progress bar..
very good
It would be nice if you could provide someway to pause.
I agree with Ahmad Alfy, could you perhaps show us how to add a pause button or a hover over pause? Nevertheless, awesome work, thank you for this.
this looks good! I really like the line animation, especially because I have no experience with javascript, but still I get the code.
Any way to get the pause or hover stop effect, i really need this.
Might want to add overflow:hidden onto .cbp-qtrotator, otherwise if one item is much taller than the others it will increase the height of the body element, leaving a big space below the page.
Hi,
I love it, but can’t get it running on my Drupal website. Are there Drupal-Pros around reading this? Has anyone already successfuly implemented this into a Drupal website? Any healp very much appreciated!
Nice! Very nice, thank.
awesome works… 😀
hopefully you add the pause feature dude
Please help me . Any way to get the pause and hover stop effect, i really need this.
I love your “Quotes Rotator.” I would love it even more, if one could click back and forth among the quotes to see my favorite(s). Thanks for all your Blueprints.
This seems to be broken in IE8, as in the opacity doesn’t seem to work correctly, all the quotes are layered on top of one-another. Anyone else having this issue?
I am! Did you find a solution at all for this?!
Matt I ran into the same problem and counldn’t find a fix for it either.
I ended up re-creating the effect using Jquery without the CSS transitions.
I’ve uploaded it to Github for anyone who’s looking for an alternative.
https://github.com/andrewbiggart/jquery-quote-rotator
You guys are doing an amazing job ! Keep up the awesome work ! Mary
Cheers !
@Matt – Yes, unfortunately does not work in IE8. All the quotes appear at once overlapping each other.
Has anyone been able to modify this code to work for IE8? I’ve also seen the overlapping in Vista IE9. I know it is a small percentage of users that still operate in that arena, but I do have clients that have some old installations they would like to support.
I’ve created an alternative without the CSS transitions which works in I.E.
https://github.com/andrewbiggart/jquery-quote-rotator
This may be laughed at, but can I get this to work in iWeb? If so, where would I drop the Source Download files?
Perhaps you can provide a tutorial? There are only three sections of code above but in the download file there are two CSS sheets, three JS files, and no HTML code.
So which ones need to be used. I have installed it and only see the quotes listed and zero functionality. Please help. 🙂
Just open the demo site, and see how CSS and JS files are installed in HTML code.
Google Chrome – Right Click (on demo site) -> “inspect element”
Tell me, and you can attach a button back and forth?
Hi!! I am having a lot of difficulty trying to change the speed, can anyone help me out?
Thanks!
Look at the js file for interval:8000 (in your case the number may be different) and change that. Transition speed is just before that as well. Search within the file for speed.
Please tell me step-by-step how to implement this if my website has been built on weebly.
I am not able to implement it there.
http://www.GurbaniWorldRadio.com
Awaiting your reply.
does anyone also have the issue that you can only put one at a time of not the content wont show up??
I’ve got a question and maybe a bit of a request on this wonderful script.
How can I make the items (quotes) random?
Also would like to see a next and previous buttons/links for this. At least show me the way if possible please and thank you 🙂
By the way, I’ve got my example at http://eddie11.com (half way down the page). Thanks again anyone.
Yeah, good job on that script but how to make the quotes random ?
This is really nice; my question is why is there a 25ms timeout on the helper functions that set css properties? Is this a workaround to a bug of some kind?