HTML・CSS・JavaScript の違い — Web サーバー層が描いているもの

この記事は、プログラミングやバイブコーディングをする上で最低限身につけたほうがよい IT の実践的な知識を 1 から身につける「IT 基礎知識講座の一部」です。
HTML が画面に何があるか、CSS がどう見えるか、JavaScript が操作にどう反応するかを決めます。3 つが 1 つの画面になるまでを図解で確かめます。

この記事は、Web サーバー層を作る HTML・CSS・JavaScript の 3 つを扱います。

書く場所が index.html・style.css・script.js に分かれているのは、決めることが違うからです。

3 つのファイルが決めること
index.htmlstyle.cssscript.js何があるか部品の種類と順番どう見えるか色・大きさ・配置操作にどう反応するか「予約する」ボタンを置く青い角丸のボタンにする押されたら文を出す1 番目に届く2 番目に取りに行く2 番目に取りに行く
左がファイル、中が決めること、右が「予約する」ボタンでの例。いちばん右が、ブラウザがそれを読む順番です。3 つの行は同じボタン 1 つについて別々のことを決めています。

3 つのファイルは、まとめて届くわけではありません。

3 つのファイルはどれもブラウザが受け取り、読み込むのも実行するのもブラウザです。

HTML は、画面に何があるかを部品の種類と順番で書く

HTML(HyperText Markup Language。画面に何があるかを、部品の種類と順番で書く言語)は、index.html に書きます。

画面の部品 1 つ 1 つが要素(element)、要素に付ける名前や設定が属性(attribute)、要素の始まりと終わりを示す記号がタグ(tag)です。

予約フォームの index.html は、この 3 つでできています。

<form>
  <input type="date">
  <button type="button" id="reserve" class="action">予約する</button>
  <p id="message"></p>
</form>

id と class は、あとで CSS と JavaScript が部品を選ぶための名前です。

id は 1 ページに 1 つだけ、class は何個の要素に付けてもかまいません。

要素は入れ子にでき、button 要素は form 要素の中に入っています。

index.html の中の入れ子
html 要素 — ページ全体
head 要素 — 画面には出ない
  • ページのタイトル
  • style.css と script.js のファイル名
body 要素 — 画面に出る
  • 見出し「予約」
form 要素 — 予約フォーム
  • input 要素 — 日付の入力欄
  • button 要素 — 「予約する」ボタン
  • p 要素 — 中身が空の場所
外枠がページ全体の html 要素。head 要素は画面に出ない情報で、body 要素の中に書いたものだけが画面に出ます。

head 要素にはページのタイトルと使うファイルの名前を書き、画面に出るのは body 要素の中だけです。

index.html は何があるかだけを書く

index.html に書くのは、画面に何があるかだけです。

部品の種類をタグで示して中身と並ぶ順番を書き、開始タグに付けた id と class は、あとで別のファイルがその部品を選ぶための名前です。

CSS は、要素がどう見えるかを別のファイルにまとめて書く

CSS(Cascading Style Sheets。HTML の要素をどう見せるかを、色・大きさ・配置の決まりとして書く言語)は、見た目だけを決めます。

style.css は次の形です。

.action {
  background-color: #2a6f97;
  color: white;
  border-radius: 8px;
}

先頭の .action が、どの要素に適用するかの指定です。

class が action の要素すべてに、波かっこの中の 3 行が適用されます。

style.css の中には、こうした決まりをいくつも並べます。

style.css の中に並ぶ決まり
style.css
body の決まり
  • ページ全体の背景色
  • 文字の大きさ
.action の決まり — class が action の要素
  • 背景色 #2a6f97
  • 文字の色 white
  • 角の丸み 8px
#message の決まり — id が message の要素
  • 文字の色
  • 上の余白
1 つのファイルの中に、選ぶ相手ごとの決まりが並びます。それぞれの波かっこの中が、その相手に適用される見た目です。

同じ画面にボタンが 3 つあるとき、色を変えるのに直す場所は、見た目をどこに書いたかで変わります。

見た目を書いた場所色を変えるとき直す数3 つのボタンの結果
各 button の style 属性3 か所を直す1 つ直し忘れると色がそろわない
style.css の .action1 か所を直す3 つとも同じ色に変わる
style.css の #reserve1 か所を直すid を付けた 1 つだけ変わる

見た目を要素の style 属性に書く方法もありますが、要素の数だけ同じ変更を繰り返します。

style.css にまとめておけば、直すのは 1 か所です。

style.css は名前で選んで見た目を決める

style.css がしているのは、どの部品を、どう見せるかを並べることだけです。

どの部品かは index.html に付けた class や id の名前で選び、部品を増やしたり、文字を書き換えたりはしません。

