Hướng dẫn tạo Pomodoro Timer bằng HTML, CSS và JavaScript

Pomodoro Timer là một kỹ thuật quản lý thời gian phổ biến, chia thời gian làm việc thành các phiên tập trung ngắn xen kẽ với những khoảng nghỉ ngắn. Việc tự xây dựng một Pomodoro Timer bằng HTML, CSS và JavaScript giúp dễ dàng tùy chỉnh theo thói quen cá nhân, đồng thời là một bài tập thực tế hữu ích cho người học lập trình front end.

Hướng dẫn tạo Pomodoro Timer bằng HTML, CSS và JavaScript

Pomodoro Timer là gì?

Pomodoro là phương pháp quản lý thời gian được đề xuất bởi Francesco Cirillo, dựa trên chu kỳ làm việc tập trung trong 25 phút và nghỉ 5 phút. Mỗi chu kỳ như vậy được gọi là một pomodoro. Sau một số pomodoro nhất định, người dùng sẽ nghỉ dài hơn.

Pomodoro Timer là công cụ giúp đếm ngược thời gian của từng phiên làm việc và nhắc người dùng khi đến lúc nghỉ ngơi hoặc bắt đầu lại.

Lợi ích của Pomodoro Timer khi làm việc và học tập

Việc sử dụng Pomodoro Timer mang lại nhiều lợi ích rõ ràng cho việc tập trung và duy trì năng suất:

  • Giảm xao nhãng bằng cách đặt khoảng thời gian tập trung rõ ràng.
  • Giúp người dùng chủ động lên kế hoạch cho từng phiên làm việc.
  • Tạo cảm giác hoàn thành khi mỗi phiên kết thúc.
  • Duy trì nhịp làm việc đều đặn nhờ các khoảng nghỉ ngắn xen kẽ.

Cấu trúc HTML cơ bản của Pomodoro Timer

Để xây dựng một Pomodoro Timer đơn giản, cần chuẩn bị một số thành phần HTML cơ bản:

  • Trường nhập thời lượng phiên làm việc (tính theo phút).
  • Vùng hiển thị đồng hồ đếm ngược theo định dạng phút:giây.
  • Các nút điều khiển như Bắt đầu, Tạm dừng và Đặt lại.
  • Vùng hiển thị trạng thái hiện tại của phiên (đang làm việc hay đang nghỉ).

Ví dụ cấu trúc HTML tối giản cho Pomodoro Timer:

<div class="pomodoro">
    <label for="pomodoro-minutes">Thời lượng làm việc (phút)</label>
    <input id="pomodoro-minutes" type="number" min="1" value="25">

    <div class="pomodoro-time" id="pomodoro-time">25:00</div>

    <div class="pomodoro-controls">
        <button id="pomodoro-start">Bắt đầu</button>
        <button id="pomodoro-pause">Tạm dừng</button>
        <button id="pomodoro-reset">Đặt lại</button>
    </div>

    <p class="pomodoro-status" id="pomodoro-status">Chế độ: Làm việc</p>
</div>

Phần cấu trúc này là nền tảng để gắn thêm CSS định dạng giao diện và JavaScript điều khiển hoạt động đếm ngược.

Thêm CSS để hiển thị đồng hồ Pomodoro rõ ràng

Pomodoro Timer cần một đồng hồ đếm ngược nổi bật, dễ nhìn và các nút điều khiển có khoảng cách hợp lý. Ví dụ CSS dưới đây mô tả một cách trình bày đơn giản.

.pomodoro {
    max-width: 360px;
    margin: 16px 0;
    font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}

.pomodoro label {
    display: block;
    font-size: 14px;
    font-weight: 600;
    margin-bottom: 4px;
}

.pomodoro input[type="number"] {
    width: 100%;
    padding: 6px;
    box-sizing: border-box;
    margin-bottom: 12px;
}

.pomodoro-time {
    font-size: 32px;
    font-weight: 700;
    text-align: center;
    padding: 12px 0;
}

.pomodoro-controls {
    display: flex;
    gap: 8px;
    justify-content: center;
    margin-top: 8px;
}

.pomodoro-controls button {
    padding: 6px 14px;
    cursor: pointer;
}

.pomodoro-status {
    margin-top: 10px;
    font-size: 13px;
    text-align: center;
}

Phần CSS này giúp đồng hồ đếm ngược trở thành điểm nhấn chính, đồng thời sắp xếp nhóm nút điều khiển rõ ràng và dễ tương tác.

