-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
86 lines (74 loc) · 2.96 KB
/
script.js
File metadata and controls
86 lines (74 loc) · 2.96 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
// utility functions
if(!Util) function Util () {};
Util.hasClass = function(el, className) {
return el.classList.contains(className);
};
Util.addClass = function(el, className) {
var classList = className.split(' ');
el.classList.add(classList[0]);
if (classList.length > 1) Util.addClass(el, classList.slice(1).join(' '));
};
Util.removeClass = function(el, className) {
var classList = className.split(' ');
el.classList.remove(classList[0]);
if (classList.length > 1) Util.removeClass(el, classList.slice(1).join(' '));
};
Util.toggleClass = function(el, className, bool) {
if(bool) Util.addClass(el, className);
else Util.removeClass(el, className);
};
// File#: _1_main-header
// Usage: codyhouse.co/license
(function() {
var mainHeader = document.getElementsByClassName('js-header');
if( mainHeader.length > 0 ) {
var trigger = mainHeader[0].getElementsByClassName('js-header__trigger')[0],
nav = mainHeader[0].getElementsByClassName('js-header__nav')[0];
// we'll use these to store the node that needs to receive focus when the mobile menu is closed
var focusMenu = false;
//detect click on nav trigger
trigger.addEventListener("click", function(event) {
event.preventDefault();
toggleNavigation(!Util.hasClass(nav, 'header__nav--is-visible'));
});
// listen for key events
window.addEventListener('keyup', function(event){
// listen for esc key
if( (event.keyCode && event.keyCode == 27) || (event.key && event.key.toLowerCase() == 'escape' )) {
// close navigation on mobile if open
if(trigger.getAttribute('aria-expanded') == 'true' && isVisible(trigger)) {
focusMenu = trigger; // move focus to menu trigger when menu is close
trigger.click();
}
}
// listen for tab key
if( (event.keyCode && event.keyCode == 9) || (event.key && event.key.toLowerCase() == 'tab' )) {
// close navigation on mobile if open when nav loses focus
if(trigger.getAttribute('aria-expanded') == 'true' && isVisible(trigger) && !document.activeElement.closest('.js-header')) trigger.click();
}
});
// listen for resize
var resizingId = false;
window.addEventListener('resize', function() {
clearTimeout(resizingId);
resizingId = setTimeout(doneResizing, 500);
});
function doneResizing() {
if( !isVisible(trigger) && Util.hasClass(mainHeader[0], 'header--expanded')) toggleNavigation(false);
};
}
function isVisible(element) {
return (element.offsetWidth || element.offsetHeight || element.getClientRects().length);
};
function toggleNavigation(bool) { // toggle navigation visibility on small device
Util.toggleClass(nav, 'header__nav--is-visible', bool);
Util.toggleClass(mainHeader[0], 'header--expanded', bool);
trigger.setAttribute('aria-expanded', bool);
if(bool) { //opening menu -> move focus to first element inside nav
nav.querySelectorAll('[href], input:not([disabled]), button:not([disabled])')[0].focus();
} else if(focusMenu) {
focusMenu.focus();
focusMenu = false;
}
};
}());