我将对提供的两个前端项目进行优化和美化,创建一个整合的展示页面,让猜数字游戏和表白墙更加美观和实用。
设计思路
- 创建一个统一风格的页面布局
- 优化猜数字游戏的视觉反馈
- 改进表白墙的样式和交互体验
- 添加响应式设计确保在各种设备上都能良好显示
实现代码
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>
主要优化内容
-
整体设计:
- 采用现代化卡片式布局
- 使用渐变色背景增强视觉吸引力
- 添加阴影和悬停效果提升交互体验
-
猜数字游戏改进:
- 添加了输入验证和范围提示
- 增加了剩余机会显示
- 使用不同颜色区分猜测结果
- 支持键盘Enter键提交
- 添加了游戏结束状态处理
-
表白墙改进:
- 优化了表单布局和样式
- 添加了输入验证
- 改进了消息展示样式
- 支持键盘Enter键提交
- 新消息显示在顶部
-
响应式设计:
- 确保在各种屏幕尺寸上都能良好显示
- 在小屏幕上调整为垂直布局
-
用户体验优化:
- 添加了动画效果
- 提供了清晰的视觉反馈
- 优化了交互流程
这个实现保留了原项目的核心功能,同时通过现代化的设计和用户体验优化,使两个小项目更加吸引人和实用。