
연습문제
: 메뉴 아이콘을 클릭했을 때 사이드바 메뉴가 화면 왼쪽에서 나타나도록 하는 JavaScript 프로그램을 작성하라.
① 닫기 버튼을 눌렀을 때 사이드바 메뉴가 사라지는 Version
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width">
<meta charset="utf-8">
<title>demo</title>
<link rel="stylesheet" href="reset.css">
<style>
/* button 요소에 기본적으로 적용되는 스타일 속성 초기화 */
body {
background-color: black;
}
button {
background-color: transparent;
padding: 0;
border: none;
outline: none;
cursor: pointer;
}
/* 웹 접근성 향상을 위해 넣어준 span 요소를 화면에 보이지 않도록 설정 */
button > span { display: none; }
#menu {
/* 포지션 속성을 지정하지 않게 되면 #menu 요소가 화면에 보이지 않는다. */
/* HTML 문서를 기준으로 좌상단에 배치해도 되므로 기준이 되는 포지션 속성을
굳이 주지 않아도 된다. */
position: absolute;
top: 50px; left: 50px;
/* 크기 설정 */
width: 36px; height: 36px;
/* 배경 이미지를 이용해서 아이콘 표시 */
background: url("outline_menu_white_icon_36px.png") no-repeat center / cover;
/* 배경 이미지를 이용해서 아이콘 표시 */
/* z-index: 1; */
}
#sidebar {
/* 포지션 속성을 지정하지 않게 되면 #sidebar 요소가 화면에 보이지 않는다. */
/* 화면을 기준으로 왼쪽에 배치 */
position: fixed;
top: 0; bottom: 0;
/* 여기에서 left값을 주지 않게 되면 변화하는 값이 없게 되므로
transition 속성이 적용되지 않는다. */
left: 0;
/* 요소가 처음에는 화면 바깥쪽에 배치되도록 설정 */
/* → left 스타일 속성 값을 요소의 크기(width)만큼 음수로 지정 */
left: -500px;
/* 너비 설정 */
width: 500px;
background-color: rgb(178, 92, 212);
/* 요소의 움직임을 만들어주기 위해 transition 설정 */
transition: 0.4s;
}
#close {
/* #sidebar 요소의 영역을 기준으로 우상단에 배치
#sidebar에는 이미 포지션 속성일 설정되어 있으므로 기준으로 삼을 수 있다 */
position: absolute;
top: 50px; right: 50px;
/* 크기 설정 */
width: 36px; height: 36px;
/* 배경 이미지를 이용해 아이콘 표시 */
background: url("outline_close_white_icon_36px.png") no-repeat center /cover;
}
</style>
<script>
window.addEventListener("load", function () {
// 이벤트 핸들러: window 객체에 load 이벤트가 발생하면 실행할 기능
// → 브라우저가 HTML 문서의 내용을 모두 읽고 해석한 다음 발생하는 이벤트
// → 따라서 이 이벤트 핸들러에서는 DOM에 있는 요소들에 정상적으로 접근할 수 있다.
//---------------------------------------------------------------------------
// 1. #menu 요소를 클릭하면
// 1.1. #sidebar 요소가 화면에 나타나도록 한다.
// 2. #close 요소를 클릭하면
// 2.1. #sidebar 요소가 화면에 사라지도록 한다.
//---------------------------------------------------------------------------
// 프로그램에서 여러 번 참조하는 요소를 미리 탐색
var sidebar = document.querySelector("#sidebar");
// 1. #menu 요소를 클릭하면
document.getElementById("menu").addEventListener("click", function () {
// 이벤트 핸들러: #menu 요소에 click 이벤트가 발생하면 실행할 기능
// 1.1. #sidebar 요소가 화면에 나타나도록 한다.
sidebar.style.left = "0";
});
// 2. #close 요소를 클릭하면
document.getElementById("close").addEventListener("click", function() {
// 이벤트 핸들러: #close 요소에 click 이벤트가 발생하면 실행할 기능
// 2.1. #sidebar 요소가 화면에 사라지도록 한다.
// → #sidebar 요소에 설정했던 left 스타일 속성을 제거한다.
// sidebar.style.left = "";
sidebar.removeAttribute("style");
});
}); //window.onload
</script>
</head>
<body>
<!-- 웹 접근성 향상을 위해 span 태그로 텍스트 입력 -->
<button id="menu"><span>Menu</span></button>
<aside id="sidebar">
<button id="close"><span>Close</span></button>
</aside>
</body>
</html>

