前端小练习————表白墙+猜数字小游戏

45 阅读5分钟

我将对提供的两个前端项目进行优化和美化,创建一个整合的展示页面,让猜数字游戏和表白墙更加美观和实用。

设计思路

  1. 创建一个统一风格的页面布局
  2. 优化猜数字游戏的视觉反馈
  3. 改进表白墙的样式和交互体验
  4. 添加响应式设计确保在各种设备上都能良好显示

实现代码

html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>前端小项目合集</title>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        }
        
        body {
            background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%);
            color: #333;
            min-height: 100vh;
            padding: 20px;
        }
        
        .container {
            max-width: 1200px;
            margin: 0 auto;
        }
        
        header {
            text-align: center;
            margin-bottom: 40px;
            color: white;
            padding: 20px;
        }
        
        h1 {
            font-size: 2.5rem;
            margin-bottom: 10px;
            text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
        }
        
        .subtitle {
            font-size: 1.2rem;
            opacity: 0.9;
        }
        
        .projects-container {
            display: flex;
            flex-wrap: wrap;
            gap: 30px;
            justify-content: center;
        }
        
        .project-card {
            background-color: white;
            border-radius: 15px;
            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
            padding: 25px;
            width: 100%;
            max-width: 500px;
            transition: transform 0.3s ease, box-shadow 0.3s ease;
        }
        
        .project-card:hover {
            transform: translateY(-5px);
            box-shadow: 0 15px 35px rgba(0, 0, 0, 0.25);
        }
        
        .project-title {
            font-size: 1.8rem;
            margin-bottom: 20px;
            color: #2575fc;
            text-align: center;
            border-bottom: 2px solid #f0f0f0;
            padding-bottom: 10px;
        }
        
        .game-info {
            background-color: #f8f9fa;
            border-radius: 10px;
            padding: 15px;
            margin-bottom: 20px;
            text-align: center;
        }
        
        .input-group {
            display: flex;
            margin-bottom: 20px;
        }
        
        .input-group input {
            flex-grow: 1;
            padding: 12px 15px;
            border: 2px solid #e0e0e0;
            border-radius: 8px 0 0 8px;
            font-size: 1rem;
            outline: none;
            transition: border-color 0.3s;
        }
        
        .input-group input:focus {
            border-color: #2575fc;
        }
        
        .btn {
            padding: 12px 20px;
            border: none;
            border-radius: 8px;
            cursor: pointer;
            font-size: 1rem;
            font-weight: 600;
            transition: all 0.3s ease;
        }
        
        .btn-primary {
            background-color: #2575fc;
            color: white;
        }
        
        .btn-primary:hover {
            background-color: #1a68e8;
        }
        
        .btn-secondary {
            background-color: #6c757d;
            color: white;
        }
        
        .btn-secondary:hover {
            background-color: #5a6268;
        }
        
        .btn-guess {
            border-radius: 0 8px 8px 0;
        }
        
        .stats {
            display: flex;
            justify-content: space-between;
            margin-bottom: 20px;
        }
        
        .stat-item {
            text-align: center;
            flex: 1;
        }
        
        .stat-value {
            font-size: 1.5rem;
            font-weight: bold;
            color: #2575fc;
        }
        
        .result {
            text-align: center;
            padding: 15px;
            border-radius: 8px;
            font-weight: bold;
            font-size: 1.2rem;
            margin-top: 20px;
            min-height: 60px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .love-wall-form {
            display: flex;
            flex-direction: column;
            gap: 15px;
        }
        
        .form-group {
            display: flex;
            flex-direction: column;
        }
        
        .form-group label {
            margin-bottom: 8px;
            font-weight: 600;
            color: #555;
        }
        
        .form-group input {
            padding: 12px 15px;
            border: 2px solid #e0e0e0;
            border-radius: 8px;
            font-size: 1rem;
            outline: none;
            transition: border-color 0.3s;
        }
        
        .form-group input:focus {
            border-color: #2575fc;
        }
        
        .submit-btn {
            background-color: #ff6b6b;
            color: white;
            margin-top: 10px;
        }
        
        .submit-btn:hover {
            background-color: #ff5252;
        }
        
        .messages-container {
            margin-top: 30px;
            max-height: 300px;
            overflow-y: auto;
            padding-right: 10px;
        }
        
        .message {
            background-color: #f8f9fa;
            border-radius: 10px;
            padding: 15px;
            margin-bottom: 15px;
            border-left: 4px solid #ff6b6b;
            animation: fadeIn 0.5s ease;
        }
        
        .message-header {
            display: flex;
            justify-content: space-between;
            margin-bottom: 8px;
            font-weight: bold;
            color: #555;
        }
        
        .message-content {
            color: #333;
            line-height: 1.5;
        }
        
        .empty-state {
            text-align: center;
            padding: 30px;
            color: #888;
            font-style: italic;
        }
        
        @keyframes fadeIn {
            from { opacity: 0; transform: translateY(10px); }
            to { opacity: 1; transform: translateY(0); }
        }
        
        .correct {
            background-color: #d4edda;
            color: #155724;
            border: 1px solid #c3e6cb;
        }
        
        .too-high {
            background-color: #f8d7da;
            color: #721c24;
            border: 1px solid #f5c6cb;
        }
        
        .too-low {
            background-color: #fff3cd;
            color: #856404;
            border: 1px solid #ffeaa7;
        }
        
        @media (max-width: 768px) {
            .projects-container {
                flex-direction: column;
                align-items: center;
            }
            
            .project-card {
                width: 100%;
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <header>
            <h1>前端小项目合集</h1>
            <p class="subtitle">使用HTML、CSS、JavaScript和jQuery实现</p>
        </header>
        
        <div class="projects-container">
            <!-- 猜数字游戏 -->
            <div class="project-card">
                <h2 class="project-title">猜数字游戏</h2>
                
                <div class="game-info">
                    <p>我已经想好了一个 <strong>1-100</strong> 之间的数字,试试看你能猜中吗?</p>
                </div>
                
                <div class="input-group">
                    <input type="number" id="number" placeholder="输入你的猜测 (1-100)" min="1" max="100">
                    <button class="btn btn-primary btn-guess" id="guess">猜!</button>
                </div>
                
                <div class="stats">
                    <div class="stat-item">
                        <div class="stat-label">已猜次数</div>
                        <div class="stat-value" id="count">0</div>
                    </div>
                    <div class="stat-item">
                        <div class="stat-label">剩余机会</div>
                        <div class="stat-value" id="remaining">10</div>
                    </div>
                </div>
                
                <div class="result" id="result">
                    等待你的第一次猜测...
                </div>
                
                <button class="btn btn-secondary" id="reset" style="width: 100%; margin-top: 15px;">
                    重新开始游戏
                </button>
            </div>
            
            <!-- 表白墙 -->
            <div class="project-card">
                <h2 class="project-title">表白墙</h2>
                <p style="text-align: center; margin-bottom: 20px; color: #666;">在这里留下你的心意</p>
                
                <div class="love-wall-form">
                    <div class="form-group">
                        <label for="from">谁:</label>
                        <input type="text" id="from" class="edit" placeholder="你的名字">
                    </div>
                    
                    <div class="form-group">
                        <label for="to">对谁:</label>
                        <input type="text" id="to" class="edit" placeholder="对方的名字">
                    </div>
                    
                    <div class="form-group">
                        <label for="message">说什么:</label>
                        <input type="text" id="message" class="edit" placeholder="想说的话">
                    </div>
                    
                    <button class="btn submit-btn" id="submit">提交</button>
                </div>
                
                <div class="messages-container" id="messages-container">
                    <div class="empty-state">还没有表白,快来写下第一条吧!</div>
                </div>
            </div>
        </div>
    </div>

    <script>
        $(document).ready(function() {
            // 猜数字游戏逻辑
            let guessNumber = Math.floor(Math.random() * 100) + 1;
            let count = 0;
            const maxGuesses = 10;
            
            console.log("目标数字: " + guessNumber); // 用于测试
            
            // 猜数字按钮点击事件
            $("#guess").click(function() {
                const inputNumber = parseInt($("#number").val());
                
                // 输入验证
                if (isNaN(inputNumber) || inputNumber < 1 || inputNumber > 100) {
                    $("#result").text("请输入1-100之间的有效数字!").removeClass().addClass("result too-high");
                    return;
                }
                
                count++;
                $("#count").text(count);
                $("#remaining").text(maxGuesses - count);
                
                // 判断猜测结果
                if (inputNumber === guessNumber) {
                    $("#result").text(`恭喜你!猜对了!用了 ${count} 次机会`).removeClass().addClass("result correct");
                    $("#guess").prop("disabled", true);
                } else if (inputNumber > guessNumber) {
                    $("#result").text(`猜大了!再试试小一点的数字`).removeClass().addClass("result too-high");
                } else {
                    $("#result").text(`猜小了!再试试大一点的数字`).removeClass().addClass("result too-low");
                }
                
                // 检查是否用完所有机会
                if (count >= maxGuesses && inputNumber !== guessNumber) {
                    $("#result").text(`游戏结束!正确答案是 ${guessNumber}`).removeClass().addClass("result too-high");
                    $("#guess").prop("disabled", true);
                }
                
                // 清空输入框
                $("#number").val("");
            });
            
            // 重新开始游戏按钮点击事件
            $("#reset").click(function() {
                guessNumber = Math.floor(Math.random() * 100) + 1;
                count = 0;
                $("#count").text(count);
                $("#remaining").text(maxGuesses);
                $("#result").text("游戏已重置,开始新一轮猜测吧!").removeClass().addClass("result");
                $("#guess").prop("disabled", false);
                $("#number").val("");
                
                console.log("新目标数字: " + guessNumber); // 用于测试
            });
            
            // 按Enter键也可以猜数字
            $("#number").keypress(function(e) {
                if (e.which === 13) { // Enter键
                    $("#guess").click();
                }
            });
            
            // 表白墙逻辑
            $("#submit").click(function() {
                const from = $("#from").val().trim();
                const to = $("#to").val().trim();
                const message = $("#message").val().trim();
                
                // 输入验证
                if (!from || !to || !message) {
                    alert("请填写完整信息!");
                    return;
                }
                
                // 创建新消息
                const messageHtml = `
                    <div class="message">
                        <div class="message-header">
                            <span>${from}</span>
                            <span>对 ${to} 说:</span>
                        </div>
                        <div class="message-content">${message}</div>
                    </div>
                `;
                
                // 添加到消息容器
                if ($("#messages-container .empty-state").length > 0) {
                    $("#messages-container").html(messageHtml);
                } else {
                    $("#messages-container").prepend(messageHtml);
                }
                
                // 清空表单
                $("#from").val("");
                $("#to").val("");
                $("#message").val("");
            });
            
            // 为表白墙表单添加Enter键提交
            $(".edit").keypress(function(e) {
                if (e.which === 13) { // Enter键
                    $("#submit").click();
                }
            });
        });
    </script>
</body>
</html>

主要优化内容

  1. 整体设计

    • 采用现代化卡片式布局
    • 使用渐变色背景增强视觉吸引力
    • 添加阴影和悬停效果提升交互体验
  2. 猜数字游戏改进

    • 添加了输入验证和范围提示
    • 增加了剩余机会显示
    • 使用不同颜色区分猜测结果
    • 支持键盘Enter键提交
    • 添加了游戏结束状态处理
  3. 表白墙改进

    • 优化了表单布局和样式
    • 添加了输入验证
    • 改进了消息展示样式
    • 支持键盘Enter键提交
    • 新消息显示在顶部
  4. 响应式设计

    • 确保在各种屏幕尺寸上都能良好显示
    • 在小屏幕上调整为垂直布局
  5. 用户体验优化

    • 添加了动画效果
    • 提供了清晰的视觉反馈
    • 优化了交互流程

这个实现保留了原项目的核心功能,同时通过现代化的设计和用户体验优化,使两个小项目更加吸引人和实用。