时间管理应用(可复制源码)

news/2024/11/8 19:12:38 标签: 前端, css

创建一个简单的时间管理应用程序,结合 Pomodoro 技术使用 HTML、CSS 和 JavaScript

1. HTML

创建一个基本的 HTML 文件 (index.html):

<!DOCTYPE html>  
<html lang="zh">  
<head>  
    <meta charset="UTF-8">  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">  
    <title>Pomodoro 时间管理应用</title>  
    <link rel="stylesheet" href="styles.css">  
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css">  
</head>  
<body>  
    <div class="container">  
        <h1>Pomodoro 时间管理应用</h1>  
        <div class="timer">  
            <span id="timeDisplay">25:00</span>  
        </div>  
        <div class="time-settings">  
            <input type="number" id="workTime" placeholder="工作时间(分钟)" value="25" min="1">  
            <input type="number" id="breakTime" placeholder="休息时间(分钟)" value="5" min="1">  
        </div>  
        <div class="button-group">  
            <button id="startBtn"><i class="fas fa-play"></i> 开始</button>  
            <button id="stopBtn"><i class="fas fa-pause"></i> 停止</button>  
            <button id="resetBtn"><i class="fas fa-refresh"></i> 重置</button>  
        </div>  
        <div class="status" id="statusDisplay">状态: 准备开始</div>  
        <div class="stats" id="statsDisplay">完成的 Pomodoro 数量: <span id="pomodoroCount">0</span></div>  
    </div>  
    <audio id="timerEndSound" src="timer-end-sound.mp3" preload="auto"></audio>  
    <script src="script.js"></script>  
</body>  
</html>

2. CSS

创建一个简单的 CSS 文件 (styles.css) 来美化界面:

css">body {  
    font-family: 'Arial', sans-serif;  
    background: linear-gradient(to right, #f0f7ff, #e8f0fe);  
    margin: 0;  
    padding: 20px;  
}  

.container {  
    max-width: 400px;  
    margin: auto;  
    background: white;  
    border-radius: 10px;  
    padding: 20px;  
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);  
    text-align: center;  
}  

h1 {  
    margin-bottom: 20px;  
    font-size: 24px;  
    color: #333;  
}  

.timer {  
    font-size: 64px;  
    margin: 20px 0;  
    color: #28a745;  
    border: 2px solid #28a745;  
    border-radius: 10px;  
    padding: 20px;  
    background-color: #e9f7ef;  
    transition: background-color 0.5s ease;  
}  

.timer.active {  
    background-color: #d4edda;  
}  

.time-settings {  
    display: flex;  
    justify-content: space-between;  
    margin: 20px 0;  
}  

input[type="number"] {  
    width: 48%;  
    padding: 10px;  
    border-radius: 5px;  
    border: 1px solid #ccc;  
    font-size: 16px;  
    transition: border-color 0.3s;  
}  

input[type="number"]:focus {  
    border-color: #28a745;  
}  

.button-group {  
    display: flex;  
    justify-content: space-between;  
    margin: 20px 0;  
}  

button {  
    padding: 10px 15px;  
    margin: 5px;  
    border: none;  
    border-radius: 5px;  
    cursor: pointer;  
    background-color: #007bff;  
    color: white;  
    font-size: 16px;  
    transition: background-color 0.3s, transform 0.2s;  
    flex: 1;  
}  

button:hover {  
    background-color: #0056b3;  
    transform: scale(1.05);  
}  

.status {  
    margin-top: 20px;  
    font-size: 18px;  
    color: #555;  
}  

.stats {  
    margin-top: 10px;  
    font-size: 16px;  
    color: #888;  
}  

/* 响应式设计 */  
@media (max-width: 500px) {  
    .timer {  
        font-size: 48px;  
    }  

    button {  
        padding: 8px;  
        font-size: 14px;  
    }  

    input[type="number"] {  
        font-size: 14px;  
    }  
}

3. JavaScript

最后,创建一个 JavaScript 文件 (script.js) 来处理计时器逻辑:

let timer;  
let isRunning = false;  
let timeLeft; // 用于存储剩余时间  
let pomodoroCount = 0;  

const timeDisplay = document.getElementById("timeDisplay");  
const statusDisplay = document.getElementById("statusDisplay");  
const pomodoroCountDisplay = document.getElementById("pomodoroCount");  
const timerEndSound = document.getElementById("timerEndSound");  

