모달창 만들기
모달창 만들기는 동적 UI 만들기와 같이 UI를 미리 만들어놓고 특성 상황에서 UI가 노출되면 된다.
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<link rel="stylesheet" href="main.css">
<title>Hello, world!</title>
</head>
<body>
<!------------------------------------------------------------------>
<!-- modal -->
<div class="black-bg">
<div class="white-bg">
<h4>로그인하세요</h4>
<button class="btn btn-danger" id="close">닫기</button>
</div>
</div>
<!------------------------------------------------------------------>
<!-- navbar -->
<nav class="navbar navbar-light bg-light">
<div class="container-fluid">
<span class="navbar-brand">Navbar</span>
<button class="navbar-toggler" type="button">
<span class="navbar-toggler-icon"></span>
</button>
</div>
</nav>
<!-- navbar items -->
<ul class="list-group"> <!-- 띄워쓰기로 class 이름을 동시에 두개 만들었다. -->
<li class="list-group-item">An item</li>
<li class="list-group-item">A second item</li>
<li class="list-group-item">A third item</li>
<li class="list-group-item">A fourth item</li>
<li class="list-group-item">And a fifth one</li>
</ul>
<button id="login">로그인</button>
<!-- JavaScript -->
<script src="https://code.jquery.com/jquery-3.7.0.min.js" integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script>
<script>
// 모달창 노출
$('#login').on('click', function(){
$('.black-bg').addClass('show-modal');
})
// 모달창 닫기
$('#close').on('click', function(){
$('.black-bg').removeClass('show-modal');
})
document.querySelector('.navbar-toggler').addEventListener('click', function(){
document.querySelectorAll('.list-group')[0].classList.toggle('show');
})
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous">
</script>
</body>
</html>
.list-group {
display: none;
}
.show {
display: block;
}
.black-bg {
width: 100%;
height: 100%;
position: fixed;
background: rgba(0, 0, 0, 0.5);
z-index: 5;
padding: 30px;
display: none;
}
.show-modal{
display: block;
}
.white-bg {
background: white;
border-radius: 5px;
padding: 30px;
}
모달창에 애니메이션 주기
...
<script>
// 모달창 노출
$('#login').on('click', function(){
$('.black-bg').fadeIn(); //페이드 인
})
// 모달창 닫기
$('#close').on('click', function(){
$('.black-bg').fadeOut(); //페이드 아웃
})
document.querySelector('.navbar-toggler').addEventListener('click', function(){
document.querySelectorAll('.list-group')[0].classList.toggle('show');
})
</script>
...
위의 코드와 같이 fadein, fadeout으로 애니메이션 효과를 줄 수 있다. 하지만 위의 방법으로 하면 JS에 많은 일을 주기 때문에 성능이 저하될 수 있다. 따라서 애니메이션은 최대한 CSS로 처리하는 것이 좋다.
🚩 애니메이션을 만드는 법칙 🚩
[one way(A에서 B로)]
1. 애니메이션의 시작 전(시작) 스타일을 만든다. (스타일을 하나의 요소에 class 두개를 부여하고 css로 설정한다.)
=> 애니메이션을 사용하기 위해서는 display: none이 아니라 visibility: hidden을 사용한다.
2. 애니메이션의 끝난 후(최종) 스타일을 만든다.
=> 애니메이션을 사용하기 위해서는 display: block이 아니라 visibility: visible을 사용한다.
3. 원할 때 최종 스타일로 변하라고 코드를 짠다.
4. 시작 스타일에 transition을 추가한다.
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<link rel="stylesheet" href="main.css">
<title>Hello, world!</title>
</head>
<body>
<!------------------------------------------------------------------>
<!-- modal -->
<div class="black-bg">
<div class="white-bg">
<h4>로그인하세요</h4>
<button class="btn btn-danger" id="close">닫기</button>
</div>
</div>
<!------------------------------------------------------------------>
<button id="login">로그인</button>
<!-- JavaScript -->
<script src="https://code.jquery.com/jquery-3.7.0.min.js" integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script>
<script>
/* STEP 3 */
// 모달창 노출
$('#login').on('click', function(){
$('.black-bg').addClass('show-modal');
})
// 모달창 닫기
$('#close').on('click', function(){
$('.black-bg').removeClass('show-modal');
})
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous">
</script>
</body>
</html>
.black-bg {
/* STEP 1 */
width: 100%;
height: 100%;
position: fixed;
background: rgba(0, 0, 0, 0.5);
z-index: 5;
padding: 30px;
visibility: hidden;
opacity: 0;
/* STEP 4 */
transition: all 1s;
}
.show-modal{
/* STEP 2 */
visibility: visible;
opacity: 1;
}
.white-bg {
background: white;
border-radius: 5px;
padding: 30px;
}
'Web > JAVASCRIPT' 카테고리의 다른 글
코딩애플) if/else, function 실력향상 과제 (0) | 2023.07.17 |
---|---|
폼 만들기(if else) (0) | 2023.07.15 |
jQuery (0) | 2023.07.13 |
이벤트 리스너 (0) | 2023.07.13 |
서브메뉴 만들어보기와 classList 다루기 (1) | 2023.07.12 |