JavaScript は、操作に反応して画面を書き換える

HTML と CSS だけの画面は、表示されたあとに内容が変わりません。

ボタンが押されたときに文字を出すのが、 Web サーバー層での JavaScript の担当です。

script.js は次の形です。

const button = document.querySelector("#reserve");
button.addEventListener("click", () => {
  document.querySelector("#message").textContent = "予約を送りました";
});

1 行目の document は、ブラウザが読み込んだページ全体を指す名前です。

続く #reserve が id が reserve の要素を選ぶ書き方で、名前の前の記号が class か id かを表します。

3 つのファイルは、index.html に付けた名前でつながっています。

index.html に付けた名前と、選ぶときの書き方
===class="action".actionstyle.css の見た目の決まりid="reserve"#reservescript.js のクリックの登録id="message"#messagescript.js の書き換える相手
二重線で結んだ 2 つは、同じ名前です。左が index.html に書いた名前、中が選ぶときの書き方、右がその書き方を使っている場所。

2 行目の addEventListener が、click のときに行う処理の登録です。

後ろの () => { } は、押されたときに動かす処理を波かっこの中に書く形です。

このクリックのように、利用者の操作をブラウザがプログラムに知らせる出来事がイベント(event)です。

イベントの種類は、クリックだけではありません。

どの操作でも、気づくのはブラウザ
ボタンを押す入力欄に文字を入れるフォームを送るブラウザが気づく登録しておいた処理が動くclickinputsubmit
左の 3 つから中央へ矢印が集まります。矢印の文字がイベントの名前で、script.js の処理はそのあとに呼び出される側です。

どのイベントのときに何をするかを、先に登録しておきます。

マウスを乗せたときの色の変化は CSS で、フォームの送信はブラウザが行います。

script.js も利用者のブラウザへ届いて中身を読めるので、他人に見せてはいけない値は書きません。

script.js は呼ばれてから動く

script.js は、押されたらこれをする、と先に登録しておくだけです。

押されたときにブラウザが呼び出した処理が画面の部品を書き換えますが、index.html の中身は変わらず、また script.js は利用者のブラウザに届くので、他人に見せてはいけない値は書きません。

ブラウザは HTML から DOM を作り、CSS を適用して描き、JavaScript で書き換える

ブラウザは HTML の文字をそのまま出すのではなく、要素の入れ子をデータとして組み立てます。

これがDOM(Document Object Model。要素を入れ子のまま並べたデータ)です。

画面に見えているのは、この DOM を描いたものです。

script.js が登録した処理も、DOM と同じブラウザのメモリの中で待っています。

ブラウザのメモリにできた DOM
利用者のブラウザのメモリ
DOM — index.html から作った要素の入れ子
body 要素 — 画面に出る部分
  • button 要素 — 中身は「予約する」
  • p 要素 — 中身は空
  • どちらも id と class を持ったまま
script.js が登録した処理
  • click のとき、p の中身を書き換える
index.html と同じ入れ子が、ブラウザのメモリの中に組み立てられています。script.js が登録した処理も、同じメモリの中で待っています。

3 つのファイルは別々に届き、ブラウザの中で 1 つの DOM にまとまります。

この DOM を描いたものが、画面に見えているページです。

DOM に CSS を適用し、位置と大きさを計算して描くことがレンダリング(rendering)です。

届くたび、押すたびに、ブラウザは DOM をどう扱うか
index.htmlが届くstyle.cssが届くボタンが押される読み込み直す要素の入れ子からDOM を作るDOM に決まりを適用して描くscript.js がDOM を書き換える届いた HTML からDOM を作り直すまだ何も描かれない青いボタンが出るp に文が出るp は空に戻る
上から時間の順です。左が起きたこと、真ん中がそのときブラウザがすること、右がそのあとの画面。いちばん下で、書き換えた分は消えます。

書き換わるのは、ブラウザのメモリの中の DOM だけです。

届いた index.html も、公開サーバーに置いてあるファイルも、そのままです。

残したい内容は、アプリケーションサーバー層に送ってデータベース層に保存します。

JavaScript の書き方と、ブラウザで動かす練習は JavaScript 入門講座 で扱います。

画面は DOM を描いたもの

ブラウザは、届いた index.html から部品の入れ子を組み立て、style.css の決まりで色や大きさを付けて描きます。

script.js が書き換えるのはこの組み立てたほうなので、読み込み直すと届いたファイルから組み立て直され、書き換えた内容は消えます。

QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1予約ボタンの背景の色を変えたいとき、直すファイルはどれですか。

Q2CSS と JavaScript は、HTML の要素を何で選びますか。

Q3JavaScript がボタンの文字を書き換えたとき、変わるのはどれですか。