Enhance NavbarComponent functionality: Add click outside detection to close the menu and improve responsiveness by adjusting styles for mobile view, ensuring better user experience and accessibility.
All checks were successful
Deploy miriamgemeinde / deploy (push) Successful in 6s
All checks were successful
Deploy miriamgemeinde / deploy (push) Successful in 6s
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<nav class="navbar">
|
<nav class="navbar" ref="navRef">
|
||||||
<button
|
<button
|
||||||
class="menu-toggle"
|
class="menu-toggle"
|
||||||
type="button"
|
type="button"
|
||||||
@@ -51,6 +51,7 @@ export default {
|
|||||||
name: 'NavbarComponent',
|
name: 'NavbarComponent',
|
||||||
setup() {
|
setup() {
|
||||||
const store = useStore();
|
const store = useStore();
|
||||||
|
const navRef = ref(null);
|
||||||
const isMenuOpen = ref(false);
|
const isMenuOpen = ref(false);
|
||||||
const isSubmenuOpen = reactive({});
|
const isSubmenuOpen = reactive({});
|
||||||
const windowWidth = ref(window.innerWidth);
|
const windowWidth = ref(window.innerWidth);
|
||||||
@@ -89,7 +90,16 @@ export default {
|
|||||||
Object.keys(isSubmenuOpen).forEach(key => {
|
Object.keys(isSubmenuOpen).forEach(key => {
|
||||||
isSubmenuOpen[key] = false;
|
isSubmenuOpen[key] = false;
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
|
const handleClickOutside = (event) => {
|
||||||
|
if (windowWidth.value > 768 || !isMenuOpen.value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (navRef.value && !navRef.value.contains(event.target)) {
|
||||||
|
closeMenu();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleResize = () => {
|
const handleResize = () => {
|
||||||
windowWidth.value = window.innerWidth;
|
windowWidth.value = window.innerWidth;
|
||||||
@@ -103,13 +113,16 @@ export default {
|
|||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
window.addEventListener('resize', handleResize);
|
window.addEventListener('resize', handleResize);
|
||||||
|
document.addEventListener('click', handleClickOutside);
|
||||||
});
|
});
|
||||||
|
|
||||||
onBeforeUnmount(() => {
|
onBeforeUnmount(() => {
|
||||||
window.removeEventListener('resize', handleResize);
|
window.removeEventListener('resize', handleResize);
|
||||||
|
document.removeEventListener('click', handleClickOutside);
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
navRef,
|
||||||
isMenuOpen,
|
isMenuOpen,
|
||||||
isSubmenuOpen,
|
isSubmenuOpen,
|
||||||
windowWidth,
|
windowWidth,
|
||||||
@@ -254,12 +267,23 @@ export default {
|
|||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.navbar {
|
.navbar {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
position: relative;
|
||||||
|
z-index: 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar ul {
|
.navbar ul {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
gap: 0;
|
gap: 0;
|
||||||
|
position: absolute;
|
||||||
|
top: calc(100% + var(--space-1));
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
max-height: min(70vh, 420px);
|
||||||
|
overflow-y: auto;
|
||||||
|
border-radius: 4px;
|
||||||
|
box-shadow: var(--shadow-dropdown);
|
||||||
|
background-color: var(--color-brand-primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar li {
|
.navbar li {
|
||||||
|
|||||||
Reference in New Issue
Block a user