lixin-web
Version:
vue and bootstrap
323 lines (299 loc) • 12.8 kB
JavaScript
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
var Offcanvas
(function($) {
// OffcanvasDropdown,
// OffcanvasTouch,
var transformCheck;
// OffcanvasDropdown = (function() {
// function OffcanvasDropdown(element) {
// this.element = element;
// this._clickEvent = __bind(this._clickEvent, this);
// this.element = $(this.element);
// this.dropdown = this.element.parent().find(".dropdown-menu");
// this.element.on('click', this._clickEvent);
// }
// OffcanvasDropdown.prototype._clickEvent = function(e) {
// if (!this.dropdown.hasClass('shown')) {
// e.preventDefault();
// }
// this.dropdown.toggleClass("shown");
// return this.element.parent().toggleClass('active');
// };
// return OffcanvasDropdown;
// })();
// OffcanvasTouch = (function() {
// function OffcanvasTouch(button, element, location, offcanvas) {
// this.button = button;
// this.element = element;
// this.location = location;
// this.offcanvas = offcanvas;
// this._getFade = __bind(this._getFade, this);
// this._getCss = __bind(this._getCss, this);
// this._touchEnd = __bind(this._touchEnd, this);
// this._touchMove = __bind(this._touchMove, this);
// this._touchStart = __bind(this._touchStart, this);
// this.endThreshold = 130;
// this.startThreshold = this.element.hasClass('navbar-offcanvas-right') ? $("body").outerWidth() - 60 : 20;
// this.maxStartThreshold = this.element.hasClass('navbar-offcanvas-right') ? $("body").outerWidth() - 20 : 60;
// this.currentX = 0;
// this.fade = this.element.hasClass('navbar-offcanvas-fade') ? true : false;
// $(document).on("touchstart", this._touchStart);
// $(document).on("touchmove", this._touchMove);
// $(document).on("touchend", this._touchEnd);
// }
// OffcanvasTouch.prototype._touchStart = function(e) {
// this.startX = e.originalEvent.touches[0].pageX;
// return this.element.height($(window).outerHeight());
// };
// OffcanvasTouch.prototype._touchMove = function(e) {
// var x;
// if ($(e.target).parents('.navbar-offcanvas').length > 0) {
// return true;
// }
// if (this.startX > this.startThreshold && this.startX < this.maxStartThreshold) {
// e.preventDefault();
// x = e.originalEvent.touches[0].pageX - this.startX;
// x = this.element.hasClass('navbar-offcanvas-right') ? -x : x;
// if (Math.abs(x) < this.element.outerWidth()) {
// this.element.css(this._getCss(x));
// return this.element.css(this._getFade(x));
// }
// } else if (this.element.hasClass('in')) {
// e.preventDefault();
// x = e.originalEvent.touches[0].pageX + (this.currentX - this.startX);
// x = this.element.hasClass('navbar-offcanvas-right') ? -x : x;
// if (Math.abs(x) < this.element.outerWidth()) {
// this.element.css(this._getCss(x));
// return this.element.css(this._getFade(x));
// }
// }
// };
// OffcanvasTouch.prototype._touchEnd = function(e) {
// var end, x;
// if ($(e.target).parents('.navbar-offcanvas').length > 0) {
// return true;
// }
// x = e.originalEvent.changedTouches[0].pageX;
// end = this.element.hasClass('navbar-offcanvas-right') ? Math.abs(x) > (this.endThreshold + 50) : x < (this.endThreshold + 50);
// if (this.element.hasClass('in') && end) {
// this.currentX = 0;
// this.element.removeClass('in').css(this._clearCss());
// this.button.removeClass('is-open');
// } else if (Math.abs(x - this.startX) > this.endThreshold && this.startX > this.startThreshold && this.startX < this.maxStartThreshold) {
// this.currentX = this.element.hasClass('navbar-offcanvas-right') ? -this.element.outerWidth() : this.element.outerWidth();
// this.element.toggleClass('in').css(this._clearCss());
// this.button.toggleClass('is-open');
// } else {
// this.element.css(this._clearCss());
// }
// return this.offcanvas.bodyOverflow();
// };
// OffcanvasTouch.prototype._getCss = function(x) {
// x = this.element.hasClass('navbar-offcanvas-right') ? -x : x;
// return {
// "-webkit-transform": "translate3d(" + x + "px, 0px, 0px)",
// "-webkit-transition-duration": "0s",
// "-moz-transform": "translate3d(" + x + "px, 0px, 0px)",
// "-moz-transition": "0s",
// "-o-transform": "translate3d(" + x + "px, 0px, 0px)",
// "-o-transition": "0s",
// "transform": "translate3d(" + x + "px, 0px, 0px)",
// "transition": "0s"
// };
// };
// OffcanvasTouch.prototype._getFade = function(x) {
// if (this.fade) {
// return {
// "opacity": x / this.element.outerWidth()
// };
// } else {
// return {};
// }
// };
// OffcanvasTouch.prototype._clearCss = function() {
// return {
// "-webkit-transform": "",
// "-webkit-transition-duration": "",
// "-moz-transform": "",
// "-moz-transition": "",
// "-o-transform": "",
// "-o-transition": "",
// "transform": "",
// "transition": "",
// "opacity": ""
// };
// };
// return OffcanvasTouch;
// })();
Offcanvas = (function() {
function Offcanvas(element) {
var t, target;
this.element = element;
this.bodyOverflow = __bind(this.bodyOverflow, this);
this._sendEventsAfter = __bind(this._sendEventsAfter, this);
this._sendEventsBefore = __bind(this._sendEventsBefore, this);
this._documentClicked = __bind(this._documentClicked, this);
this._close = __bind(this._close, this);
this._open = __bind(this._open, this);
this._clicked = __bind(this._clicked, this);
this._navbarHeight = __bind(this._navbarHeight, this);
target = this.element.attr('data-target') ? this.element.attr('data-target') : false;
if (target) {
this.target = $(target);
if (this.target.length && !this.target.hasClass('js-offcanvas-done')) {
this.element.addClass('js-offcanvas-has-events');
this.location = this.target.hasClass("navbar-offcanvas-right") ? "right" : "left";
this.target.addClass(window.transform ? "offcanvas-transform js-offcanvas-done" : "offcanvas-position js-offcanvas-done");
this.target.data('offcanvas', this);
this.element.on("click", this._clicked);
this.target.on('transitionend', (function(_this) {
return function() {
if (_this.target.is(':not(.in)')) {
return _this.target.height('');
}
};
})(this));
$(document).on("click", this._documentClicked);
// if (this.target.hasClass('navbar-offcanvas-touch')) {
// t = new OffcanvasTouch(this.element, this.target, this.location, this);
// }
// this.target.find(".dropdown-toggle").each(function() {
// var d;
// return d = new OffcanvasDropdown(this);
// });
this.target.on('offcanvas.toggle', (function(_this) {
return function(e) {
return _this._clicked(e);
};
})(this));
this.target.on('offcanvas.close', (function(_this) {
return function(e) {
return _this._close(e);
};
})(this));
this.target.on('offcanvas.open', (function(_this) {
return function(e) {
return _this._open(e);
};
})(this));
}
} else {
console.warn('Offcanvas: `data-target` attribute must be present.');
}
}
Offcanvas.prototype._navbarHeight = function() {
if (this.target.is('.in')) {
return this.target.height($(window).outerHeight());
}
};
Offcanvas.prototype._clicked = function(e) {
e.preventDefault();
this._sendEventsBefore();
$(".navbar-offcanvas").not(this.target).removeClass('in');
this.target.toggleClass('in');
this.element.toggleClass('is-open');
this._navbarHeight();
return this.bodyOverflow();
};
Offcanvas.prototype._open = function(e) {
e.preventDefault();
if (this.target.is('.in')) {
return;
}
this._sendEventsBefore();
this.target.addClass('in');
this.element.addClass('is-open');
this._navbarHeight();
return this.bodyOverflow();
};
Offcanvas.prototype._close = function(e) {
e.preventDefault();
if (this.target.is(':not(.in)')) {
return;
}
this._sendEventsBefore();
this.target.removeClass('in');
this.element.removeClass('is-open');
this._navbarHeight();
return this.bodyOverflow();
};
Offcanvas.prototype._documentClicked = function(e) {
var clickedEl;
clickedEl = $(e.target);
if (!clickedEl.hasClass('offcanvas-toggle') && clickedEl.parents('.offcanvas-toggle').length === 0 && clickedEl.parents('.navbar-offcanvas').length === 0 && !clickedEl.hasClass('navbar-offcanvas')) {
if (this.target.hasClass('in')) {
e.preventDefault();
this._sendEventsBefore();
this.target.removeClass('in');
this.element.removeClass('is-open');
this._navbarHeight();
return this.bodyOverflow();
}
}
};
Offcanvas.prototype._sendEventsBefore = function() {
if (this.target.hasClass('in')) {
return this.target.trigger('show.bs.offcanvas');
} else {
return this.target.trigger('hide.bs.offcanvas');
}
};
Offcanvas.prototype._sendEventsAfter = function() {
if (this.target.hasClass('in')) {
return this.target.trigger('shown.bs.offcanvas');
} else {
return this.target.trigger('hidden.bs.offcanvas');
}
};
Offcanvas.prototype.bodyOverflow = function() {
if (this.target.is('.in')) {
$('body').addClass('offcanvas-stop-scrolling');
} else {
$('body').removeClass('offcanvas-stop-scrolling');
}
return this._sendEventsAfter();
};
return Offcanvas;
})();
transformCheck = (function(_this) {
return function() {
var asSupport, el, regex, translate3D;
el = document.createElement('div');
translate3D = "translate3d(0px, 0px, 0px)";
regex = /translate3d\(0px, 0px, 0px\)/g;
el.style.cssText = "-webkit-transform: " + translate3D + "; -moz-transform: " + translate3D + "; -o-transform: " + translate3D + "; transform: " + translate3D;
asSupport = el.style.cssText.match(regex);
return _this.transform = asSupport.length != null;
};
})(this);
return $(function() {
transformCheck();
$('[data-toggle="offcanvas"]').each(function() {
var oc;
return oc = new Offcanvas($(this));
});
$(window).on('resize', function() {
return $('.navbar-offcanvas.in').each(function() {
return $(this).height('').removeClass('in');
});
});
return $('.offcanvas-toggle').each(function() {
return $(this).on('click', function(e) {
var el, selector;
if (!$(this).hasClass('js-offcanvas-has-events')) {
selector = $(this).attr('data-target');
el = $(selector);
if (el) {
el.height('');
el.removeClass('in');
return $('body').css({
overflow: '',
position: ''
});
}
}
});
});
});
})(jQuery);
module.exports = Offcanvas