Creating A Retro Flip Clock with jQuery And CSS3
File Size: | 3.13 KB |
---|---|
Views Total: | 4642 |
Last Update: | |
Publish Date: | |
Official Website: | Go to website |
License: | MIT |

A lightweight jQuery extension that uses CSS3 transforms to create a beautiful retro-looking flip clock displaying the current local time.
How to use it:
1. The html structure for the flip clock.
<time> <div class="clock"> <div class="dial-container dial-container--hh js-clock" data-cur="9" data-start="0" data-end="12" data-dur="hh"> </div> <div class="dial-container dial-container--mm js-clock" data-cur="2" data-start="0" data-end="5" data-dur="mm"> </div> <div class="dial-container dial-container--m js-clock" data-cur="3" data-start="0" data-end="9" data-dur="m"> </div> <div class="dial-container dial-container--ss js-clock" data-cur="4" data-start="0" data-end="5" data-dur="ss"> </div> <div class="dial-container dial-container--s js-clock" data-cur="8" data-start="0" data-end="9" data-dur="s"> </div> </div> </time>
2. The primary CSS/CSS3 styles.
.transitions-off * { -webkit-transition: none !important; transition: none !important; } time { position: absolute; top: 150px; left: 0; right: 0; margin: 0; display: block; text-align: center; } .dial-container { display: inline-block; position: relative; text-align: center; margin: auto; -webkit-perspective: 1000; perspective: 1000; height: 100px; width: 65px; cursor: default; } .dial-container.dial-container--hh { width: 120px; } span { width: 65px; height: 50px; } .dial { top: 0; height: 25px; /* overflow: hidden */ -webkit-transition: all 0.6s; transition: all 0.6s; -webkit-transform-style: preserve-3d; transform-style: preserve-3d; position: absolute; z-index: 3; -webkit-transform-origin: 50px 50px; -ms-transform-origin: 50px 50px; transform-origin: 50px 50px; } span { display: block; -webkit-backface-visibility: hidden; backface-visibility: hidden; position: absolute; top: 0; left: 0; height: 50px; overflow: hidden; background: #462c2e; color: #fff; text-align: center; line-height: 100px; font-size: 80px; font-weight: bold; border-radius: 10px 10px 0 0; } .dial-container--ss span, .dial-container--mm span { text-align: right; padding-right: 2px; border-radius: 10px 0 0 0; } .dial-container--hh span { text-align: center; min-width: 120px; } .dial-container--s span, .dial-container--m span { text-align: left; padding-left: 2px; border-radius: 0 10px 0 0; } span:first-child { z-index: 2; -webkit-transform: rotateY(0deg); transform: rotateY(0deg); background-color: #3c2527; color: #ccc; } span:first-child:after { display: block; width: 100%; height: 1px; background: rgba(0,0,0,0.2); content: ' '; position: absolute; bottom: 0; left: 0; } span:last-child { -webkit-transform: rotateY(180deg); transform: rotateY(180deg); border-radius: 0 0 10px 10px; line-height: 0; -webkit-transform: rotateX(180deg); transform: rotateX(180deg); } .dial-container--ss span:last-child, .dial-container--mm span:last-child { border-radius: 0 0 0 10px; } .dial-container--s span:last-child, .dial-container--m span:last-child { border-radius: 0 0 10px 0; } .dial--static, .dial--next { -webkit-transform: rotateX(0deg) !important; transform: rotateX(0deg) !important; } .dial--flipped { z-index: 2; -webkit-transform: rotateX(180deg) !important; transform: rotateX(180deg) !important; } .dial--next { z-index: 2; } .dial--later { z-index: 1; }
3. Include the latest version of jQuery library at the end of the document.
<script src="//code.jquery.com/jquery-2.1.4.min.js"></script>
4. The core JavaScript to enable the flip clock.
(function() { var appendEls, attachEvents, enableTransitions, nthDigit, reset, setAttributes, setClasses, startClock, tick; nthDigit = function(int, nth) { return parseInt(int.toString().substr(nth, 1)); }; setAttributes = function() { var hours, minutes, seconds, timeNow; timeNow = new Date(); hours = timeNow.getHours(); if (hours > 12) { hours -= 12; } $('.js-clock[data-dur="hh"]').attr('data-cur', hours + 1); minutes = timeNow.getMinutes(); if (minutes < 10) { $('.js-clock[data-dur="mm"]').attr('data-cur', 1); $('.js-clock[data-dur="m"]').attr('data-cur', minutes + 1); } else { $('.js-clock[data-dur="mm"]').attr('data-cur', nthDigit(minutes, 0) + 1); $('.js-clock[data-dur="m"]').attr('data-cur', nthDigit(minutes, 1) + 1); } seconds = timeNow.getSeconds(); minutes = timeNow.getMinutes(); if (seconds < 10) { $('.js-clock[data-dur="ss"]').attr('data-cur', 1.); return $('.js-clock[data-dur="s"]').attr('data-cur', seconds + 1); } else { $('.js-clock[data-dur="ss"]').attr('data-cur', nthDigit(seconds, 0) + 1); return $('.js-clock[data-dur="s"]').attr('data-cur', nthDigit(seconds, 1) + 1); } }; tick = function($el) { var $active; $active = $el.find('.dial--active'); $active.removeClass('dial--active'); $active.addClass('dial--flipped'); $active.next().removeClass('dial--next').addClass('dial--active'); $active.next().next().addClass('dial--next').removeClass('dial--later'); if ($active.next().hasClass('dial--last')) { return setTimeout((function() { return reset($el); }), 300, $el); } }; enableTransitions = function($el) { return $el.removeClass('transitions-off'); }; reset = function($el) { $el.addClass('transitions-off'); $el.children().removeClass('dial--flipped'); $el.children().removeClass('dial--active'); $el.children().removeClass('dial--next'); $el.children().first().addClass('dial--active'); $el.children(':nth-child(2)').addClass('dial--next'); $el.children(':nth-child(n+3)').addClass('dial--later'); setTimeout((function() { return enableTransitions($el); }), 300, $el); tick($el); if ($el.attr('data-dur') === 's') { $(document).trigger('10s'); } if ($el.attr('data-dur') === 'ss') { $(document).trigger('60s'); } if ($el.attr('data-dur') === 'm') { $(document).trigger('10m'); } if ($el.attr('data-dur') === 'mm') { return $(document).trigger('60m'); } }; setClasses = function($el) { var curIndex; curIndex = parseInt($el.attr('data-cur')); $el.children(':nth-child(' + curIndex + ')').addClass('dial--active'); $el.children(':nth-child(' + (curIndex + 1) + ')').addClass('dial--next'); $el.children(':lt(' + curIndex + ')').addClass('dial--flipped'); $el.children(':gt(' + curIndex + ')').addClass('dial--later'); return tick($el); }; startClock = function() { return setInterval(function() { return tick($('.js-clock[data-dur="s"]')); }, 1000); }; appendEls = function() { return $('.js-clock').each(function() { var $el, end, k, l, start; $el = $(this); start = parseInt($(this).attr('data-start')); end = parseInt($(this).attr('data-end')); k = start; while (k <= end) { if ((k + 1) > end) { l = 0; } else { l = k + 1; } $el.append('<div class="dial"><span>' + k + '</span><span>' + l + '</span>'); k++; } $el.prepend('<div class="dial"><span>0</span><span>0</span></div>'); $el.append('<div class="dial dial--last"><span>0</span><span>0</span></div>'); return setClasses($el); }); }; attachEvents = function() { $('.js-clock').on('click', function(e) { var $active, $el; e.preventDefault(); $el = $(this); $active = $el.find('.dial--active'); return tick($el); }); $(document).on('10s', function() { return tick($('.js-clock[data-dur="ss"]')); }); $(document).on('60s', function() { return tick($('.js-clock[data-dur="m"]')); }); return $(document).on('10m', function() { tick($('.js-clock[data-dur="mm"]')); $(document).on('60m', function() {}); return tick($('.js-clock[data-dur="hh"]')); }); }; $(document).ready(function() { setAttributes(); appendEls(); attachEvents(); return startClock(); }); }).call(this);
This awesome jQuery plugin is developed by paulnoble. For more Advanced Usages, please check the demo page or visit the official website.