function updateDisplay() {  
    const minutes = Math.floor(timeLeft / 60);  
    const seconds = timeLeft % 60;  
    timeDisplay.textContent = `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;  
}  

function startTimer() {  
    if (isRunning) return; // 如果已经在运行,则不再启动  
    isRunning = true;  

    // 获取用户输入的工作和休息时间  
    const workTime = parseInt(document.getElementById("workTime").value) || 25;  
    const breakTime = parseInt(document.getElementById("breakTime").value) || 5;  

    // 初始化工作时间  
    timeLeft = workTime * 60; // 设置工作时间  
    statusDisplay.textContent = "状态: 工作中";  
    updateDisplay(); // 更新显示  

    timer = setInterval(() => {  
        if (timeLeft <= 0) {  
            clearInterval(timer);  
            isRunning = false;  
            pomodoroCount++;  
            pomodoroCountDisplay.textContent = pomodoroCount;  

            timerEndSound.play(); // 播放结束声音  
            statusDisplay.textContent = "状态: 休息时间!";  
            timeLeft = breakTime * 60; // 设置休息时间  
            updateDisplay(); // 更新显示  
            startTimer(); // 休息结束后自动开始下一个Pomodoro  
        } else {  
            timeLeft--;  
            updateDisplay();  
        }  
    }, 1000);  
}  

function stopTimer() {  
    clearInterval(timer);  
    isRunning = false;  
    statusDisplay.textContent = "状态: 停止";  
}  

function resetTimer() {  
    clearInterval(timer);  
    isRunning = false;  
    const workTime = parseInt(document.getElementById("workTime").value) || 25;  
    timeLeft = workTime * 60; // 重置为用户输入的工作时间  
    updateDisplay();  
    pomodoroCount = 0; // 重置Pomodoro计数  
    pomodoroCountDisplay.textContent = pomodoroCount;  
    statusDisplay.textContent = "状态: 准备开始";  
}  

// 事件监听  
document.getElementById("startBtn").addEventListener("click", startTimer);  
document.getElementById("stopBtn").addEventListener("click", stopTimer);  
document.getElementById("resetBtn").addEventListener("click", resetTimer);  

// 初始化显示  
resetTimer(); // 初始化时显示默认时间

http://www.niftyadmin.cn/n/5744317.html

相关文章

Flutter 中的那些设计模式的写法(持续更新)

前言 我们都知道设计模式是相同的&#xff0c;同一种设计模式的理念不会因为语言不同而会有所改变&#xff0c;但是由于语法的差异&#xff0c;设计模式的写法也有所差异&#xff0c;本文会介绍一些flutter中常用设计模式的写法以及使用场景。 常见的设计模式有23种&#xff0…

一个基于Rust适用于 Web、桌面、移动设备等的全栈应用程序框架

大家好&#xff0c;今天给大家分享一个用 Rust 语言编写的、受 React 启发的前端框架Dioxus&#xff0c;旨在为构建跨平台的用户界面提供高效、高性能的解决方案。 项目介绍 Dioxus项目的诞生源于开发者们对于更高效、更灵活的跨平台UI解决方案的渴望。 随着技术的发展&#…

2024 网鼎杯 - 青龙组 Web WP

2024 网鼎杯 - 青龙组 WEB - 02 打开容器一个登录界面&#xff0c;随便输入账号密码可以进到漏洞界面 这里有一个发送给boss的功能&#xff0c;一眼xss 有三个接口&#xff1a;/flag 、/update 、/submit /flag &#xff1a;要求boss才能访问&#xff0c;/update &#xf…

docker 拉取MySQL8.0镜像以及安装

目录 一、docker安装MySQL镜像 搜索images 拉取MySQL镜像 二、数据挂载 在/root/mysql/conf中创建 *.cnf 文件 创建容器,将数据,日志,配置文件映射到本机 检查MySQL是否启动成功&#xff1a; 三、DBeaver数据库连接 问题一、Public Key Retrieval is not allowed 问题…

网络自动化04:python实现ACL匹配信息(主机与主机信息)

目录 背景分析代码代码解读代码总体结构1. load_pattern_from_excel 函数2. match_and_append_pattern 函数3. main 函数总结 最终的效果&#xff1a; 今天不分享netmiko&#xff0c;今天分享一个用python提升工作效率的小案例&#xff1a;acl梳理时的信息匹配。 背景 最近同事…

sql速度优化多条合并为一条语句

在 SQL 中&#xff0c;结合 CASE 和 SUM 可以实现根据特定条件进行分组求和。在 ThinkPHP 中也可以使用类似的方式进行数据库查询操作。 例如&#xff0c;假设有一个销售数据表&#xff0c;包含字段 product_id &#xff08;产品 ID&#xff09;、 quantity &#xff08;销…

【C++】异常处理机制(对运行时错误的处理)

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 目录 引言 1.编译器可以处理的错误 2.编译器不能处理的错误 3.传统的错误处理机制 assert终止程序 返回错误码 一、…

架构师备考《论云原生架构及其应用》(新)

目录 题目 摘要 正文 题目 近年来&#xff0c;随着数字化转型不断深入&#xff0c;科技创新与业务发展不断融合&#xff0c;各行各业正在从大工业时代的固化范式进化成面向创新型组织与灵活型业务的崭新模式。在这一背景下&#xff0c;以容器和微服务架构为代表的云原生技术…