プログラミング

JavaScript超入門⑧ カウンターアプリを完成させよう

HTML、CSS、変数、関数、if文、DOM、クリックイベントを組み合わせ、数字を増減できるWebアプリを作ります。

最終回では、ボタンで数字を増減できるカウンターアプリを作ります。

完成したコード

<!doctype html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>カウンター</title>
    <style>
      body {
        font-family: sans-serif;
        text-align: center;
        padding: 40px;
      }

      #value {
        font-size: 48px;
      }

      button {
        padding: 10px 18px;
        margin: 4px;
      }
    </style>
  </head>
  <body>
    <h1>カウンター</h1>
    <p id="value">0</p>

    <button id="decrease">-1</button>
    <button id="reset">リセット</button>
    <button id="increase">+1</button>

    <script>
      let count = 0;
      const value = document.querySelector("#value");

      function updateDisplay() {
        value.textContent = count;

        if (count < 0) {
          value.style.color = "red";
        } else {
          value.style.color = "black";
        }
      }

      document.querySelector("#increase")
        .addEventListener("click", () => {
          count++;
          updateDisplay();
        });

      document.querySelector("#decrease")
        .addEventListener("click", () => {
          count--;
          updateDisplay();
        });

      document.querySelector("#reset")
        .addEventListener("click", () => {
          count = 0;
          updateDisplay();
        });
    </script>
  </body>
</html>

状態を変数へ保存する

let count = 0;

現在の数字をcountへ保存します。ボタンを押すたびに変わるため、constではなくletを使います。

表示を関数へ分ける

updateDisplay関数は、countの値を画面へ反映します。

countが0より小さい場合は、if文で文字色を赤へ変えます。

ボタンごとに処理を登録する

3個のボタンへ、それぞれクリックイベントを登録しています。

  • increaseはcountを1増やす
  • decreaseはcountを1減らす
  • resetはcountを0へ戻す

値を変えた後は、必ずupdateDisplayを呼びます。

改造してみよう

  1. +5と-5のボタンを追加する
  2. 10以上になったら緑色にする
  3. 最大値と最小値を決める
  4. ボタンを押した回数を別に表示する

模範解答

最大値を10、最小値を-10にした例です。元のHTMLのbodyを、次の内容へ置き換えます。

<body>
  <h1>カウンター</h1>
  <p id="value">0</p>
  <p>操作回数: <span id="clickCount">0</span></p>

  <button data-change="-5">-5</button>
  <button data-change="-1">-1</button>
  <button id="reset">リセット</button>
  <button data-change="1">+1</button>
  <button data-change="5">+5</button>

  <script>
    const MIN = -10;
    const MAX = 10;
    let count = 0;
    let clicks = 0;

    const value = document.querySelector("#value");
    const clickCount = document.querySelector("#clickCount");

    function updateDisplay() {
      value.textContent = count;
      clickCount.textContent = clicks;

      if (count >= 10) {
        value.style.color = "green";
      } else if (count < 0) {
        value.style.color = "red";
      } else {
        value.style.color = "black";
      }
    }

    document.querySelectorAll("[data-change]").forEach((button) => {
      button.addEventListener("click", () => {
        const change = Number(button.dataset.change);
        count = Math.max(MIN, Math.min(MAX, count + change));
        clicks++;
        updateDisplay();
      });
    });

    document.querySelector("#reset").addEventListener("click", () => {
      count = 0;
      clicks++;
      updateDisplay();
    });
  </script>
</body>

解説

data-changeへ各ボタンの増減量を保存し、同じ処理を5つのボタンで再利用しています。Math.minで最大値を、Math.maxで最小値を超えないようにしています。clicksはどの操作ボタンを押しても1増え、updateDisplayで画面へ反映されます。

まとめ

  • 変数に現在の状態を保存できます。
  • DOMとイベントで、利用者の操作に反応できます。
  • 関数へ表示処理をまとめると、同じ処理を再利用できます。

前の記事:JavaScript超入門⑦ DOMとクリックイベントを使おう

最初から復習する:JavaScript超入門① 最初のプログラムを書いて動かそう

JavaScriptシリーズの記事をまとめて見る

← 記事一覧へ戻る