今回は、ユーザーがまず始めにアクセスする画面である、ログイン画面を作成していきます。
ログイン画面の作成
- login.ejsファイルの作成
- CSSの作成
- 使い回すコードのパーツ化
完成イメージ
↓ログイン画面はこのような形に仕上げていきます。

※夫婦仲向上アプリを作成しようと考えています
ログイン用ejsファイルの作成
それではログイン画面を作成していきます。
login.ejsファイルの作成
ログイン用の画面なので、「login.ejs」ファイルを作成して下記のコードを記述しました。
//login.ejs
<!DOCTYPE html>
<html lang="ja">
<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">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<script src="https://kit.fontawesome.com/f3bdbfba30.js" crossorigin="anonymous"></script>
<link href="https://fonts.googleapis.com/css2?family=M+PLUS+Rounded+1c&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/css/reset.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/responsible.css">
<title>まんまるかぞく</title>
</head>
<body>
<header>
<div class="header__container">
<img src="/images/rabbit-icon.png" alt="まんまるかぞく">
<h1>まんまるかぞく</h1>
</div>
</header>
<section class="login">
<div class="container">
<form action="/login" method="post" class="login__form">
<div class="login__form-container">
<input type="email" name="email" id="login-id" class="login__form-item-input" placeholder="メールアドレス">
</div>
<div class="login__form-container">
<input type="password" name="password" id="password" class="login__form-item-input" placeholder="パスワード">
</div>
<button type="submit">ログイン</button>
<p><a href="/register">新規登録はこちら</a></p>
</form>
</div>
</section>
</body>
</html>
「ejs」ファイルは、必ず「views」フォルダの直下に作成します。
ログイン画面へアクセスするためapp.jsを編集
ログイン画面にアクセスできるよう、既存の「app.js」ファイルのコードを一部修正します。
//app.js
const express = require('express');
const app = express();
//修正
app.get('/login', (req, res) => {
res.render('login.ejs');
});
app.listen(3008);
CSSファイルの作成
CSSで見た目を整えていきます。
CSSフォルダや、JS、img用フォルダは、「public」フォルダの直下に作成する必要があります。
publicフォルダの作成
↓最初にpublicフォルダを作成します。

↓publicフォルダの直下にcssフォルダを作成します。

↓ログイン画面のheader部分にうさぎのアイコンを挿入するため、「images」フォルダも作成しました。

