slidebars.min.js
12.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
// -----------------------------------
// Slidebars
// Version 0.10 Development
// http://plugins.adchsm.me/slidebars/
//
// Written by Adam Smith
// http://www.adchsm.me/
//
// Released under MIT License
// http://plugins.adchsm.me/slidebars/license.txt
//
// ---------------------
// Index of Slidebars.js
//
// 001 - Default Settings
// 002 - Feature Detection
// 003 - User Agents
// 004 - Setup
// 005 - Animation
// 006 - Operations
// 007 - API
// 008 - User Input
$(document).ready(function() {
$.slidebars = function(options) {
// ----------------------
// 001 - Default Settings
var settings = $.extend({
siteClose: true, // true or false - Enable closing of Slidebars by clicking on #sb-site.
siteLock: false, // true or false - Prevent scrolling of site when a Slidebar is open.
disableOver: false, // integer or false - Hide Slidebars over a specific width.
hideControlClasses: false // true or false - Hide controls at same width as disableOver.
}, options);
// -----------------------
// 002 - Feature Detection
var test = document.createElement('div').style, // Create element to test on.
supportTransition = false, // Variable for testing transitions.
supportTransform = false; // variable for testing transforms.
// Test for CSS Transitions
if (test.MozTransition === '' || test.WebkitTransition === '' || test.OTransition === '' || test.transition === '') supportTransition = true;
// Test for CSS Transforms
if (test.MozTransform === '' || test.WebkitTransform === '' || test.OTransform === '' || test.transform === '') supportTransform = true;
// -----------------
// 003 - User Agents
var ua = navigator.userAgent, // Get user agent string.
android = false, // Variable for storing android version.
iOS = false; // Variable for storing iOS version.
if (/Android/.test(ua)) { // Detect Android in user agent string.
android = ua.substr(ua.indexOf('Android')+8, 3); // Set version of Android.
} else if (/(iPhone|iPod|iPad)/.test(ua)) { // Detect iOS in user agent string.
iOS = ua.substr(ua.indexOf('OS ')+3, 3).replace('_', '.'); // Set version of iOS.
}
if (android && android < 3 || iOS && iOS < 5) $('html').addClass('sb-static'); // Add helper class for older versions of Android & iOS.
// -----------
// 004 - Setup
// Site Container
var $site = $('#sb-site, .sb-site'); // Cache the selector.
// Left Slidebar
if ($('.sb-left').length) { // Check if the left Slidebar exists.
var $left = $('.sb-left'), // Cache the selector.
leftActive = false; // Used to check whether the left Slidebar is open or closed.
}
// Right Slidebar
if ($('.sb-right').length) { // Check if the right Slidebar exists.
var $right = $('.sb-right'), // Cache the selector.
rightActive = false; // Used to check whether the right Slidebar is open or closed.
}
var init = false,
windowWidth = $(window).width(), // Get width of window.
$controls = $('.sb-toggle-left, .sb-toggle-right, .sb-open-left, .sb-open-right, .sb-close'), // Cache the control classes.
$slide = $('.sb-slide'); // Cache users elements to animate.
// Initailise Slidebars
function initialise() {
if (!settings.disableOver || (typeof settings.disableOver === 'number' && settings.disableOver >= windowWidth)) { // False or larger than window size.
init = true; // true enabled Slidebars to open.
$('html').addClass('sb-init'); // Add helper class.
if (settings.hideControlClasses) $controls.removeClass('sb-hide'); // Remove class just incase Slidebars was originally disabled.
css(); // Set required inline styles.
} else if (typeof settings.disableOver === 'number' && settings.disableOver < windowWidth) { // Less than window size.
init = false; // false stop Slidebars from opening.
$('html').removeClass('sb-init'); // Remove helper class.
if (settings.hideControlClasses) $controls.addClass('sb-hide'); // Hide controls
if (leftActive || rightActive) close(); // Close Slidebars if open.
}
}
initialise();
// Inline CSS
function css() {
// Set minimum height.
$site.css('minHeight', ''); // Reset minimum height.
$site.css('minHeight', $('body').height() + 'px'); // Set minimum height of the site to the minimum height of the body.
// Set off-canvas margins for Slidebars with push and overlay animations.
if ($left && ($left.hasClass('sb-style-push') || $left.hasClass('sb-style-overlay'))) $left.css('marginLeft', '-' + $left.css('width'));
if ($right && ($right.hasClass('sb-style-push') || $right.hasClass('sb-style-overlay'))) $right.css('marginRight', '-' + $right.css('width'));
// Custom Slidebar Widths
if ($left && $left.hasClass('sb-width-custom')) $left.css('width', $left.attr('data-sb-width')); // Set user custom width.
if ($right && $right.hasClass('sb-width-custom')) $right.css('width', $right.attr('data-sb-width')); // Set user custom width.
// Site lock.
if (settings.siteLock) $('html').addClass('sb-lock');
}
// Resize Functions
$(window).resize(function() {
var resizedWindowWidth = $(window).width(); // Get resized window width.
if (init && windowWidth !== resizedWindowWidth) { // Slidebars is running and window was actually resized.
windowWidth = resizedWindowWidth; // Set the new window width.
initialise(); // Call initalise to see if Slidebars should still be running.
css(); // Reset minimum heights and negative margins.
if (leftActive) open('left'); // If left Slidebar is open, calling open will ensure it is the correct size.
if (rightActive) open('right'); // If right Slidebar is open, calling open will ensure it is the correct size.
}
});
// I may include a height check along side a width check here in future.
// ---------------
// 005 - Animation
var animation; // Animation type.
// Set Animation Type
if (supportTransition && supportTransform) { // Browser supports css transitions and transforms.
animation = 'translate'; // Translate for browsers that support it.
if (android && android < 4.4) animation = 'side'; // Android supports both, but can't translate any fixed positions, so use left instead.
} else {
animation = 'jQuery'; // Browsers that don't support css transitions and transitions.
}
// Animate Mixin
function animate(object, amount, side) {
// Choose selectors depending on animation style.
var selector;
if (object.hasClass('sb-style-push')) {
selector = $site.add(object).add($slide); // Push - Animate site, Slidebar and user elements.
} else if (object.hasClass('sb-style-overlay')) {
selector = object; // Overlay - Animate Slidebar only.
} else {
selector = $site.add($slide); // Reveal - Animate site and user elements.
}
// Apply Animation
if (animation === 'translate') {
selector.css('transform', 'translate(' + amount + ')');
} else if (animation === 'side') {
if (amount[0] === '-') amount = amount.substr(1); // Remove the '-' from the passed amount for side animations.
selector.css(side, amount);
setTimeout(function() {
if (amount === '0px') {
selector.removeAttr('style');
css();
}
}, 400);
} else if (animation === 'jQuery') {
if (amount[0] === '-') amount = amount.substr(1); // Remove the '-' from the passed amount for jQuery animations.
var properties = {};
properties[side] = amount;
selector.stop().animate(properties, 400); // Stop any current jQuery animation before starting another.
setTimeout(function() {
if (amount === '0px') {
selector.removeAttr('style');
css();
}
}, 400); // If closed, remove the inline styling on completion of the animation.
}
}
// ----------------
// 006 - Operations
// Open a Slidebar
function open(side) {
// Check to see if opposite Slidebar is open.
if (side === 'left' && $left && rightActive || side === 'right' && $right && leftActive) { // It's open, close it, then continue.
close();
setTimeout(proceed, 400);
} else { // Its not open, continue.
proceed();
}
// Open
function proceed() {
if (init && side === 'left' && $left) { // Slidebars is initiated, left is in use and called to open.
$('html').addClass('sb-active sb-active-left'); // Add active classes.
$left.addClass('sb-active');
animate($left, $left.css('width'), 'left'); // Animation
setTimeout(function() { leftActive = true; }, 400); // Set active variables.
} else if (init && side === 'right' && $right) { // Slidebars is initiated, right is in use and called to open.
$('html').addClass('sb-active sb-active-right'); // Add active classes.
$right.addClass('sb-active');
animate($right, '-' + $right.css('width'), 'right'); // Animation
setTimeout(function() { rightActive = true; }, 400); // Set active variables.
}
}
}
// Close either Slidebar
function close(link) {
if (leftActive || rightActive) { // If a Slidebar is open.
if (leftActive) {
animate($left, '0px', 'left'); // Animation
leftActive = false;
}
if (rightActive) {
animate($right, '0px', 'right'); // Animation
rightActive = false;
}
setTimeout(function() { // Wait for closing animation to finish.
$('html').removeClass('sb-active sb-active-left sb-active-right'); // Remove active classes.
if ($left) $left.removeClass('sb-active');
if ($right) $right.removeClass('sb-active');
if (link) window.location = link; // If a link has been passed to the function, go to it.
}, 400);
}
}
// Toggle either Slidebar
function toggle(side) {
if (side === 'left' && $left) { // If left Slidebar is called and in use.
if (!leftActive) {
open('left'); // Slidebar is closed, open it.
} else {
close(); // Slidebar is open, close it.
}
}
if (side === 'right' && $right) { // If right Slidebar is called and in use.
if (!rightActive) {
open('right'); // Slidebar is closed, open it.
} else {
close(); // Slidebar is open, close it.
}
}
}
// ---------
// 007 - API
this.open = open; // Maps user variable name to the open method.
this.close = close; // Maps user variable name to the close method.
this.toggle = toggle; // Maps user variable name to the toggle method.
this.init = function() { // Returns true or false whether Slidebars are running or not.
return init;
};
this.active = function(side) { // Returns true or false whether Slidebar is open or closed.
if (side === 'left' && $left) return leftActive;
if (side === 'right' && $right) return rightActive;
};
// ----------------
// 008 - User Input
function eventHandler(event, selector) {
event.stopPropagation(); // Stop event bubbling.
event.preventDefault(); // Prevent default behaviour
if (event.type === 'touchend') selector.off('click'); // If event type was touch turn off clicks to prevent phantom clicks.
}
// Toggle Left Slidebar
$('.sb-toggle-left').on('touchend click', function(event) {
eventHandler(event, $(this)); // Handle the event.
toggle('left'); // Toggle the left Slidbar.
});
// Toggle Right Slidebar
$('.sb-toggle-right').on('touchend click', function(event) {
eventHandler(event, $(this)); // Handle the event.
toggle('right'); // Toggle the right Slidbar.
});
// Open Left Slidebar
$('.sb-open-left').on('touchend click', function(event) {
eventHandler(event, $(this)); // Handle the event.
open('left'); // Open the left Slidebar.
});
// Open Right Slidebar
$('.sb-open-right').on('touchend click', function(event) {
eventHandler(event, $(this)); // Handle the event.
open('right'); // Open the right Slidebar.
});
// Close a Slidebar
$('.sb-close').on('touchend click', function(event) {
eventHandler(event, $(this)); // Handle the event.
close(); // Close either Slidebar.
});
// Close Slidebar via Link
// $('.sb-slidebar a').not('.sb-disable-close').on('click', function(event) {
// eventHandler(event, $(this)); // Handle the event.
// close( $(this).attr('href') ); // Close the Slidebar and pass link.
// });
// Close Slidebar via Site
// $site.on('touchend click', function(event) {
// if (settings.siteClose && (leftActive || rightActive)) { // If settings permit closing by site and left or right Slidebar is open.
// eventHandler(event, $(this)); // Handle the event.
// close(); // Close it.
// }
// });
}; // End slidebars function.
});