지난 포스팅에서 구축한 개발환경을 토대로, 이번에는 조금 더 다양한 기능을 가진 웹 페이지를 만들어 보도록 하겠습니다.
자기소개 페이지의 레이아웃은 header-footer, navigation bar, section을 사용하여 구성할 것이다.
저번 포스팅에서 생성한 Database 폴더 하위로 week2 폴더를 추가한다. 그리고 VSCode를 실행하여 week2를 연다. 먼저 아래의 사진을 week2.png라는 이름으로 week2 디렉토리 하위에 추가한다.
이후 week1 디렉토리 하위로 assignment1.html 파일을 생성하고, 아래의 내용을 입력한다.
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>HTML Practice</title>
</head>
<body>
<header>
<link rel="stylesheet" href="assignment1.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" />
<div>
<img src="./week2.png" alt="Selfie" id="fig">
</div>
<h1 style="text-align: left;">Hyun-seop Byun</h1>
<p style="text-align: left;">Database</p>
</header>
<nav>
<a href="#s1">[Personal information]</a>
<a href="#s2">[Coursework]</a>
<a href="#s3">[Courses]</a>
<a href="#s4">[Introducing]</a>
</nav>
<section id="s1">
<h2>Personal information</h2>
<ul>
<li>
<span class="material-symbols-outlined">
person
</span>Hyun-seop Byun
</li>
<li>
<span class="material-symbols-outlined">
call
</span>
010-1234-5678
</li>
<li>
<span class="material-symbols-outlined">
mail
</span>
gmlstjq123@naver.com
</li>
<li>
<span class="material-symbols-outlined">
home
</span>
Incheon Michuhol-gu Inha-ro
</li>
</ul>
</section>
<section class="sc2" id="s2">
<h2 class="c2">Coursework</h2>
<ol>
<li>
Operating System
</li>
<li>
Computer Network
</li>
<li>Database Design</li>
<li>Information protection</li>
</ol>
</section>
<section class="sc3" id="s3">
<h2 class="c3">Courses</h2>
<ul>
<li><a href="https://velog.io/@gmlstjq123">Blog</a></li>
<li><a href="https://github.com/gmlstjq123">Github</a></li>
<li><a href="https://polite-driver-4d9.notion.site/3ad1ff215345440791498cd5d39c5da4?pvs=4">Resume</a></li>
</ul>
</section>
<section class="sc4" id="s4">
<h2 class="c4">Introducing</h2>
<p id="p1">
<br>
Hello, I'm Hyunseop. I'm in the department of Information and Communication Engineering.
<br>
</p>
</section>
<footer>
©Hyun-seop Byun<br>gmlstjq123@naver.com
</footer>
</body>
</html>
① <!DOCTYPE html>
② <head>
③ <body>
④ <header>
⑤ <div>
⑥ <img src="./week2.png" alt="Selfie" id="fig">
⑦ <h1 style="text-align: left;">Hyun-seop Byun
⑧ <p style="text-align: left;">Database
⑨ <nav>
⑩ <ul> & <li>
⑪ <footer>
HTML 파일에 CSS 서식을 적용하는 방법은 총 3가지이다.
여기서는 외부 스타일 시트 방식을 사용할 것이므로, week1 디렉토리 하위로 assignment1.css 파일을 생성하고, 아래의 내용을 입력한다.
body {
margin: 0px;
padding: 0px;
}
header {
width: 100%;
background-color: #005766;
height: 200px;
}
header>div {
float: left;
}
header h1,
header p {
color: white;
text-align: center;
margin: 30px;
}
header img {
height: 150px;
padding: 20px;
}
nav {
clear: both;
background-color: #3db7cc;
height: 35px;
}
nav a {
width: 170px;
height: 35px;
padding: 5px;
display: inline-block;
text-decoration: none;
text-align: center;
}
section {
margin: 10px;
padding: 10px;
width: 45%;
height: 200px;
float: left;
border: 1px solid #3db7cc;
box-sizing: border-box;
}
section p,
section ul,
section ol {
padding-left: 50px;
}
h2 {
margin: 5px;
padding: 10px;
background-color: #005766;
color: rgb(255, 255, 255);
}
section a {
width: 80%;
height: 15px;
padding: 5px;
}
footer {
clear: both;
height: 50px;
background-color: #eaeaea;
color: #5d5d5d;
padding: 20px;
font-size: 12px;
}
① body
② header
③ header > div
④ header h1, header p
⑤ nav
⑥ nav a
※ 블록 VS 인라인 VS 인라인 블록
hn, p, div와 같이 요소의 너비가 항상 한 줄을 다 차지하는 것을 블록 성격을 갖는다고 말하고, a, span, strong 태그와 같이 요소의 너비가 컨텐츠 크기만큼만 차지하는 것은 인라인 성격을 갖는다고 한다. 블록 성격에는 width, height, margin, padding을 모두 적용 가능하지만, 인라인 성격에는 horizontal padding과 horizontal margin만 적용할 수 있다.
인라인 블록은 인라인과 블록의 성격이 혼합된 형태이다. 요소의 너비가 컨텐츠의 크기만큼만 차지하긴 하나 width, height, margin, padding을 적용할 수 있다.
⑦ section
각각의 파일을 ctrl + s를 눌러 저장한다. assignment1.html 파일을 열어둔 상태에서 ctrl + shift + p를 누르고 Live Server: Open with Live Server를 클릭한다.
위 과정이 정상적으로 완료되었다면, 아래와 같은 웹 페이지가 나타날 것이다.
이번에는 HTML로 사용자 입력 폼을 만드는 방법에 대해 실습해보기로 하자.
week1 디렉토리 하위로, assignment2.html을 생성하고 아래의 내용을 입력한다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>HTML Practice</title>
</head>
<body>
<form method="get" action="#" accept-charset="utf-8" name="person_info">
<fieldset style="width: 150">
<legend>Personal Information</legend>
Name: <input type="text" name="name" required /><br /><br />
Student Number:
<input type="text" name="security_number" pattern="\d{8}"
title="Please enter your 8-digit Student number!" /><br /><br />
ID: <input type="text" name="id" /><br /><br />
Passwords: <input type="password" name="password" /><br /><br />
Gender: M<input type="radio" name="gender" />
W<input type="radio" name="gender" /><br /><br />
Interests: Economy<input type="checkbox" name="checkbox1" />
Sports<input type="checkbox" name="checkbox2" />
IT<input type="checkbox" name="checkbox3" /><br /><br />
<input type="submit" value="submit" /><br /><br />
<input type="reset" value="reset" /><br /><br />
</fieldset>
</form>
</body>
</html>
① <form>
② <fieldset>
③ <input>
완성된 모습은 아래와 같다.
이번에는 assignment3.html에 아래의 내용을 입력해보자.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>HTML Practice</title>
</head>
<body>
<form method="get" action="#" accept-charset="utf-8" name="person_info">
<fieldset style="width: 250">
<legend>personal information</legend>
Select region (with size, multiple attributes)<br />
<select name="region-1" size="5" ltiple>
<option value="seongnam-si">seongnam-si</option>
<option value="suwon-si">suwon-si</option>
<option value="yongin-si">yongin-si</option>
<option value="anyang-si">anyang-si</option>
<option value="gwacheon-si">gwacheon-si</option>
<option value="hanam-si">hanam-si</option>
</select>
<br /><br />
Select region (with optgroup tag)<br />
<select name="region-1">
<optgroup label="Seoul">
<option value="songpa-gu">songpa-gu</option>
<option value="gangnam-gu">gangnam-gu</option>
<option value="seocho-gu">seocho-gu</option>
<option value="junggu-gu">junggu-gu</option>
</optgroup>
<optgroup label="Gyeonggi-do">
<option value="seongnam-si">seongnam-si</option>
<option value="suwon-si">suwon-si</option>
<option value="yongin-si">yongin-si</option>
<option value="anyang-si">anyang-si</option>
</optgroup>
</select>
<br /><br />
<input type="submit" value="submit" /><br /><br />
<input type="reset" value="reset" /><br /><br />
</fieldset>
</form>
</body>
</html>
① <select name="region-1" size="5" multiple>
② <optgroup>
완성된 모습은 아래와 같다.
이제부터 본격적으로 JavaScript를 연결하여 사용해보도록 하겠다.
assignment4.html 파일에 아래의 내용을 입력한다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>HTML Practice</title>
</head>
<body>
<h1>Create An Account</h1>
<form id="user">
<div>
<label for="firstname">First name</label>
<input id="firstname" type="text" required placeholder="First name">
</div>
<div>
<label for="lastname">Last name</label>
<input id="lastname" type="text" placeholder="Last name">
</div>
<div>
<label for="mail">Email</label>
<input id="mail" type="email" placeholder="Email">
</div>
<div>
<label for="userid">Username</label>
<input id="userid" type="text" placeholder="Username">
</div>
<div>
<label for="pw">Password</label>
<input id="pw" type="password" minlength="10" placeholder="Password">
</div>
<div>
<label for="date">Birth date</label>
<input id="date" type="date" placeholder="Username">
</div>
<div>
<label for="slide">How happy are you?</label>
<input id="slide" type="range" list="tickmarks">
<datalist id="tickmarks">
<option value="0"></option>
<option value="10"></option>
<option value="20"></option>
<option value="30"></option>
<option value="40"></option>
<option value="50"></option>
<option value="60"></option>
<option value="70"></option>
<option value="80"></option>
<option value="90"></option>
<option value="100"></option>
</datalist>
</div>
<div>
<label for="color">What is your fav.color?</label>
<input id="color" type="color">
</div>
<input type="submit" value="Create Account">
</form>
<div id="form-result">
<span></span>
</div>
<script type="text/javascript" src="assignment4.js"></script>
</body>
</html>
①
assignment4.js 파일에 아래의 내용을 입력한다.
const firstName = document.getElementById("firstname");
const lastName = document.getElementById("lastname");
const email = document.getElementById("mail");
const userid = document.getElementById("userid");
const printForm = document.getElementById("user");
const display = document.getElementById("form-result");
const handlePrint = (e) => {
e.preventDefault(); // Prevents the window from moving
const fn = firstName.value;
const ln = lastName.value;
const em = email.value;
const id = userid.value;
const displaySpan = display.querySelector("span"); // Select the span tag inside the tag with id form-result
displaySpan.innerHTML = `First Name is: ${fn}<br>
Last Name is: ${ln}<br>
E-mail is: ${em}<br>
ID is: ${id}`;
};
printForm.addEventListener("submit", handlePrint);
① const handlePrint = (e)
② e.preventDefault();
③ displaySpan.innerHTML
완성된 모습은 아래와 같다.
assignment5.html에 아래의 내용을 입력한다.
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
</head>
<body>
<h1>Random Number Game</h1>
<div id="js-title">
<h3 class="js-title">Generate a number between 0 and <span>200</span></h3>
<datalist id="number">
<option value="50"></option>
<option value="100"></option>
<option value="150"></option>
<option value="200"></option>
</datalist>
<input list="number" id="js-range" type="range" min="5" max="200" value="5" step="5" />
</div>
<form id="js-guess">
<label for="num">Guess the number:</label>
<input id="num" type="number" max="200" min="0" />
<button>Play!</button>
</form>
<div id="js-result">
<span></span>
</div>
<script type="text/javascript" src="assignment5.js"></script>
</body>
</html>
assignment5.js 파일에 아래의 내용을 입력한다. 자세한 설명은 주석으로 대체하기로 한다.
const dataList = document.getElementById("number"); // 슬라이드
const rangeInput = document.getElementById('js-range'); // 랜덤 숫자의 범위
const guessForm = document.getElementById('js-guess'); // 추측 숫자를 받는 폼
const resultSpan = document.querySelector('#js-result span'); // 승패 결과 표기
const selectedValueSpan = document.querySelector('#js-title .js-title span'); // 최대 범위 표기
// 랜덤 숫자가 변경되는 이벤트에 대한 리스너
rangeInput.addEventListener('input', () => {
// input 태그의 값을 최대 범위 표기에 넘겨줌
const selectedValue = rangeInput.value;
selectedValueSpan.textContent = selectedValue;
});
function playGame() {
const selectedNumber = parseInt(rangeInput.value); // 최대 범위를 정수로 형변환
const randomNumber = getRandomNumber(selectedNumber); // 0 ~ 최대범위 랜덤 수 생성
// 사용자 입력 숫자 가져오기
const guessedNumber = parseInt(document.getElementById('num').value);
if (guessedNumber === randomNumber) {
// 리터럴을 사용하려면 따옴표가 아닌 백틱을 사용
resultSpan.innerHTML = `You choose: ${guessedNumber}, the machine choose: ${randomNumber}.<br><b>You win!</b>`;
} else {
resultSpan.innerHTML = `You choose: ${guessedNumber}, the machine choose: ${randomNumber}.<br><b>You lose!</b>`;
}
}
// Play를 클릭
guessForm.addEventListener('submit', (event) => {
event.preventDefault(); // 폼 제출 기본 동작 막기
playGame(); // 게임 실행
});
// 최대 범위를 입력받아 랜덤 숫자 생성
function getRandomNumber(selectedValue) {
const randomNumber = Math.floor(Math.random() * (selectedValue + 1)); // max 범위 + 1 미만의 자연수 생성
return randomNumber;
}
완성된 모습은 아래와 같다.