Viết JavaScript điều khiển đếm ngược Pomodoro

JavaScript sẽ chịu trách nhiệm xử lý toàn bộ logic của Pomodoro Timer: khởi động, tạm dừng, đặt lại và cập nhật giao diện theo từng giây. Ý tưởng chung là chuyển đổi thời lượng phút sang tổng số giây, sau đó sử dụng setInterval để trừ dần cho đến khi về 0.

(function() {
    var minutesInput = document.getElementById("pomodoro-minutes");
    var timeDisplay = document.getElementById("pomodoro-time");
    var statusDisplay = document.getElementById("pomodoro-status");

    var startButton = document.getElementById("pomodoro-start");
    var pauseButton = document.getElementById("pomodoro-pause");
    var resetButton = document.getElementById("pomodoro-reset");

    var timerId = null;
    var remainingSeconds = 0;
    var isRunning = false;

    function formatTime(seconds) {
        var m = Math.floor(seconds / 60);
        var s = seconds % 60;
        return String(m).padStart(2, "0") + ":" + String(s).padStart(2, "0");
    }

    function updateDisplay() {
        timeDisplay.textContent = formatTime(remainingSeconds);
    }

    function startTimer() {
        if (isRunning) {
            return;
        }
        var minutes = parseInt(minutesInput.value, 10);
        if (isNaN(minutes) || minutes <= 0) {
            minutes = 25;
        }
        if (remainingSeconds === 0) {
            remainingSeconds = minutes * 60;
        }

        isRunning = true;
        statusDisplay.textContent = "Chế độ: Làm việc";

        timerId = setInterval(function() {
            if (remainingSeconds > 0) {
                remainingSeconds--;
                updateDisplay();
            } else {
                clearInterval(timerId);
                isRunning = false;
                statusDisplay.textContent = "Đã hết thời gian. Nghỉ ngơi một chút trước khi bắt đầu phiên tiếp theo.";
            }
        }, 1000);
    }

    function pauseTimer() {
        if (!isRunning) {
            return;
        }
        clearInterval(timerId);
        isRunning = false;
        statusDisplay.textContent = "Tạm dừng phiên làm việc";
    }

    function resetTimer() {
        clearInterval(timerId);
        isRunning = false;
        var minutes = parseInt(minutesInput.value, 10) || 25;
        remainingSeconds = minutes * 60;
        updateDisplay();
        statusDisplay.textContent = "Chế độ: Làm việc";
    }

    startButton.addEventListener("click", startTimer);
    pauseButton.addEventListener("click", pauseTimer);
    resetButton.addEventListener("click", resetTimer);

    resetTimer();
})();

Đoạn mã trên đảm bảo Pomodoro Timer có thể hoạt động đầy đủ với ba nút điều khiển cơ bản, đồng thời hiển thị trạng thái rõ ràng cho người dùng.

Demo Pomodoro Timer

Ví dụ dưới đây là một demo hoạt động trực tiếp của Pomodoro Timer. Người đọc có thể thay đổi thời lượng phiên làm việc, sau đó sử dụng các nút Bắt đầu, Tạm dừng và Đặt lại để trải nghiệm cách hoạt động.

Demo Pomodoro Timer

25:00

Chế độ: Làm việc

Một số ý tưởng mở rộng Pomodoro Timer

Sau khi hoàn thành phiên bản cơ bản, Pomodoro Timer có thể được nâng cấp với nhiều tính năng hữu ích khác:

  • Thêm chế độ nghỉ ngắn và nghỉ dài với thời lượng cấu hình riêng.
  • Hiển thị số lượng pomodoro đã hoàn thành trong một ngày.
  • Phát âm thanh thông báo khi kết thúc phiên làm việc hoặc phiên nghỉ.
  • Lưu cấu hình và tiến trình bằng localStorage để không bị mất khi tải lại trang.

Kết luận

Pomodoro Timer là một ví dụ thực tế đơn giản nhưng hiệu quả cho việc luyện tập HTML, CSS và JavaScript.

Bằng cách xây dựng một đồng hồ đếm ngược có nút điều khiển rõ ràng và trạng thái trực quan, người dùng vừa có thể áp dụng ngay vào công việc hằng ngày, vừa hiểu sâu hơn về cách kết hợp giao diện và logic trong ứng dụng web.

Từ bản cơ bản, Pomodoro Timer có thể mở rộng thành một công cụ quản lý thời gian cá nhân linh hoạt và hữu ích.

Bình luận


  • Không có bình luận.

Công cụ trực tuyến

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...