diff options
-rw-r--r-- | public/css/nav.css | 77 | ||||
-rw-r--r-- | public/js/main.js | 27 | ||||
-rw-r--r-- | src/view/NavBuilder.php | 5 |
3 files changed, 87 insertions, 22 deletions
diff --git a/public/css/nav.css b/public/css/nav.css index 7f47cff..3ccdb1f 100644 --- a/public/css/nav.css +++ b/public/css/nav.css | |||
@@ -16,6 +16,7 @@ | |||
16 | /*margin-top: 10px;*/ | 16 | /*margin-top: 10px;*/ |
17 | /*margin-bottom: 10px;*/ | 17 | /*margin-bottom: 10px;*/ |
18 | text-wrap: nowrap; | 18 | text-wrap: nowrap; |
19 | background-color: #ffffffe1; /* b3 = 179 = 0.7 (x 256) */ | ||
19 | } | 20 | } |
20 | .nav_main > ul | 21 | .nav_main > ul |
21 | { | 22 | { |
@@ -28,39 +29,81 @@ ul | |||
28 | { | 29 | { |
29 | margin: 0; | 30 | margin: 0; |
30 | } | 31 | } |
31 | .nav_main ul, .nav_main li | 32 | |
33 | .nav_main ul | ||
32 | { | 34 | { |
33 | list-style: none; | 35 | list-style: none; |
34 | padding-left: 0; | 36 | padding-left: 0; |
35 | } | 37 | } |
36 | .nav_main p | 38 | .nav_main li |
37 | { | 39 | { |
40 | list-style: none; | ||
38 | padding: 7px; | 41 | padding: 7px; |
42 | } | ||
43 | .nav_main p | ||
44 | { | ||
45 | display: inline-block; /* à cause du bouton sub-menu-toggle */ | ||
39 | margin: 0; | 46 | margin: 0; |
40 | background-color: #ffffffe1; /* b3 = 179 = 0.7 (x 256) */ | 47 | /*background-color: #ffffffe1;*/ /* b3 = 179 = 0.7 (x 256) */ |
41 | } | 48 | } |
42 | .nav_main p:hover | 49 | .nav_main > ul > li:hover |
43 | { | 50 | { |
44 | background-color: white; | 51 | background-color: white; |
45 | } | 52 | } |
46 | .current > a > p | 53 | .current/* > a > p*/ |
47 | { | 54 | { |
48 | background-color: white; | 55 | background-color: white; |
49 | font-weight: bold; | 56 | font-weight: bold; |
50 | } | 57 | } |
51 | .drop-down > a > p::after | 58 | li:not(.current){ |
52 | { | 59 | background-color: initial; |
53 | content: ' ▼'; | 60 | font-weight: initial; |
54 | font-size: x-small; | ||
55 | } | 61 | } |
56 | 62 | ||
57 | /* faire apparaître sub-menu */ | 63 | /* faire apparaître les sous-menu sur PC */ |
58 | .drop-down:hover > .sub-menu{ | 64 | .drop-down:hover > .sub-menu, |
65 | .drop-right:hover > .sub-menu | ||
66 | { | ||
59 | display: block; | 67 | display: block; |
60 | } | 68 | } |
61 | .drop-right:hover > .sub-menu{ | 69 | @media (pointer: fine) /* fine => précision de la souris */ |
62 | display: block; | 70 | { |
71 | .drop-down > a > p::after | ||
72 | { | ||
73 | content: ' ▼'; | ||
74 | font-size: x-small; | ||
75 | } | ||
76 | .drop-right > a > p:after | ||
77 | { | ||
78 | content: " ▶"; | ||
79 | font-size: x-small; | ||
80 | } | ||
81 | } | ||
82 | |||
83 | /* faire apparaître les sous-menu sur smartphone */ | ||
84 | .sub-menu-toggle | ||
85 | { | ||
86 | display: none; /* masqué par défaut */ | ||
87 | background: none; | ||
88 | /*border: none;*/ | ||
89 | cursor: pointer; | ||
90 | font-size: x-small; | ||
91 | vertical-align: text-bottom; | ||
92 | } | ||
93 | @media (pointer: coarse) /* coarse = grossier = précision écran tactile */ | ||
94 | { | ||
95 | .sub-menu-toggle | ||
96 | { | ||
97 | display: inline-block; /* visible sur écran tactile */ | ||
98 | } | ||
99 | .drop-down.open > .sub-menu, | ||
100 | .drop-right.open > .sub-menu | ||
101 | { | ||
102 | display: block; | ||
103 | } | ||
63 | } | 104 | } |
105 | |||
106 | |||
64 | .sub-menu | 107 | .sub-menu |
65 | { | 108 | { |
66 | display: none; | 109 | display: none; |
@@ -69,16 +112,10 @@ ul | |||
69 | box-shadow: 1px 1px 3px black; | 112 | box-shadow: 1px 1px 3px black; |
70 | font-size: 95%; | 113 | font-size: 95%; |
71 | } | 114 | } |
72 | /*.sub-menu p:hover*/ | 115 | .sub-menu li:hover /* écrase le fond blanc placé en même temps */ |
73 | .nav_main p:hover | ||
74 | { | 116 | { |
75 | background-color: yellow; | 117 | background-color: yellow; |
76 | } | 118 | } |
77 | .drop-right > a > p:after | ||
78 | { | ||
79 | content: " ▶"; | ||
80 | font-size: x-small; | ||
81 | } | ||
82 | 119 | ||
83 | /* 1er sous-menu, poitionnement pour ne pas aggrandir l'élément parent */ | 120 | /* 1er sous-menu, poitionnement pour ne pas aggrandir l'élément parent */ |
84 | nav > ul > li > ul | 121 | nav > ul > li > ul |
diff --git a/public/js/main.js b/public/js/main.js index 071a1db..6eb0162 100644 --- a/public/js/main.js +++ b/public/js/main.js | |||
@@ -8,6 +8,33 @@ function newPassword(page, id = ''){ | |||
8 | }, 0); | 8 | }, 0); |
9 | } | 9 | } |
10 | 10 | ||
11 | // ouvrir/fermer les sous-menus avec écran tactile | ||
12 | document.addEventListener('DOMContentLoaded', () => { // sinon on ne trouve pas les boutons | ||
13 | document.querySelectorAll('.sub-menu-toggle').forEach(button => { | ||
14 | button.addEventListener('click', e => { | ||
15 | e.preventDefault(); | ||
16 | const li = button.parentElement; // <li class="drop-down"> | ||
17 | |||
18 | // fermer les autres sous-menus de même niveau | ||
19 | // :scope pour pouvoir utiliser > pour restreindre aux frères directs | ||
20 | li.parentElement.querySelectorAll(':scope > .drop-down, :scope > .drop-right').forEach(sibling => { | ||
21 | if(sibling !== li){ | ||
22 | sibling.classList.remove('open'); // fermer sous-menus frères | ||
23 | sibling.querySelectorAll('.drop-right').forEach(desc => { | ||
24 | desc.classList.remove('open'); // fermer sous-menus neveux | ||
25 | }); | ||
26 | } | ||
27 | }); | ||
28 | |||
29 | if(!li.classList.toggle('open')){ // fermer sous-menu | ||
30 | li.querySelectorAll('.drop-right').forEach(desc => { | ||
31 | desc.classList.remove('open'); // fermer sous-menus enfants | ||
32 | }); | ||
33 | } | ||
34 | }); | ||
35 | }); | ||
36 | }); | ||
37 | |||
11 | function copyInClipBoard(link){ | 38 | function copyInClipBoard(link){ |
12 | // une balise <input> avec des attributs | 39 | // une balise <input> avec des attributs |
13 | var element = document.createElement("input"); | 40 | var element = document.createElement("input"); |
diff --git a/src/view/NavBuilder.php b/src/view/NavBuilder.php index fd5f867..a9cf49c 100644 --- a/src/view/NavBuilder.php +++ b/src/view/NavBuilder.php | |||
@@ -53,7 +53,9 @@ class NavBuilder extends AbstractBuilder | |||
53 | { | 53 | { |
54 | $li_class .= $data->getParent() == null ? 'drop-down' : 'drop-right'; | 54 | $li_class .= $data->getParent() == null ? 'drop-down' : 'drop-right'; |
55 | 55 | ||
56 | $nav_html .= '<li class="'. $li_class . '">' . $link . '<p id="m_' . $data->getId() . '">' . $data->getPageName() . '</p></a><ul class="sub-menu">' . "\n"; | 56 | $nav_html .= '<li class="'. $li_class . '">' . $link . '<p id="m_' . $data->getId() . '">' . $data->getPageName() . '</p></a> |
57 | <button class="sub-menu-toggle" aria-label="Ouvrir le sous-menu">▼</button> | ||
58 | <ul class="sub-menu">' . "\n"; | ||
57 | $level++; | 59 | $level++; |
58 | $nav_html .= $this->navMainHTML($data, $current); | 60 | $nav_html .= $this->navMainHTML($data, $current); |
59 | $level--; | 61 | $level--; |
@@ -64,7 +66,6 @@ class NavBuilder extends AbstractBuilder | |||
64 | $nav_html .= '<li class="'. $li_class . '">' . $link . '<p id="m_' . $data->getId() . '">' . $data->getPageName() . '</p></a></li>' . "\n"; | 66 | $nav_html .= '<li class="'. $li_class . '">' . $link . '<p id="m_' . $data->getId() . '">' . $data->getPageName() . '</p></a></li>' . "\n"; |
65 | } | 67 | } |
66 | } | 68 | } |
67 | |||
68 | } | 69 | } |
69 | return $nav_html; | 70 | return $nav_html; |
70 | } | 71 | } |