<!DOCTYPE html>
<html>
<head>
  <title>カウントダウンタイマー</title>
  <style>
    body {
      background-color: #f1f7fb;
      font-family: Arial, sans-serif;
    }
    
    h1 {
      color: #333;
      text-align: center;
    }
    
    .container {
      max-width: 400px;
      margin: 0 auto;
      padding: 20px;
      background-color: #fff;
      border-radius: 5px;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    }
    
    label {
      display: block;
      font-weight: bold;
      margin-bottom: 5px;
    }
    
    input[type="range"] {
      width: 100%;
    }
    
    button {
      display: block;
      width: 100%;
      padding: 10px;
      margin-top: 10px;
      font-weight: bold;
      text-align: center;
      color: #fff;
      background-color: #5dbcd2;
      border: none;
      border-radius: 5px;
      cursor: pointer;
    }
    
    button:hover {
      background-color: #4ba2b6;
    }
    
    #countdown {
      text-align: center;
      font-size: 24px;
      margin-top: 20px;
    }
  </style>
  <script>
    var timer;
    var totalTime;
    var paused = true;
    
    function settingCountdown() {
      if (paused) {
        var hours = parseInt(document.getElementById("hoursInput").value);
        var minutes = parseInt(document.getElementById("minutesInput").value);
        totalTime = hours * 3600 + minutes * 60; // 入力された時間と分数を秒に変換
      
        // タイマーが既に実行中の場合は停止
        if (timer) {
          clearInterval(timer);
        }
      
        timer = setInterval(updateCountdown, 1000); // 1秒ごとに更新
      }
    }
    
    function updateCountdown() {
      var hours = Math.floor(totalTime / 3600);
      var minutes = Math.floor((totalTime % 3600) / 60);
      var seconds = totalTime % 60;
        
      // タイマー表示を更新
      document.getElementById("countdown").innerHTML = hours + "時間 " + minutes + "分 " + seconds + "秒";
      if (!paused) {
        
        // 残り時間を1秒減らす
        totalTime--;
        
        // 残り時間が0になったらタイマーを停止
        if (totalTime < 0) {
          clearInterval(timer);
          alert("時間が経過しました!");
        }
      }
    }
    
    function pauseCountdown() {
      paused = true;
    }
    
    function resumeCountdown() {
      paused = false;
    }
  </script>
</head>
<body>
  <div class="container">
    <h1>カウントダウンタイマー</h1>
    <label>時間:</label>
    <input type="range" id="hoursInput" min="0" max="12" value="0" list="tlist1">
    <datalist id="tlist1">
      <option value="3"></option>
      <option value="6"></option>
      <option value="9"></option>
    </datalist>
    <span id="hoursValue">0</span> 時間
    <br>
    <label>分数:</label>
    <input type="range" id="minutesInput" min="0" max="59" value="0" list="tlist2">
    <datalist id="tlist2">
      <option value="10"></option>
      <option value="20"></option>
      <option value="30"></option>
      <option value="40"></option>
      <option value="50"></option>
    </datalist>
    <span id="minutesValue">0</span> 分
    <br>
    <button onclick="settingCountdown()">設定</button>
    <button onclick="pauseCountdown()">一時停止</button>
    <button onclick="resumeCountdown()">スタート</button>
    <h2 id="countdown"></h2>
  </div>
  
  <script>
    // スライダーの値が変更された時に表示を更新
    var hoursSlider = document.getElementById("hoursInput");
    var hoursValue = document.getElementById("hoursValue");
    hoursSlider.addEventListener("input", function() {
      hoursValue.innerHTML = hoursSlider.value;
    });
    
    var minutesSlider = document.getElementById("minutesInput");
    var minutesValue = document.getElementById("minutesValue");
    minutesSlider.addEventListener("input", function() {
      minutesValue.innerHTML = minutesSlider.value;
    });
  </script>
</body>
</html>

改良版

