完成するとこんなページができます
今日覚えるのは細かい暗記より、 「Webページは自分で作れる」という感覚です。
HTML と CSS だけでも、 「見る人に伝わる1枚のページ」 は十分作れます。
ブラウザで Web ページを開くと、裏側では 3種類のファイル形式 が読み込まれています。
この3つを書けば、Web ページが作れます。
HTMLだけだと 骨組みだけの家。 CSSを足すと きれいな家 になる。 JSを足すと 便利な家 になる。
→ 「何があるか」を定義する → 例えば: 自己紹介、作品紹介、お知らせ一覧
→ 「どう見えるか」を決める → 例えば: かわいい、見やすい、アプリっぽい
→ 「何かが起きたら、何かをする」
今日は HTML と CSS をメインに使い、時間があれば最後に少しだけ JavaScript を体験します
今日は LiveCodes というWebサービスを使います。
コードを書き換えると、自動で右側の表示が更新されます。
画面上部にある「HTML」「CSS」を押すと切り替えられます。
HTML を開くと、こんなコードが入っています。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" href="styles.css" /> <title>自己紹介ページ</title> </head> <body> <!-- ヘッダーのHTML --> <div class="header"> <h1>田中 はなこ</h1> <p>Web開発をはじめたばかりの大学生です!</p> </div> <!-- 省略 --> </body> </html>
最初は おまじない だと思ってOKです。 大事なのは <body>と</body>の間に書く ということ。
<body>
</body>
<!DOCTYPE html>
<head>
<link>
ピンクの背景に、 白い文字で 名前 と 一言メッセージ を表示するヘッダーを作ります。
HTMLは タグ という目印を使って書きます。
タグをつけることで、ブラウザに 「これは見出しだよ」「これは文章だよ」 と伝えます。
<h1>田中 はなこ</h1>
<h1>
</h1>
/
タグで囲まれた部分が、そのタグの種類に応じて表示される。
<p>
<div>
<div> は 他のタグをまとめるための入れ物 として使います。
なぜまとめるの? → まとめることで CSSをグループ単位で適用 できる。 例: ヘッダー全体に背景色をつけたい → <h1> と <p> を <div> でまとめて、その <div> に背景色を指定する。
HTML の <body> の下に次のような記述があります。
<!-- ヘッダーのHTML --> <div class="header"> <h1>田中 はなこ</h1> <p>Web開発をはじめたばかりの大学生です!</p> </div>
名前や説明文を変更して画面が更新されることを確認しましょう。
次に見た目を整えます。
セレクタ { プロパティ: 値; }
body { ← 「body に対して」 color: pink; ← 「文字色を pink にする」 }
<div class="header">
↑ この class="header" が 名札 の役割。
class="header"
.header { background-color: pink; }
↑ CSSでは .header と書くと、class="header" の要素に適用される。
.header
class は名札、CSSはその名札を見てスタイルを適用する。
CSS に追加:
/* ヘッダーのCSS */ .header { background-color: pink; /* 背景色(ピンク) */ text-align: center; /* 文字を中央揃え */ padding: 40px 20px; /* 内側の余白(上下40px、左右20px) */ border-radius: 0 0 20px 20px; /* 角を丸くする(左上・右上・右下・左下) */ }
px = ピクセル。画面上の点の数で大きさを指定する単位。現実でいうと「cm」や「m」のようなもの。
px
bodyの余白をなくすために margin: 0; padding: 0; と書きましたが、余白には2種類 あります
margin: 0; padding: 0;
デフォルトでブラウザは body に余白をつけていますが、今回は自分で余白をコントロールしたいので、両方とも0にしています。
body
要素の内側の余白が padding 内側に余白を作ることでテキストが枠にくっつかず、見やすくなります。
要素の外側の余白が margin 外側に余白を作ることで、要素同士がくっつかず、見やすくなります。
/* 値が1つ → 上下左右すべて同じ */ padding: 24px; /* 値が2つ → 上下 / 左右 */ padding: 40px 20px; /* ↑上下 ↑左右 */ /* 値が4つ → 上 / 右 / 下 / 左 */ padding: 10px 15px 20px 25px; /* ↑上 ↑右 ↑下 ↑左 */
あとで、padding と margin を使う場面がたくさん出てくるので、違いを意識してみてください。
padding
margin
/* ヘッダーの文字のCSS */ .header h1 { margin: 0; color: white; } .header p { margin: 8px 0 0 0; /* 上 / 右 / 下 / 左 */ color: white; }
.header h1 = 「header の中にある h1」という意味。 これで ヘッダーの中の見出しだけ にスタイルを当てられる。
.header h1
ブラウザのプレビューを確認してみましょう。
うまく表示されない場合は、タグの閉じ忘れがないか確認してください。
丸い写真と自己紹介テキストを 横並び で表示するカードを作ります。
<img>
画像を表示するタグ。終了タグがない 特殊なタグです。
<img src="画像のURL" alt="説明テキスト">
src
alt
<!-- プロフィールのHTML --> と書かれた部分の下側にコードを4行追加しましょう。
<!-- プロフィールのHTML -->
<div class="container"> <div class="card"> <div class="profile"> <img src="https://api.dicebear.com/7.x/thumbs/svg" alt="プロフィール写真" class="profile-img" > <!-- プロフィールのHTML --> <div class="profile-text"> <p>こんにちは!田中はなこです。</p> <p>東京に住んでいて、カフェ巡りと猫が好きです。最近プログラミングを始めました!</p> </div> </div> </div> </div>
/* カードのCSS */ .card { background-color: white; /* 白い背景 */ border-radius: 16px; /* 角を丸く */ padding: 24px; /* 内側の余白 */ margin-top: 20px; /* カード同士の間隔 */ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08); /* 影 */ }
写真とテキストを 横に並べたい 時はdisplay: flex を使います。
display: flex
/* 横並びにする: Flexbox */ .profile { display: flex; align-items: center; gap: 20px; }
display: flex → 子要素が横に並ぶ align-items: center → 縦方向を真ん中に gap: 20px → 要素同士の間隔
align-items: center
gap: 20px
/* 写真を丸くする */ .profile-img { width: 100px; height: 100px; border-radius: 50%; /* 50%で正円 */ object-fit: cover; /* 枠に合わせてトリミング */ border: 3px solid pink; /* ピンクの枠線 */ }
border-radius: 50% で正方形が 正円 になる。よく使うテクニック。
border-radius: 50%
/* テキストのCSS */ .profile-text p { margin: 4px 0; font-size: 15px; line-height: 1.6; }
line-height: 1.6 = 行間を1.6倍にする。 文章が読みやすくなります。
line-height: 1.6
今のままだと画面全体にカードが広がってしまうので、CSSに追加しましょう。
/* カード全体の幅を制限する */ .container { max-width: 600px; /* 横幅を制限 */ margin: 0 auto; /* 中央寄せ */ padding: 20px; /* 内側の余白 */ }
ヘッダー + プロフィールカードが表示されていればOK!
LiveCodes は ブラウザのタブを閉じる / 別のPCで開く と、書いたコードがそのままでは引き継がれないことがあります。
時間がかかりそう・別の日に続きをやりたい場合は、ここまでの作業を ZIPファイル として手元に保存しておくと安心です。
このスライドは「保存しておきたい時に見返す」用のメモです。 続けて進める場合は次の Chapter 5 へ進んでOK。
ダウンロードフォルダに ZIP ファイルが保存されます。 名前を 自己紹介ページ.zip のように分かりやすく変えておくと安心です。
自己紹介ページ.zip
次に LiveCodes を開いた時に ZIP ファイルを読み込むと続きから始められます。
好きなものを 箇条書き で表示するリストを作ります。
<h2>
<ul>
<li>
<ul> ← リストの開始 <li>項目1</li> <li>項目2</li> <li>項目3</li> </ul> ← リストの終了
HTML で、<!-- === 好きなものリスト === --> と書かれた場所を次のように穴埋めしましょう。
<!-- === 好きなものリスト === -->
<!-- === 好きなものリスト === --> <div class="card"> <h2>好きなもの</h2> <!-- リストのHTML --> <ul> <li>カフェ巡り</li> <li>猫</li> <li>ラーメン</li> </ul> </div>
/* 見出しのCSS */ .card h2 { font-size: 20px; margin: 0 0 12px; color: hotpink; }
.card h2 = 「card の中にある h2」にだけ適用。 すべての h2 ではなく、カード内の見出しだけ をピンクにします。
.card h2
ヘッダー + プロフィール + 好きなものリストが表示されていればOK!
ボタン風の リンク を横並びで表示します。
<!-- リンクのHTML -->
<!-- リンク --> <div class="card"> <h2>リンク</h2> <div class="links"> <a target="_blank" href="https://jig.jp" class="link">jig.jp</a> <!-- リンクのHTML --> <a target="_blank" href="https://www.tsuyama-ct.ac.jp/" class="link">津山高専</a> </div> </div>
<a>
target
"_blank"
href
https://jig.jp
/* リンクのCSS */ .links { display: flex; gap: 10px; margin-top: 8px; } .link { display: inline-block; padding: 10px 20px; background-color: pink; color: white; text-decoration: none; border-radius: 25px; font-size: 14px; font-weight: bold; }
text-decoration: none → リンクの下線を消す
text-decoration: none
ブラウザはデフォルトで <a> タグに青い文字 + 下線をつけます。 text-decoration: none と color: white で、それをリセットしてボタン風に見せています。
color: white
/* ホバー効果をつける */ .link:hover { background-color: hotpink; }
:hover
マウスカーソルを 要素の上に乗せた時 に適用されるスタイル。
→ ボタンの上にマウスを乗せると、色が少し濃いピンクに変わる!
ここまでで自己紹介ページの土台ができました
background-color
color
font-size
font-weight
line-height
text-decoration
width
height
max-width
border
border-radius
box-shadow
display
align-items
gap
flex-wrap
今回作成したWebサイトを使用して自己紹介をしてみましょう!
例えば... 「ヘッダーの背景色を青色にして、かっこいい雰囲気にしました!」 「プロフィールカードの写真を四角にして、クールな印象にしました!」 「カードを1つ追加して、好きな本を紹介しました!」
ページの配色を 明るい 暗い に切り替える機能。
YouTube、X、LINE、GitHub… ほぼすべての有名サービスが対応しています。
これまでは pink や white のような 色の名前 で色を指定してきました。
pink
white
ただし色名は約140色しかなく、ダークモード用の暗い色 は名前で表現できません。
→ より自由に色を指定するために カラーコード を使います。
#
background-color: #1a1a2e; color: #ffffff;
# の後に 赤(R)・緑(G)・青(B) を2桁ずつ指定する。 色名より細かい色が指定できる。
6桁は 赤・緑・青 の順で、数字が大きいほどその色が強い。
#ff0000
#0000ff
#000000
#ffffff
カラーコードは覚えなくてOK。 ネットで 「カラーピッカー」 と検索すると好きな色を選べます。
body.dark { background-color: #1a1a2e; color: #e0e0e0; } body.dark .header { background-color: #2d2d5e; } body.dark .card { background-color: #16213e; box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3); } body.dark .card h2 { color: #ffa0c4; } body.dark .link { background-color: #2d2d5e; color: #e0e0e0; } body.dark .link:hover { background-color: #3d3d7e; }
body.dark
body.dark { ... }
これは「body に dark というクラスが ついている時だけ 適用する」という意味。
dark
<body> → body.dark のスタイルは適用されない <body class="dark"> → body.dark のスタイルが適用される
JavaScript で このクラスをつけたり外したり することで、切り替えを実現します。
HTML の container の中、一番下に追加:
<button class="dark-mode-btn" id="darkModeBtn"> ダークモード </button>
<button>
id="darkModeBtn"
class
id
class="card"
.card { }
#darkModeBtn { }
.dark-mode-btn { display: block; margin: 24px auto 40px; padding: 10px 24px; border: 2px solid #ccc; border-radius: 25px; background: none; font-size: 14px; cursor: pointer; color: inherit; transition: border-color 0.3s; } .dark-mode-btn:hover { border-color: #ff7eb3; }
script.js に追加:
script.js
const darkModeBtn = document.getElementById("darkModeBtn"); darkModeBtn.addEventListener("click", function() { document.body.classList.toggle("dark"); if (document.body.classList.contains("dark")) { darkModeBtn.textContent = " ライトモード"; } else { darkModeBtn.textContent = " ダークモード"; } });
const darkModeBtn = document.getElementById("darkModeBtn");
const darkModeBtn
darkModeBtn
document.getElementById(...)
"darkModeBtn"
→ 「ページから darkModeBtn ボタンを見つけて、darkModeBtn に入れておく」
darkModeBtn.addEventListener("click", function() { // ここに「クリックされた時にやること」を書く });
addEventListener
"click"
function() { ... }
→ 「darkModeBtn がクリックされたら、この処理を実行する」
document.body.classList.toggle("dark");
document.body
.classList
.toggle("dark")
→ 「body の dark クラスを ON/OFF する」
ボタンをクリックしてみましょう!
ダークモードが終わった人は好きなものに挑戦! 手順とヒントを読みながら自分のペースで進めてください。 答えは各課題の下のトグルを開くと見られます。
完成イメージ: プロフィールカードに ♡ ボタン。押すたびに数字が 1 ずつ増える。
<button id="likeBtn">♡ 0 いいね</button>
let likeCount = 0
getElementById
likeBtn.textContent = "♡ " + likeCount + " いいね"
解答例: examples/advanced/b-like-button.html
examples/advanced/b-like-button.html
完成イメージ: ヘッダーに「このページは N 回目の訪問です」と表示。ブラウザを閉じても回数が残る。
<div id="visitCount"></div>
localStorage.getItem("visitCount")
localStorage.setItem()
localStorage
null
0
Number()
解答例: examples/advanced/c-visit-counter.html
examples/advanced/c-visit-counter.html
完成イメージ: ヘッダーに「 14:32:05」のように現在時刻が表示され、毎秒更新される。
<div id="clock"></div>
new Date()
setInterval(関数, 1000)
now.getHours()
now.getMinutes()
now.getSeconds()
String(9).padStart(2, "0")
"09"
解答例: examples/advanced/d-clock.html
examples/advanced/d-clock.html
完成イメージ: 「好きなもの」カードに2つのタブ。クリックで「好きなもの」と「苦手なもの」の表示が切り替わる。
.tab-content { display: none }
.tab-content.active { display: block }
data-tab="likes"
this.getAttribute("data-tab")
#tab-likes
#tab-dislikes
解答例: examples/advanced/e-tabs.html
examples/advanced/e-tabs.html
完成イメージ: フォトギャラリーに画像1枚 + ← → ボタン。ボタンで画像が切り替わり「1 / 3」と表示。最後の次は最初に戻る。
<img id="slideshowImg">
let currentPhoto = 0
const photos = ["url1", "url2", "url3"]
photos[currentPhoto]
currentPhoto = (currentPhoto + 1) % photos.length
解答例: examples/advanced/f-slideshow.html
examples/advanced/f-slideshow.html
完成イメージ: マウスカーソルがピンクの丸に変わる。動かすとキラキラしたパーティクルが軌跡に残って消える。
<div class="custom-cursor" id="customCursor"></div>
position: fixed
pointer-events: none
mousemove
e.clientX
e.clientY
document.createElement("div")
document.body.appendChild()
setTimeout(function() { particle.remove(); }, 600)
@keyframes
解答例: examples/advanced/g-cursor.html
examples/advanced/g-cursor.html
完成イメージ: プロフィール写真をクリック → 画面全体が暗くなり写真が拡大表示。暗い部分 or × ボタンで閉じる。
display: none
.show
position: fixed; top: 0; left: 0; width: 100%; height: 100%
rgba(0, 0, 0, 0.7)
if (e.target === modal)
解答例: examples/advanced/h-modal.html
examples/advanced/h-modal.html
完成イメージ: 好きなものリストの項目をドラッグ&ドロップで順番変更。ドラッグ中は半透明、ドロップ先はハイライト。
id="likesList"
draggable="true"
.dragging
.drag-over
dragstart
dragend
dragover
drop
e.preventDefault()
insertBefore()
解答例: examples/advanced/i-drag.html
examples/advanced/i-drag.html
完成イメージ: 「私の好きな食べ物は?」などの3択クイズ。正解は緑、不正解は赤。全3問、スコア表示付き。
[{ question, options, answer }, ...]
showQuiz()
document.createElement("button")
setAttribute("data-index", i)
let quizAnswered = false
解答例: examples/advanced/j-quiz.html
examples/advanced/j-quiz.html
完成イメージ: これまで作ったページを、モダンなページに変身させる。
height: 100vh
#0a0a0a
#f5f5f5
Inter
IntersectionObserver
transition
background: url(...) center/cover no-repeat
linear-gradient
transform: translateX(-60px)
translateX(0)
解答例: examples/demo-modern.html
examples/demo-modern.html
h1
h2
p
div
img
ul
li
a
rgba()
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08); /* 横 縦 ぼかし 色 */
2px
12px
rgba(0, 0, 0, 0.08)
rgba(赤, 緑, 青, 透明度)
1
border: 3px solid pink; /* 太さ 種類 色 */
3つの値をスペース区切りで書く。線の種類は solid(実線)、dashed(破線)、dotted(点線)、none(なし)。
solid
dashed
dotted
none
ブラウザの 開発者ツール で、要素の余白を視覚的に確認できます。
F12 でDevToolsを開く → Elements → 右下の Computed タブ
<h6>
<a href="URL">
<img src="URL" alt="説明">
<ol>
参考: MDN HTML要素リファレンス
text-align
center
flex
block
参考: MDN CSSリファレンス