publicフォルダ読込みのためapp.jsを編集
作成したpublicフォルダを読み込んでもらえるよう、既存の「app.js」にコードを追記する必要があります。
↓5行目のハイライトされた箇所を追加します。
//app.js
const express = require('express');
const app = express();
app.use(express.static('public'));
reset.cssの作成
cssフォルダ内に、「reset.css」ファイルを作成します。
「同じコードを記載しているのに、各ブラウザで見え方が違う」という事態を避けるために、スタイルをリセットするためのものです。
今回は、normalize.cssを利用しました。
normalize.cssは、ブラウザ間での見え方を統一するためだけのCSSです。
(destyle.cssと異なり、各要素の大きさや、余白等はデフォルトの設定が生かされたままです)
style.scssの作成
cssフォルダ内に「style.scss」ファイルを作成し、ログイン画面のスタイルを成形していきます。
//style.scss
$base-text-color:#604e4e;
$base-bg-color:#f4f0e6;
$base-link-color:#8181fa;
$pink:#F38181;
$base-font-family:'M PLUS Rounded 1c',sans-serif;
$form-input:3rem;
$base-font-size:1.4rem;
$icon-size:2.4rem;
$header-height:6rem;
$button-color:#9dd3a8;
// common
html {
font-size:62.5%;
}
body {
color:$base-text-color;
font-family:$base-font-family;
}
a {
color:$base-link-color;
text-decoration:none;
font-size:$base-font-size;
}
.container {
width:95%;
margin:0auto;
}
h1 {
font-size:2rem;
text-align:center;
}
button {
display:block;
border-radius:.4rem;
border:none;
cursor:pointer;
transition:.5s;
}
textarea,
input[type="password"],
input[type="email"],
input[type="text"] {
-webkit-appearance:none;
-moz-appearance:none;
-ms-appearance:none;
appearance:none;
-webkit-border-radius:.4rem;
-moz-border-radius:0.4rem;
-ms-border-radius:.4rem;
border-radius:.4rem;
border:0.1remsolid#d9d9f3;
outline:0;
margin:0;
padding:08px;
box-sizing:border-box;
}
textarea:focus,
input[type="password"]:focus,
input[type="email"]:focus,
input[type="text"]:focus{
border:1pxsolid$base-link-color;
}
section {
margin-top:$header-height;
}
header {
height:$header-height;
position:fixed;
width:100%;
z-index:10;
top:0;
background-color:#fff;
&img {
width:3.5rem;
height:3.5rem;
background-color:$base-bg-color;
margin-left:1.6rem;
border-radius:50%;
}
h1 {
width:100%;
display:block;
}
i {
font-size:$icon-size;
margin-right:1.6rem;
cursor:pointer;
&.hide {
display:none;
}
}
}
.header__container {
display:flex;
justify-content:space-between;
align-items:center;
height:$header-height;
width:100%;
}
.login,
.register {
margin:10rem0;
.login__form,
.register__form {
width:80%;
margin:0auto;
&button {
width:50%;
height:$form-input;
margin:0auto;
font-size:$base-font-size;
padding:0;
background-color:$button-color;
color:#fff;
&:hover {
opacity:.8;
}
}
}
.login__form-container,
.register__form-container {
margin-bottom:2.5rem;
&input {
width:100%;
height:$form-input;
}
}
p {
font-size:$base-font-size;
text-align:center;
}
}
// error-message
.errors {
display:block;
list-style:none;
border:2pxsolid$pink;
border-radius:.4rem;
margin:0auto1rem;
padding-inline-start:0.4rem;
&>li {
line-height:1.4rem;
padding:.4rem;
}
}
CSSの記述がとっても楽になるSCSSの書き方は、お馴染みのプロゲート様から勉強できます。
https://prog-8.com/courses/sass
ログイン画面の作成が完了したので、この状態でブラウザを確認してみます。
↓Terminalに下記コードを入力し、サーバーに接続します。
//Terminal
node app.js
↓ブラウザで「http://localhost:3008/login」にアクセスし、画面を確認します。

パーツ化
ejsでは、headやheader内のコード等、他のファイルにも使い回す必要のあるコードはパーツ化することが可能です。
パーツ化することによって、後々コードに変更が出た際に1ファイルだけを修正すれば良いだけになり、全ファイルのコードを書き直す手間や修正漏れによるミスを防ぐことができます。
headのパーツ化
「login.ejs」のhead内に記載したコードをパーツ化します。
↓「login.ejs」のheadのタグ内のコードを切り取ります

↓「head.ejs」ファイルを新規作成し、切り取ったコードを貼り付けます

↓「login.ejs」ファイルに戻り、空白になったheadタグ内に下記コードを記載します。
//login.ejs
<!DOCTYPE html>
<html lang="ja">
<head>
<%- include('head'); %>
</head>
Headerのパーツ化
「login.ejs」ファイル内のheader部も同様にパーツ化していきます。
↓「login.ejs」のheaderタブ内のコードを切り取ります

↓「form-header.ejs」ファイルを新規作成し、切り取ったコードを貼り付けます

↓「login.ejs」ファイルに戻り、空白になったheaderタグ内に下記コードを記載します。
//login.ejs
<header>
<%- include('form-header'); %>
</header>
パーツ化が完了したので、この状態でブラウザを確認してみます。
↓Terminalに下記コードを入力し、サーバーを再接続します。
//Terminal
node app.js
↓ブラウザで画面を確認し、パーツ化前の画面と同じかどうかを確認します。

これでフロント部分のログイン画面が完成しました!
まとめ
今回は、ログイン画面のhtml・CSSの作成とパーツ化を行いました。
次回はこの画面のバックサイドの部分を作成し、ログイン機能を実装していきます。