95 lines
2.8 KiB
JavaScript
95 lines
2.8 KiB
JavaScript
/**
|
||
|
||
@Name:layui.dropdown 下拉按钮
|
||
@Author:First
|
||
@License:MIT
|
||
|
||
*/
|
||
layui.define('jquery', function (exports) {
|
||
var $ = layui.$,
|
||
device = layui.device(),
|
||
MOD_NAME = 'dropdown',
|
||
CLASS_NAME = '.layui-dropdown-menu',
|
||
//事件类型,默认为'mouseover'(移动端则为'click')
|
||
event = (device.android || device.ios) ? 'click' : 'mouseover',
|
||
//当前Dropdown对象
|
||
that;
|
||
|
||
Dropdown = function () {
|
||
//当前实例
|
||
this.inst = null;
|
||
this.currReElem = null;
|
||
};
|
||
|
||
//隐藏
|
||
var __hideDropdown = function (e) {
|
||
if (isClosable(e.target)
|
||
&& isClosable(e.target.parentElement)
|
||
&& isClosable(e.target.parentElement.parentElement)) {
|
||
that.hide();
|
||
}
|
||
};
|
||
|
||
//判断dropdown是否可以隐藏
|
||
var isClosable = function (elem) {
|
||
return elem
|
||
&& elem.className.indexOf('layui-btn-dropdown') == -1
|
||
&& elem.className.indexOf('layui-dropdown-menu') == -1;
|
||
};
|
||
|
||
//修正显示位置
|
||
Dropdown.prototype.hide = function () {
|
||
if (that && that.inst && that.inst.is(':visible')) {
|
||
that.inst.css('display', 'none');
|
||
$('body').off(event, __hideDropdown);
|
||
}
|
||
};
|
||
|
||
//渲染
|
||
Dropdown.prototype.render = function () {
|
||
that = this;
|
||
$('.layui-btn-dropdown').each(function (index, elem) {
|
||
var reElem = $(elem);
|
||
reElem.data('id', 'dropdown-' + index);
|
||
event = (device.android || device.ios) ? 'click' : 'mouseover';
|
||
|
||
reElem[event](function () {
|
||
if (!that.inst//第一次显示
|
||
|| that.currReElem.data('id') != reElem.data('id')//切换到其他dropdown
|
||
|| (that.currReElem.data('id') == reElem.data('id') && !that.inst.is(':visible'))) {//重新移动到当前dropdown
|
||
//隐藏
|
||
that.hide();
|
||
//这里暂时采用fixed定位
|
||
var dropElem = reElem.find(CLASS_NAME),
|
||
left = reElem.offset().left - $(window).scrollLeft(),
|
||
top = reElem.offset().top + reElem.height() - $(window).scrollTop() - 2,
|
||
containerWidth = reElem.width(),
|
||
dropWidth = dropElem.width(),
|
||
offsetRight = left + containerWidth,
|
||
overflow = (left + dropWidth) > $(window).width(),
|
||
css = {'display': 'block', 'position': 'fixed', 'top': top + 'px', 'left': left + 'px'};
|
||
|
||
overflow && $.extend(true, css, {'left': (offsetRight - dropWidth) + 'px'});
|
||
//显示
|
||
dropElem.css(css).on('click', 'li', function () {
|
||
dropElem.css('display', 'none');
|
||
});
|
||
|
||
that.inst = dropElem;
|
||
that.currReElem = reElem;
|
||
$('body').on(event, __hideDropdown);
|
||
}
|
||
});
|
||
});
|
||
};
|
||
|
||
//自动完成渲染
|
||
var dropdown = new Dropdown();
|
||
dropdown.render();
|
||
|
||
$(window).scroll(function () {
|
||
dropdown.hide();
|
||
});
|
||
|
||
exports(MOD_NAME, dropdown);
|
||
}) |