@@ -5,8 +5,6 @@ description: >-
5
5
튜토리얼: 첫 번째 Astro 블로그 구축 — Astro 스크립트 태그를 사용하여 모바일 탐색에 클라이언트 측 상호 작용 기능 추가
6
6
i18nReady : true
7
7
---
8
-
9
-
10
8
import Blanks from ' ~/components/tutorial/Blanks.astro' ;
11
9
import Box from ' ~/components/tutorial/Box.astro' ;
12
10
import Checklist from ' ~/components/Checklist.astro' ;
@@ -15,74 +13,65 @@ import Option from '~/components/tutorial/Option.astro';
15
13
import PreCheck from ' ~/components/tutorial/PreCheck.astro' ;
16
14
import { Steps } from ' @astrojs/starlight/components' ;
17
15
18
- 클라이언트 측 상호 작용이 필요한 모바일 화면 크기에서 링크를 열고 닫을 수 있는 햄버거 메뉴를 추가해 보겠습니다.
16
+ 클라이언트 측 상호 작용이 필요한 모바일 화면 크기에서 탐색 메뉴를 열고 닫을 수 있는 버튼을 추가해 보겠습니다.
19
17
20
18
<PreCheck >
21
- - 햄버거 메뉴 컴포넌트 만들기
19
+ - 메뉴 컴포넌트 만들기
22
20
- 사이트 방문자가 탐색 메뉴를 열고 닫을 수 있도록 ` <script> ` 작성
23
21
- JavaScript를 ` .js ` 파일로 이동
24
22
</PreCheck >
25
23
26
- ## 햄버거 컴포넌트 구축
24
+ ## 메뉴 컴포넌트 구축
27
25
28
- 모바일 메뉴를 열고 닫을 수 있는 ` <Hamburger /> ` 컴포넌트를 만듭니다.
26
+ 모바일 메뉴를 열고 닫을 수 있는 ` <Menu /> ` 컴포넌트를 만듭니다.
29
27
30
28
<Steps >
31
- 1 . ` src/components/ ` 에 ` Hamburger .astro` 라는 파일을 생성합니다.
29
+ 1 . ` src/components/ ` 에 ` Menu .astro` 라는 파일을 생성합니다.
32
30
33
- 2 . 다음 코드를 컴포넌트에 복사합니다. 이는 모바일에서 탐색 링크를 열고 닫는 3줄 "햄버거" 메뉴를 나타냅니다 . (나중에 ` global.css ` 에 새 CSS 스타일을 추가할 것입니다.)
31
+ 2 . 다음 코드를 컴포넌트에 복사합니다. 이는 모바일 기기에서 탐색 링크의 표시 여부를 전환하는 데 사용될 버튼을 생성합니다 . (나중에 ` global.css ` 에 새 CSS 스타일을 추가할 것입니다.)
34
32
35
- ``` astro title="src/components/Hamburger .astro"
33
+ ``` astro title="src/components/Menu .astro"
36
34
---
37
35
---
38
- <div class="hamburger">
39
- <span class="line"></span>
40
- <span class="line"></span>
41
- <span class="line"></span>
42
- </div>
36
+ <button aria-expanded="false" aria-controls="main-menu" class="menu">
37
+ Menu
38
+ </button>
43
39
```
44
40
45
- 3 . 이 새로운 ` <Hamburger /> ` 컴포넌트를 ` Header.astro ` 의 ` <Navigation /> ` 컴포넌트 바로 앞에 배치하세요.
41
+ 3 . 이 새로운 ` <Menu /> ` 컴포넌트를 ` Header.astro ` 의 ` <Navigation /> ` 컴포넌트 바로 앞에 배치하세요.
46
42
47
43
<details >
48
44
<summary >코드를 확인하세요!</summary >
49
45
50
46
``` astro title="src/components/Header.astro" ins={2,7}
51
47
---
52
- import Hamburger from './Hamburger .astro';
48
+ import Menu from './Menu .astro';
53
49
import Navigation from './Navigation.astro';
54
50
---
55
51
<header>
56
52
<nav>
57
- <Hamburger />
53
+ <Menu />
58
54
<Navigation />
59
55
</nav>
60
56
</header>
61
57
```
62
58
</details >
63
59
64
- 4 . 햄버거 컴포넌트에 다음 스타일을 추가합니다 .
60
+ 4 . 메뉴 컴포넌트에 다음 스타일을 추가하세요. 여기에는 반응형 스타일도 포함됩니다 .
65
61
66
- ``` css title="src/styles/global.css" ins={2-13, 56-58 }
62
+ ``` css title="src/styles/global.css" ins={2-9, 33-35, 51-53 }
67
63
/* nav 스타일 */
68
- .hamburger {
69
- padding-right : 20px ;
70
- cursor : pointer ;
71
- }
72
-
73
- .hamburger .line {
74
- display : block ;
75
- width : 40px ;
76
- height : 5px ;
77
- margin-bottom : 10px ;
78
- background-color : #ff9776 ;
64
+ .menu {
65
+ background-color : #0d0950 ;
66
+ border : none ;
67
+ color : #fff ;
68
+ font-size : 1.2rem ;
69
+ font-weight : bold ;
70
+ padding : 5px 10px ;
79
71
}
80
72
81
73
.nav-links {
82
74
width : 100% ;
83
- top : 5rem ;
84
- left : 48px ;
85
- background-color : #ff9776 ;
86
75
display : none ;
87
76
margin : 0 ;
88
77
}
@@ -95,13 +84,15 @@ import { Steps } from '@astrojs/starlight/components';
95
84
font-size : 1.2rem ;
96
85
font-weight : bold ;
97
86
text-transform : uppercase ;
87
+ color : #0d0950 ;
98
88
}
99
-
100
- .nav-links a :hover , a :focus {
89
+
90
+ .nav-links a :hover ,
91
+ .nav-links a :focus {
101
92
background-color : #ff9776 ;
102
93
}
103
94
104
- . expanded {
95
+ :has ( .menu [ aria- expanded= " true " ]) .nav-links {
105
96
display : unset ;
106
97
}
107
98
@@ -119,7 +110,7 @@ import { Steps } from '@astrojs/starlight/components';
119
110
padding : 15px 20px ;
120
111
}
121
112
122
- .hamburger {
113
+ .menu {
123
114
display : none ;
124
115
}
125
116
}
@@ -128,18 +119,21 @@ import { Steps } from '@astrojs/starlight/components';
128
119
129
120
## 첫 번째 스크립트 태그 작성
130
121
131
- 탐색 링크를 표시하거나 숨기기 위해 햄버거 메뉴를 클릭하는 등의 사용자 입력에 응답할 수 없기 때문에 헤더는 아직 ** 대화형** 이 아닙니다.
122
+ 탐색 링크를 표시하거나 숨기기 위해 메뉴를 클릭하는 등의 사용자 입력에 응답할 수 없기 때문에 헤더는 아직 ** 대화형** 이 아닙니다.
132
123
133
124
` <script> ` 태그를 추가하면 클라이언트 측 JavaScript가 사용자 이벤트를 '수신'한 후 그에 따라 응답합니다.
134
125
135
126
<Steps >
136
127
1 . ` index.astro ` 의 닫는 ` </body> ` 태그 바로 앞에 다음 ` <script> ` 태그를 추가합니다.
137
128
138
- ``` astro title="src/pages/index.astro" ins={2-6 }
129
+ ``` astro title="src/pages/index.astro" ins={2-9 }
139
130
<Footer />
140
131
<script>
141
- document.querySelector('.hamburger')?.addEventListener('click', () => {
142
- document.querySelector('.nav-links')?.classList.toggle('expanded');
132
+ const menu = document.querySelector('.menu');
133
+
134
+ menu.addEventListener('click', () => {
135
+ const isExpanded = menu.getAttribute('aria-expanded') === 'true';
136
+ menu.setAttribute('aria-expanded', !isExpanded);
143
137
});
144
138
</script>
145
139
</body>
@@ -156,26 +150,32 @@ import { Steps } from '@astrojs/starlight/components';
156
150
1 . ` src/scripts/menu.js ` 를 생성하고 (새 ` /scripts/ ` 폴더를 생성해야 함) JavaScript를 해당 폴더로 이동합니다.
157
151
158
152
``` js title="src/scripts/menu.js"
159
- document .querySelector (' .hamburger' ).addEventListener (' click' , () => {
160
- document .querySelector (' .nav-links' ).classList .toggle (' expanded' );
153
+ const menu = document .querySelector (' .menu' );
154
+
155
+ menu .addEventListener (' click' , () => {
156
+ const isExpanded = menu .getAttribute (' aria-expanded' ) === ' true' ;
157
+ menu .setAttribute (' aria-expanded' , ! isExpanded);
161
158
});
162
159
```
163
160
164
161
2 . ` index.astro ` 의 ` <script> ` 태그 내용을 다음 파일 가져오기로 바꿉니다.
165
162
166
- ``` astro title="src/pages/index.astro" ins={7} del={3-5 }
163
+ ``` astro title="src/pages/index.astro" ins={7} del={3-8 }
167
164
<Footer />
168
165
<script>
169
- document.querySelector('.hamburger')?.addEventListener('click', () => {
170
- document.querySelector('.nav-links')?.classList.toggle('expanded');
166
+ const menu = document.querySelector('.menu');
167
+
168
+ menu.addEventListener('click', () => {
169
+ const isExpanded = menu.getAttribute('aria-expanded') === 'true';
170
+ menu.setAttribute('aria-expanded', !isExpanded);
171
171
});
172
172
173
173
import "../scripts/menu.js";
174
174
</script>
175
175
</body>
176
176
```
177
177
178
- 3 . 더 작은 크기로 브라우저 미리보기를 다시 확인하고 햄버거 메뉴가 여전히 탐색 링크를 열고 닫는지 확인하세요.
178
+ 3 . 더 작은 크기로 브라우저 미리보기를 다시 확인하고 메뉴가 여전히 탐색 링크를 열고 닫는지 확인하세요.
179
179
180
180
4 . 가져오기와 동일한 ` <script> ` 를 다른 두 페이지인 ` about.astro ` 및 ` blog.astro ` 에 추가하고 각 페이지에 반응형 대화형 헤더가 있는지 확인하세요.
181
181
0 commit comments