Skip to content

Commit 987f904

Browse files
committed
📱 Navbar show/ hide functionality on mobile
1 parent 5fe7971 commit 987f904

File tree

2 files changed

+69
-29
lines changed

2 files changed

+69
-29
lines changed
Loading

src/components/PageStrcture/Nav.vue

+68-29
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,93 @@
11
<template>
2-
<nav id="nav">
2+
<div class="nav-outer">
3+
<IconBurger
4+
:class="`burger ${!navVisible ? 'visible' : ''}`"
5+
@click="navVisible = !navVisible"
6+
/>
7+
<nav id="nav" v-if="navVisible">
38
<router-link
4-
v-for="(link, index) in links"
5-
:key="index"
6-
:to="link.path"
7-
:href="link.path"
8-
:target="isUrl(link.path) ? '_blank' : ''"
9-
rel="noopener noreferrer"
10-
class="nav-item"
9+
v-for="(link, index) in links"
10+
:key="index"
11+
:to="link.path"
12+
:href="link.path"
13+
:target="isUrl(link.path) ? '_blank' : ''"
14+
rel="noopener noreferrer"
15+
class="nav-item"
1116
>{{link.title}}</router-link>
12-
</nav>
17+
</nav>
18+
</div>
1319
</template>
1420

1521
<script>
22+
import IconBurger from '@/assets/interface-icons/burger-menu.svg';
23+
1624
export default {
1725
name: 'Nav',
26+
components: {
27+
IconBurger,
28+
},
1829
props: {
1930
links: Array,
2031
},
32+
data: () => ({
33+
navVisible: true,
34+
isMobile: false,
35+
}),
36+
created() {
37+
this.navVisible = !this.detectMobile();
38+
this.isMobile = this.detectMobile();
39+
},
2140
methods: {
41+
detectMobile() {
42+
const screenWidth = document.body.clientWidth;
43+
return screenWidth && screenWidth < 600;
44+
},
2245
isUrl: (str) => new RegExp(/(http|https):\/\/(\S+)(:[0-9]+)?/).test(str),
2346
},
2447
};
2548
</script>
2649

2750
<style scoped lang="scss">
51+
@import '@/styles/style-helpers.scss';
52+
@import '@/styles/media-queries.scss';
2853
29-
nav {
54+
.nav-outer {
55+
nav {
3056
display: flex;
3157
align-items: center;
3258
.nav-item {
33-
display: inline-block;
34-
padding: 0.75rem 0.5rem;
35-
margin: 0.5rem;
36-
min-width: 5rem;
37-
text-align: center;
38-
outline: none;
39-
border: none;
40-
border-radius: var(--curve-factor);
41-
-webkit-box-shadow: 1px 1px 2px #232323;
42-
box-shadow: 1px 1px 2px #232323;
43-
color: var(--nav-link-text-color);
44-
background: var(--nav-link-background-color);
45-
border: 1px solid var(--nav-link-border-color);
46-
text-decoration: none;
47-
&.router-link-active, &:hover {
48-
color: var(--nav-link-text-color-hover);
49-
background: var(--nav-link-background-color-hover);
50-
border: 1px solid var(--nav-link-border-color-hover);
51-
}
59+
display: inline-block;
60+
padding: 0.75rem 0.5rem;
61+
margin: 0.5rem;
62+
min-width: 5rem;
63+
text-align: center;
64+
outline: none;
65+
border: none;
66+
border-radius: var(--curve-factor);
67+
-webkit-box-shadow: 1px 1px 2px #232323;
68+
box-shadow: 1px 1px 2px #232323;
69+
color: var(--nav-link-text-color);
70+
background: var(--nav-link-background-color);
71+
border: 1px solid var(--nav-link-border-color);
72+
text-decoration: none;
73+
&.router-link-active, &:hover {
74+
color: var(--nav-link-text-color-hover);
75+
background: var(--nav-link-background-color-hover);
76+
border: 1px solid var(--nav-link-border-color-hover);
77+
}
5278
}
79+
}
80+
/* Mobile and Burger-Menu Styles */
81+
@extend .svg-button;
82+
@include phone {
83+
width: 100%;
84+
nav { flex-wrap: wrap; }
85+
}
86+
.burger {
87+
display: none;
88+
&.visible { display: block; }
89+
@include phone { display: block; }
90+
}
5391
}
92+
5493
</style>

0 commit comments

Comments
 (0)