drawer.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. var drawer = function() {
  2. if (!Element.prototype.closest) {
  3. if (!Element.prototype.matches) {
  4. Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
  5. }
  6. Element.prototype.closest = function(s) {
  7. var el = this;
  8. var ancestor = this;
  9. if (!document.documentElement.contains(el))
  10. return null;
  11. do {
  12. if (ancestor.matches(s))
  13. return ancestor;
  14. ancestor = ancestor.parentElement;
  15. } while (ancestor !== null);
  16. return null;
  17. }
  18. ;
  19. }
  20. var settings = {
  21. speedOpen: 50,
  22. speedClose: 350,
  23. activeClass: 'is-active',
  24. visibleClass: 'is-visible',
  25. selectorTarget: '[data-drawer-target]',
  26. selectorTrigger: '[data-drawer-trigger]',
  27. selectorClose: '[data-drawer-close]',
  28. };
  29. var toggleccessibility = function(event) {
  30. if (event.getAttribute('aria-expanded') === 'true') {
  31. event.setAttribute('aria-expanded', false);
  32. } else {
  33. event.setAttribute('aria-expanded', true);
  34. }
  35. };
  36. var openDrawer = function(trigger) {
  37. var target = document.getElementById(trigger.getAttribute('aria-controls'));
  38. target.classList.add(settings.activeClass);
  39. document.documentElement.style.overflow = 'hidden';
  40. toggleccessibility(trigger);
  41. setTimeout(function() {
  42. target.classList.add(settings.visibleClass);
  43. }, settings.speedOpen);
  44. };
  45. var closeDrawer = function(event) {
  46. var closestParent = event.closest(settings.selectorTarget)
  47. , childrenTrigger = document.querySelector('[aria-controls="' + closestParent.id + '"');
  48. closestParent.classList.remove(settings.visibleClass);
  49. document.documentElement.style.overflow = '';
  50. toggleccessibility(childrenTrigger);
  51. setTimeout(function() {
  52. closestParent.classList.remove(settings.activeClass);
  53. }, settings.speedClose);
  54. };
  55. var clickHandler = function(event) {
  56. var toggle = event.target
  57. , open = toggle.closest(settings.selectorTrigger)
  58. , close = toggle.closest(settings.selectorClose);
  59. if (open) {
  60. openDrawer(open);
  61. }
  62. if (close) {
  63. closeDrawer(close);
  64. }
  65. if (open || close) {
  66. event.preventDefault();
  67. }
  68. };
  69. // var keydownHandler = function(event) {
  70. // if (event.key === 'Escape' || event.keyCode === 27) {
  71. // var drawers = document.querySelectorAll(settings.selectorTarget), i;
  72. // for (i = 0; i < drawers.length; ++i) {
  73. // if (drawers[i].classList.contains(settings.activeClass)) {
  74. // closeDrawer(drawers[i]);
  75. // }
  76. // }
  77. // }
  78. // };
  79. document.addEventListener('click', clickHandler, false);
  80. // document.addEventListener('keydown', keydownHandler, false);
  81. };
  82. drawer();