diff options
Diffstat (limited to 'public/js/main.js')
| -rw-r--r-- | public/js/main.js | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/public/js/main.js b/public/js/main.js index 7020971..c8e10b0 100644 --- a/public/js/main.js +++ b/public/js/main.js | |||
| @@ -59,6 +59,21 @@ function toggleTouchMenu(){ | |||
| 59 | } | 59 | } |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | function makeDropLeftMenuEntries(){ | ||
| 63 | // détection d'éléments de 1er niveau possédant un menu déroulant possédant un menu déroulant | ||
| 64 | document.getElementById('nav_zone').querySelector('.nav_main').querySelectorAll('.drop-down:has(.drop-right)').forEach(drop_down => { | ||
| 65 | const rect = drop_down.getBoundingClientRect(); // coordonnées spatiales | ||
| 66 | |||
| 67 | // il se situe dans la moitié droite | ||
| 68 | if((rect.width / 2 + rect.left) > (window.innerWidth / 2)){ // centre de l'élément > largeur de la fenêtre? | ||
| 69 | drop_down.querySelectorAll('.drop-right').forEach(drop_right => { | ||
| 70 | drop_right.classList.remove('drop-right'); | ||
| 71 | drop_right.classList.add('drop-left'); | ||
| 72 | }); | ||
| 73 | } | ||
| 74 | }); | ||
| 75 | } | ||
| 76 | |||
| 62 | // exécuté à la fin du chargement de la page | 77 | // exécuté à la fin du chargement de la page |
| 63 | document.addEventListener('DOMContentLoaded', () => { | 78 | document.addEventListener('DOMContentLoaded', () => { |
| 64 | 79 | ||
| @@ -70,17 +85,18 @@ document.addEventListener('DOMContentLoaded', () => { | |||
| 70 | 85 | ||
| 71 | // fermer les autres sous-menus de même niveau | 86 | // fermer les autres sous-menus de même niveau |
| 72 | // :scope pour pouvoir utiliser > pour restreindre aux frères directs | 87 | // :scope pour pouvoir utiliser > pour restreindre aux frères directs |
| 73 | li.parentElement.querySelectorAll(':scope > .drop-down, :scope > .drop-right').forEach(sibling => { | 88 | li.parentElement.querySelectorAll(':scope > .drop-down, :scope > .drop-right, :scope > .drop-left').forEach(sibling => { |
| 74 | if(sibling !== li){ | 89 | if(sibling !== li){ |
| 75 | sibling.classList.remove('open'); // fermer sous-menus frères | 90 | sibling.classList.remove('open'); // fermer sous-menus frères |
| 76 | sibling.querySelectorAll('.drop-right').forEach(desc => { | 91 | sibling.querySelectorAll('.drop-right, .drop-left').forEach(desc => { |
| 77 | desc.classList.remove('open'); // fermer sous-menus neveux | 92 | desc.classList.remove('open'); // fermer sous-menus neveux |
| 78 | }); | 93 | }); |
| 79 | } | 94 | } |
| 80 | }); | 95 | }); |
| 81 | 96 | ||
| 82 | if(!li.classList.toggle('open')){ // ouvrir ou fermer ce sous-menu | 97 | // ouvrir ou fermer un sous-menu |
| 83 | li.querySelectorAll('.drop-right').forEach(desc => { | 98 | if(!li.classList.toggle('open')){ |
| 99 | li.querySelectorAll('.drop-right, .drop-left').forEach(desc => { | ||
| 84 | desc.classList.remove('open'); // fermer sous-menus enfants | 100 | desc.classList.remove('open'); // fermer sous-menus enfants |
| 85 | }); | 101 | }); |
| 86 | } | 102 | } |
| @@ -88,6 +104,7 @@ document.addEventListener('DOMContentLoaded', () => { | |||
| 88 | }); | 104 | }); |
| 89 | 105 | ||
| 90 | navHeight(); // hauteur de <nav> en fonction de celle du menu en position fixe | 106 | navHeight(); // hauteur de <nav> en fonction de celle du menu en position fixe |
| 107 | makeDropLeftMenuEntries(); // changer en drop-left les drop-right des éléments du menu dans la moitié droite de la fenêtre | ||
| 91 | insertLocalDates(); | 108 | insertLocalDates(); |
| 92 | }); | 109 | }); |
| 93 | 110 | ||
| @@ -95,7 +112,7 @@ function navHeight(){ | |||
| 95 | const nav = document.querySelector('nav'); // détection | 112 | const nav = document.querySelector('nav'); // détection |
| 96 | const nav_zone = document.getElementById('nav_zone'); | 113 | const nav_zone = document.getElementById('nav_zone'); |
| 97 | const resize_observer = new ResizeObserver(entries => { // param de type tableau | 114 | const resize_observer = new ResizeObserver(entries => { // param de type tableau |
| 98 | let nav_button_height = window.innerWidth <= 600 ? 26 : 0; // 26 = taille du bouton | 115 | let nav_button_height = window.innerWidth <= 768 ? 26 : 0; // 26 = taille du bouton |
| 99 | nav_button_height += nav.classList.contains('show') ? 15 : 0; | 116 | nav_button_height += nav.classList.contains('show') ? 15 : 0; |
| 100 | for(const entry of entries){ | 117 | for(const entry of entries){ |
| 101 | nav_zone.style.height = (entry.contentRect.height + nav_button_height) + 'px'; | 118 | nav_zone.style.height = (entry.contentRect.height + nav_button_height) + 'px'; |