<!DOCTYPE html>
<html>
<head>
  <title>カウントダウンタイマー</title>
  <style>
    body {
      background-color: #f1f7fb;
      font-family: Arial, sans-serif;
    }
    
    h1 {
      color: #333;
      text-align: center;
    }
    
    .container {
      max-width: 400px;
      margin: 0 auto;
      padding: 20px;
      background-color: #fff;
      border-radius: 5px;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    }
    
    label {
      display: block;
      font-weight: bold;
      margin-bottom: 5px;
    }
    
    input[type="range"] {
      width: 100%;
    }
    
    button {
      display: block;
      width: 100%;
      padding: 10px;
      margin-top: 10px;
      font-weight: bold;
      text-align: center;
      color: #fff;
      background-color: #5dbcd2;
      border: none;
      border-radius: 5px;
      cursor: pointer;
    }
    
    button:hover {
      background-color: #4ba2b6;
    }
    
    #countdown {
      text-align: center;
      font-size: 24px;
      margin-top: 20px;
    }
  </style>
  <script>
    var timer;
    var totalTime;
    var paused = true;
    
    function settingCountdown() {

        var hours = parseInt(document.getElementById("hoursInput").value);
        var minutes = parseInt(document.getElementById("minutesInput").value);
        totalTime = hours * 3600 + minutes * 60; // 入力された時間と分数を秒に変換
        totalTime = 5;
        paused = true;
        // タイマーが既に実行中の場合は停止
        if (timer) {
          clearInterval(timer);
        }
        timer = setInterval(countdownUpdater, 1000); // 1秒ごとに更新
    }
    
    function countdownUpdater() {
      updataCountdown();
      if (!paused) {
        // 残り時間を1秒減らす
        totalTime--;
        updataCountdown();
        // 残り時間が0になったらタイマーを停止
        if (totalTime <= 0) {
          //totalTime = 0;
          updataCountdown();
          clearInterval(timer);
          //alert("時間が経過しました!");
          setTimeout(function(){
            //console.log("test")
            popAlert()
          }, 1);
        }
      }
    }

    function popAlert() {
      alert("時間が経過しました!");
    }

    function updataCountdown() {
      var hours = Math.floor(totalTime / 3600);
      var minutes = Math.floor((totalTime % 3600) / 60);
      var seconds = totalTime % 60;
        
      // タイマー表示を更新
      document.getElementById("countdown").innerHTML = hours + "時間 " + minutes + "分 " + seconds + "秒"; 
    }
    
    function pauseCountdown() {
      paused = true;
    }
    
    function resumeCountdown() {
      if (totalTime>0){
        paused = false;
      }
      else {
        settingCountdown();
        if (totalTime>0){
          paused = false;
        }
      }
    }
  </script>
</head>
<body>
  <div class="container">
    <h1>カウントダウンタイマー</h1>
    <label>時間:</label>
    <input type="range" id="hoursInput" min="0" max="12" value="0" list="tlist1">
    <datalist id="tlist1">
      <option value="3"></option>
      <option value="6"></option>
      <option value="9"></option>
    </datalist>
    <span id="hoursValue">0</span> 時間
    <br>
    <label>分数:</label>
    <input type="range" id="minutesInput" min="0" max="59" value="0" list="tlist2">
    <datalist id="tlist2">
      <option value="10"></option>
      <option value="20"></option>
      <option value="30"></option>
      <option value="40"></option>
      <option value="50"></option>
    </datalist>
    <span id="minutesValue">0</span> 分
    <br>
    <button onclick="settingCountdown()">リセット</button>
    <button onclick="pauseCountdown()">一時停止</button>
    <button onclick="resumeCountdown()">スタート</button>
    <h2 id="countdown"></h2>
  </div>
  
  <script>
    // スライダーの値が変更された時に表示を更新
    var hoursSlider = document.getElementById("hoursInput");
    var hoursValue = document.getElementById("hoursValue");
    hoursSlider.addEventListener("input", function() {
      hoursValue.innerHTML = hoursSlider.value;
    });
    
    var minutesSlider = document.getElementById("minutesInput");
    var minutesValue = document.getElementById("minutesValue");
    minutesSlider.addEventListener("input", function() {
      minutesValue.innerHTML = minutesSlider.value;
    });
  </script>
</body>
</html>