137 lines
3.9 KiB
JavaScript
137 lines
3.9 KiB
JavaScript
/*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
|
|
(function(UI) {
|
|
|
|
"use strict";
|
|
|
|
UI.component('nav', {
|
|
|
|
defaults: {
|
|
"toggle": ">li.uk-parent > a[href='#']",
|
|
"lists": ">li.uk-parent > ul",
|
|
"multiple": false
|
|
},
|
|
|
|
boot: function() {
|
|
|
|
// init code
|
|
UI.ready(function(context) {
|
|
|
|
UI.$("[data-uk-nav]", context).each(function() {
|
|
var nav = UI.$(this);
|
|
|
|
if (!nav.data("nav")) {
|
|
var obj = UI.nav(nav, UI.Utils.options(nav.attr("data-uk-nav")));
|
|
}
|
|
});
|
|
});
|
|
},
|
|
|
|
init: function() {
|
|
|
|
var $this = this;
|
|
|
|
this.on("click.uk.nav", this.options.toggle, function(e) {
|
|
e.preventDefault();
|
|
var ele = UI.$(this);
|
|
$this.open(ele.parent()[0] == $this.element[0] ? ele : ele.parent("li"));
|
|
});
|
|
|
|
this.find(this.options.lists).each(function() {
|
|
var $ele = UI.$(this),
|
|
parent = $ele.parent(),
|
|
active = parent.hasClass("uk-active");
|
|
|
|
$ele.wrap('<div style="overflow:hidden;height:0;position:relative;"></div>');
|
|
parent.data("list-container", $ele.parent()[active ? 'removeClass':'addClass']('uk-hidden'));
|
|
|
|
// Init ARIA
|
|
parent.attr('aria-expanded', parent.hasClass("uk-open"));
|
|
|
|
if (active) $this.open(parent, true);
|
|
});
|
|
|
|
},
|
|
|
|
open: function(li, noanimation) {
|
|
|
|
var $this = this, element = this.element, $li = UI.$(li), $container = $li.data('list-container');
|
|
|
|
if (!this.options.multiple) {
|
|
|
|
element.children('.uk-open').not(li).each(function() {
|
|
|
|
var ele = UI.$(this);
|
|
|
|
if (ele.data('list-container')) {
|
|
ele.data('list-container').stop().animate({height: 0}, function() {
|
|
UI.$(this).parent().removeClass('uk-open').end().addClass('uk-hidden');
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
$li.toggleClass('uk-open');
|
|
|
|
// Update ARIA
|
|
$li.attr('aria-expanded', $li.hasClass('uk-open'));
|
|
|
|
if ($container) {
|
|
|
|
if ($li.hasClass('uk-open')) {
|
|
$container.removeClass('uk-hidden');
|
|
}
|
|
|
|
if (noanimation) {
|
|
|
|
$container.stop().height($li.hasClass('uk-open') ? 'auto' : 0);
|
|
|
|
if (!$li.hasClass('uk-open')) {
|
|
$container.addClass('uk-hidden');
|
|
}
|
|
|
|
this.trigger('display.uk.check');
|
|
|
|
} else {
|
|
|
|
$container.stop().animate({
|
|
height: ($li.hasClass('uk-open') ? getHeight($container.find('ul:first')) : 0)
|
|
}, function() {
|
|
|
|
if (!$li.hasClass('uk-open')) {
|
|
$container.addClass('uk-hidden');
|
|
} else {
|
|
$container.css('height', '');
|
|
}
|
|
|
|
$this.trigger('display.uk.check');
|
|
});
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
|
|
// helper
|
|
|
|
function getHeight(ele) {
|
|
var $ele = UI.$(ele), height = "auto";
|
|
|
|
if ($ele.is(":visible")) {
|
|
height = $ele.outerHeight();
|
|
} else {
|
|
var tmp = {
|
|
position: $ele.css("position"),
|
|
visibility: $ele.css("visibility"),
|
|
display: $ele.css("display")
|
|
};
|
|
|
|
height = $ele.css({position: 'absolute', visibility: 'hidden', display: 'block'}).outerHeight();
|
|
|
|
$ele.css(tmp); // reset element
|
|
}
|
|
|
|
return height;
|
|
}
|
|
|
|
})(UIkit);
|