123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- /* ========================================================================
- * Zavoloklom Material Design: jquery.zmd.hierarchical-display.js
- * http://zavoloklom.github.io/material-design-hierarchical-display/
- * ========================================================================
- * Copyright 2014 Zavoloklom.
- * Licensed under MIT (https://github.com/zavoloklom/material-design-hierarchical-display/blob/master/LICENSE)
- * ======================================================================== */
- (function ($) {
- 'use strict';
- // CLASS DEFINITION
- // ======================
- var HDisplay = function (element, options) {
- this.$element = $(element);
- this.$children = this.$element.children();
- this.options = $.extend({}, HDisplay.DEFAULTS, options);
- this._time = HDisplay.TRANSITION_DURATION * this.options.speed;
- this.init();
- if (this.options.debug === true) this._debug();
- };
- HDisplay.VERSION = '1.0.1';
- HDisplay.TRANSITION_DURATION = 300;
- HDisplay.DEFAULTS = {
- action: 'show',
- speed: 5,
- animationIn: 'zoomedIn',
- animationOut: 'zoomedOut',
- debug: false
- };
- HDisplay.prototype.init = function () {
- var self = this;
- var parentElement = this.$element;
- var children = this.$children;
- var options = this.options;
- var time = this._time;
- var elementOffset, calculatedOffset, elemDelay;
- parentElement.addClass('zmd-hierarchical-display');
- children.each(function () {
- elementOffset = $(this).position();
- calculatedOffset = elementOffset.left * 0.8 + elementOffset.top;
- elemDelay = parseFloat(calculatedOffset / time).toFixed(2);
- $(this)
- .css("-webkit-animation-delay", elemDelay + 's')
- .css("animation-delay", elemDelay + 's');
- });
- this._delay = elemDelay;
- // Call complete function after animation on last children element ends
- children.last().on('webkitAnimationEnd animationend', function(){
- if ($(this).hasClass(options.animationOut)) {self._complete('hidden');}
- if ($(this).hasClass(options.animationIn)) {self._complete('shown');}
- });
- };
- HDisplay.prototype.show = function () {
- var parentElement = this.$element;
- var children = this.$children;
- var options = this.options;
- if (parentElement.hasClass('in') || parentElement.hasClass('zmd-hierarchical-displaying')) return;
- this._removeAnimations();
- parentElement.trigger($.Event('show.zmd.hierarchicalDisplay'));
- this._addAnimation(options.animationIn);
- };
- HDisplay.prototype.hide = function () {
- var parentElement = this.$element;
- var children = this.$children;
- var options = this.options;
- if (parentElement.css('visibility') === 'hidden' || parentElement.hasClass('zmd-hierarchical-displaying')) return;
- this._removeAnimations();
- parentElement.trigger($.Event('hide.zmd.hierarchicalDisplay'));
- this._addAnimation(options.animationOut);
- };
- HDisplay.prototype.toggle = function () {
- if (this.$element.hasClass('in')) {return this.hide();}
- return this.show();
- };
- HDisplay.prototype._removeAnimations = function () {
- var options = this.options;
- this.$children.each(function () {
- $(this)
- .removeClass(options.animationIn)
- .removeClass(options.animationOut);
- });
- };
- HDisplay.prototype._addAnimation = function (animation) {
- this.$element.addClass('zmd-hierarchical-displaying');
- this.$children.each(function () {
- $(this)
- .addClass(animation)
- .addClass('animation');
- });
- };
- HDisplay.prototype._complete = function (eventName) {
- this.$element
- .removeClass('zmd-hierarchical-displaying')
- .toggleClass('in')
- .trigger($.Event(eventName+'.zmd.hierarchicalDisplay'));
- };
- HDisplay.prototype._debug = function () {
- $(document)
- .on('show.zmd.hierarchicalDisplay', function (e) {
- console.log('Event "show.zmd.hierarchicalDisplay". For more information see:');
- console.log(e);
- })
- .on('shown.zmd.hierarchicalDisplay', function (e) {
- console.log('Event "shown.zmd.hierarchicalDisplay". For more information see:');
- console.log(e);
- })
- .on('hide.zmd.hierarchicalDisplay', function (e) {
- console.log('Event "hide.zmd.hierarchicalDisplay". For more information see:');
- console.log(e);
- })
- .on('hidden.zmd.hierarchicalDisplay', function (e) {
- console.log('Event "hidden.zmd.hierarchicalDisplay". For more information see:');
- console.log(e);
- });
- };
- // PLUGIN DEFINITION
- // =======================
- function Plugin(settings) {
- return this.each(function () {
- var $this = $(this);
- var data = $this.data('zmd.hierarchicalDisplay');
- var options = $.extend({}, HDisplay.DEFAULTS, $this.data(), typeof settings === 'object' && settings);
- if (!data) {$this.data('zmd.hierarchicalDisplay', (data = new HDisplay(this, options)));}
- if (typeof settings === 'string') {return data[settings]();}
- if (options.action in data) {return data[options.action]();}
- });
- }
- $.fn.hierarchicalDisplay = Plugin;
- $.fn.hierarchicalDisplay.Constructor = HDisplay;
- // DATA-API
- // ==============
- $(document).on('ready', function () {
- $('[data-animation="hierarchical-display"]').each(function () {
- Plugin.call($(this));
- });
- });
- $(document).on('click', '[data-toggle="hierarchical-display"]', function (e) {
- var $this = $(this);
- var $target = $($this.attr('data-target') || $this.attr('href'));
- if ($this.is('a')) e.preventDefault();
- Plugin.call($target, 'toggle');
- });
- })(jQuery);
|