② 메뉴 버튼을 다시 눌렀을 때 사이드바 메뉴가 사라지는 Version
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width">
<meta charset="utf-8">
<title>demo</title>
<link rel="stylesheet" href="reset.css">
<style>
/* button 요소에 기본적으로 적용되는 스타일 속성 초기화 */
body {
background-color: black;
}
button {
background-color: transparent;
padding: 0;
border: none;
outline: none;
cursor: pointer;
}
/* 웹 접근성 향상을 위해 넣어준 span 요소를 화면에 보이지 않도록 설정 */
button > span { display: none; }
#menu {
/* 포지션 속성을 지정하지 않게 되면 #menu 요소가 화면에 보이지 않는다. */
/* HTML 문서를 기준으로 좌상단에 배치해도 되므로 기준이 되는 포지션 속성을
굳이 주지 않아도 된다. */
position: absolute;
top: 50px; left: 50px;
/* 크기 설정 */
width: 36px; height: 36px;
/* 배경 이미지를 이용해서 아이콘 표시 */
background: url("outline_menu_white_icon_36px.png") no-repeat center / cover;
/* 배경 이미지를 이용해서 아이콘 표시 */
z-index: 1;
}
#sidebar {
/* 포지션 속성을 지정하지 않게 되면 #sidebar 요소가 화면에 보이지 않는다. */
/* 화면을 기준으로 왼쪽에 배치 */
position: fixed;
top: 0; bottom: 0;
/* 여기에서 left값을 주지 않게 되면 변화하는 값이 없게 되므로
transition 속성이 적용되지 않는다. */
left: 0;
/* 요소가 처음에는 화면 바깥쪽에 배치되도록 설정 */
/* → left 스타일 속성 값을 요소의 크기(width)만큼 음수로 지정 */
left: -500px;
/* 너비 설정 */
width: 500px;
background-color: rgb(178, 92, 212);
/* 요소의 움직임을 만들어주기 위해 transition 설정 */
transition: 0.4s;
}
</style>
<script>
window.addEventListener("load", function () {
// 이벤트 핸들러: window 객체에 load 이벤트가 발생하면 실행할 기능
// → 브라우저가 HTML 문서의 내용을 모두 읽고 해석한 다음 발생하는 이벤트
// → 따라서 이 이벤트 핸들러에서는 DOM에 있는 요소들에 정상적으로 접근할 수 있다.
//---------------------------------------------------------------------------
// 1. #menu 요소를 클릭하면
// 1.1. #sidebar 요소가 화면에 보이지 않는 상태이면
// 1.2. #sidebar 요소가 화면에 나타나도록 한다.
// 1.3. 그렇지 않으면
// 1.4. #sidebar 요소가 화면에 사라지도록 한다.
//---------------------------------------------------------------------------
// 프로그램에서 여러 번 참조하는 요소를 미리 탐색
var sidebar = document.querySelector("#sidebar");
// 1. #menu 요소를 클릭하면
document.getElementById("menu").addEventListener("click", function () {
// 이벤트 핸들러: #menu 요소에 click 이벤트가 발생하면 실행할 기능
// 디버그 메시지
console.log("sidebar.style.left = " + sidebar.style.left);
// 1.1. #sidebar 요소가 화면에 보이지 않는 상태이면
// → #sidebar 요소의 left 스타일 속성의 값이 설정되어 있지 않으면
// if( sidebar.style.left == "")
if(!sidebar.style.left)
// 1.2. #sidebar 요소가 화면에 나타나도록 한다.
sidebar.style.left = "0";
// 1.3. 그렇지 않으면
else
// 1.4. #sidebar 요소가 화면에 사라지도록 한다.
sidebar.style.left = "";
});
}); //window.onload
</script>
</head>
<body>
<!-- 웹 접근성 향상을 위해 span 태그로 텍스트 입력 -->
<button id="menu"><span>Menu</span></button>
<aside id="sidebar">
</aside>
</body>
</html>
