123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- (function (window, $) {
- // TODO
- // - check the actual
- // - add options
- // - some demos, patterns
- var Sidebar = function (target, opts) {
- this.$sidebar = $(target);
- this.$body = $(document.body);
- this.$content = this.$body.find('.jsc-sidebar-content');
- this.sidebarW = this.$sidebar.width();
- this.opts = opts;
- this.meta = this.$sidebar.data('sidebar-options');
- };
- Sidebar.prototype = {
- defaults: {
- trigger: null,
- scrollbarDisplay: false,
- pullCb: function () {},
- pushCb: function () {}
- },
- init: function () {
- this.config = $.extend({}, this.defaults, this.opts, this.meta);
- this.$trigger = this.config.trigger ? this.$body.find(this.config.trigger) : this.$body.find('.jsc-sidebar-trigger');
- this.detect3dEnabled();
- this.attachEvent();
- return this;
- },
- pushTransitionEndEvent: 'transitionEnd.push webkitTransitionEnd.push transitionend.push msTransitionEnd.push',
- pullTransitionEndEvent: 'transitionEnd.pull webkitTransitionEnd.pull transitionend.pull msTransitionEnd.pull',
-
- isAndroid: function () {
- var ua = (window.navigator.userAgent).toLowerCase(),
- isAndroid = ua.indexOf('android') > -1;
- return isAndroid;
- },
- hasTranslate3dSupport: function () {
- var p = document.createElement('p'),
- has3dSupport,
- transforms = {
- 'transform': 'transform',
- 'webkitTransform': '-webkit-transform',
- 'MozTransform': '-moz-transform',
- 'msTransform': '-ms-transform'
- };
- this.$body[0].insertBefore(p, null);
- for (var transform in transforms) {
- if (p.style[transform] !== undefined) {
- p.style[transform] = 'translate3d(1px, 1px, 1px)';
- has3dSupport = window.getComputedStyle(p).getPropertyValue(transforms[transform]);
- }
- }
- this.$body[0].removeChild(p);
- return (has3dSupport !== undefined && has3dSupport.length && has3dSupport !== 'none');
- },
- detect3dEnabled: function () {
- if (this.isAndroid() || !this.hasTranslate3dSupport()) {
- this.$content.removeClass('jsc-sidebar-pulled');
- }
- },
- attachEvent: function () {
- this.$trigger.on('click', $.proxy(function (e) {
- e.preventDefault();
- this.push();
- }, this));
- this.$content
- .on(this.pushTransitionEndEvent, $.proxy(function (e) {
- this.detectPushEnd();
- this.config.pushCb();
- }, this))
- .on('click', $.proxy(function (e) {
- this.pull();
- }, this));
- },
- push: function () {
- if (this.isAndroid() || !this.hasTranslate3dSupport()) {
- this.slidePush();
- } else {
- this.$content
- .removeClass('jsc-sidebar-pull-end')
- .addClass('jsc-sidebar-pushed');
- }
- },
- pull: function () {
- if (this.isAndroid() || !this.hasTranslate3dSupport()) {
- this.slidePull();
- } else {
- if (!this.$content.hasClass('jsc-sidebar-push-end')) {
- return;
- }
- this.$content.removeClass('jsc-sidebar-pushed');
- }
- },
- slidePull: function () {
- if (this.$content.data('sidebar-first-click') !== 1 || !(this.$content.hasClass('jsc-sidebar-opened'))) {
- return;
- }
- this.$content.stop().animate({
- marginLeft: 0
- }).promise().done($.proxy(function () {
- this.$content.removeClass('jsc-sidebar-opened');
- !this.config.scrollbarDisplay && this.$content.removeClass('jsc-sidebar-scroll-disabled');
- this.config.pullCb();
- }, this));
- },
- slidePush: function () {
- var distance = this.sidebarW + 'px';
- this.$content.stop().animate({
- marginLeft: distance
- }).promise().done($.proxy(function () {
- this.$content.addClass('jsc-sidebar-opened');
- !this.config.scrollbarDisplay && this.$content.addClass('jsc-sidebar-scroll-disabled');
- if (!this.$content.data('sidebar-first-click')) {
- this.$content.data('sidebar-first-click', 1);
- }
- this.config.pushCb();
- }, this));
- },
- detectPushEnd: function () {
- this.$content.addClass('jsc-sidebar-opened');
- !this.config.scrollbarDisplay && this.$content.addClass('jsc-sidebar-scroll-disabled');
- this.$content
- .addClass('jsc-sidebar-push-end')
- .off(this.pushTransitionEndEvent)
- .on(this.pullTransitionEndEvent, $.proxy(function () {
- this.detectPullEnd();
- this.config.pullCb();
- }, this));
- },
- detectPullEnd: function () {
- this.$content.removeClass('jsc-sidebar-disabled');
- !this.config.scrollbarDisplay && this.$content.removeClass('jsc-sidebar-scroll-disabled');
- this.$content
- .removeClass('jsc-sidebar-push-end')
- .addClass('jsc-sidebar-pull-end')
- .off(this.pullTransitionEndEvent)
- .on(this.pushTransitionEndEvent, $.proxy(function () {
- this.detectPushEnd();
- this.config.pushCb();
- }, this));
- }
- };
- Sidebar.defaults = Sidebar.prototype.defaults;
- $.fn.sidebar = function (options) {
- return this.each(function () {
- new Sidebar(this, options).init();
- });
- };
- window.Sidebar = Sidebar;
- })(window, jQuery);
|