https://www.youtube.com/watch?v=dWfpp-0riYA
로그인 페이지
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>로그인</title>
<link rel="stylesheet" href="../css/login.css">
<script src="../lib/jquery-3.6.0.min.js"></script>
</head>
<body>
<section class="login-form">
<h1>Login</h1>
<form action="">
<div class="int-area">
<input type="text" name="id" id="id" autocomplete="off" required>
<label for="id">USER NAME</label>
</div>
<div class="int-area">
<input type="password" name="pw" id="pw" autocomplete="off" required>
<label for="pw">PASSWORD</label>
</div>
<div class="btn-area">
<button id="btn" type="submit">LOGIN</button>
</div>
</form>
<div class="caption">
<a href="">Forgot Password?</a>
<a href="">회원가입</a>
</div>
</section>
<script>
let id = $('#id');
let pw = $('#pw');
let btn = $('#btn');
$(btn).on('click', function() {
if($(id).val() == "") {
$(id).next('label').addClass('warning');
setTimeout(function() {
$('label').removeClass('warning');
}, 1500);
}
else if($(pw).val() == "") {
$(pw).next('label').addClass('warning');
setTimeout(function() {
$('label').removeClass('warning');
}, 1500);
}
});
</script>
</body>
</html>
유튜브를 보면서 간단한 클론(?) 코딩을 해보니 생각보다 박스가 세분화되어서 페이지가 구성된다는 것을 알았다.
class 속성은 어떤 분류 안에 포함된 요소의 특성을 정의하는데 사용된다.
id 속성은 어떤 요소에 대한 유일한 특성을 정의한다.(HTML 문서에 특정 id 속성값은 오직 하나만 있어야 한다.)
css
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR&display=swap');
* {
margin: 0;
padding: 0;
}
body {
font-family: 'Noto Sans KR', sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.login-form h1 {
font-size: 32px;
text-align: center;
margin-bottom: 50px;
}
.int-area {
width: 400px;
position: relative;
margin-top: 20px;
}
.int-area:first-child {
margin-top: 0;
}
.int-area input {
width: 100%;
padding: 20px 10px 10px;
background-color: transparent;
border: none;
border-bottom: 1px solid black;
font-size: 18px;
outline: none;
}
.int-area label {
position: absolute;
left: 10px;
top: 15px;
font-size: 18px;
transition: top 0.5s ease;
}
.int-area label.warning {
color: red !important;
animation: warning 0.3s ease;
animation-iteration-count: 3;
}
@keyframes warning {
0% {
transform: translateX(-8px);
}
25% {
transform: translateX(8px);
}
50% {
transform: translateX(-8px);
}
75% {
transform: translateX(8px);
}
}
.int-area input:focus + label,
.int-area input:valid + label {
top: -2px;
font-size: 13px;
color: #166caa;
}
.btn-area {
margin-top: 30px;
}
.btn-area button {
width: 100%;
height: 50px;
margin: 0px 10px;
color: #fff;
background: #166caa;
border: none;
border-radius: 20px;
font-size: 20px;
cursor: pointer;
}
.caption {
margin-top: 20px;
text-align: center;
}
.caption a {
margin: 0 20px;
font-size: 15px;
color: blue;
text-decoration: none;
}
.login-form h1
, .btn-area button
위와 같은 형태로 login-form
클래스에 있는 h1 과 btn-area button
클래스에 있는 button의 css디자인을 적용해 줄 수 있다.
기본 축은 row 이고, 반대 축은 column이다.
justify-content
로 기본 축에 대한 정렬을 정의하고, align-items
로 반대 축에 대한 정렬을 정의한다.
text-decoration: none;
a 태그와 같이 기본적으로 밑줄 같은 효과가 적용되어 있는 것을 없애준다.
outline: none;
선택된 요소가 강조되는 것을 없애준다.
text 요소의 경우 input의 border가 두꺼워지면서 강조가 되는데 none을 적용하면 border가 두꺼워지지않는다.