<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>项目创建删除动画特效</title>
<style>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
font-family: 'Arial', sans-serif;
}
body {
background-color: #f5f7fa;
padding: 20px;
min-height: 100vh;
}
.container {
max-width: 800px;
margin: 0 auto;
background-color: white;
border-radius: 10px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
padding: 30px;
position: relative;
}
h1 {
color: #333;
margin-bottom: 20px;
text-align: center;
}
.input-group {
display: flex;
margin-bottom: 30px;
}
input {
flex: 1;
padding: 12px 15px;
border: 1px solid #ddd;
border-radius: 5px 0 0 5px;
font-size: 16px;
outline: none;
transition: border 0.3s;
}
input:focus {
border-color: #4a90e2;
}
button {
padding: 12px 20px;
background-color: #4a90e2;
color: white;
border: none;
border-radius: 0 5px 5px 0;
cursor: pointer;
font-size: 16px;
transition: background-color 0.3s;
}
button:hover {
background-color: #357ab8;
}
.projects-list {
list-style: none;
}
.project-item {
background-color: white;
padding: 15px;
margin-bottom: 10px;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
overflow: hidden;
transition: all 0.3s;
}
.project-item.adding {
animation: slideIn 0.5s forwards;
opacity: 0;
transform: translateY(-20px);
}
.project-item.removing {
animation: slideOut 0.5s forwards;
}
.project-text {
flex: 1;
word-break: break-word;
padding-right: 10px;
}
.delete-btn {
background-color: #ff6b6b;
color: white;
border: none;
border-radius: 3px;
padding: 5px 10px;
cursor: pointer;
transition: background-color 0.3s;
}
.delete-btn:hover {
background-color: #ff5252;
}
.empty-state {
text-align: center;
color: #888;
padding: 30px 0;
}
.credit {
text-align: center;
margin-top: 30px;
color: #888;
font-size: 14px;
}
.credit a {
color: #4a90e2;
text-decoration: none;
}
@keyframes slideIn {
from {
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes slideOut {
from {
opacity: 1;
transform: translateX(0);
}
to {
opacity: 0;
transform: translateX(100%);
}
}
/* 脉冲动画 */
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}
.pulse {
animation: pulse 0.5s ease-in-out;
}
</style>
</head>
<body>
<div class="container">
<h1>项目管理</h1>
<div class="input-group">
<input type="text" id="projectInput" placeholder="输入项目名称...">
<button id="addBtn">添加项目</button>
</div>
<ul class="projects-list" id="projectsList">
<li class="empty-state">暂无项目,请添加新项目</li>
</ul>
<div class="credit">
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const projectInput = document.getElementById('projectInput');
const addBtn = document.getElementById('addBtn');
const projectsList = document.getElementById('projectsList');
const emptyState = projectsList.querySelector('.empty-state');
// 添加项目
addBtn.addEventListener('click', addProject);
projectInput.addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
addProject();
}
});
function addProject() {
const projectName = projectInput.value.trim();
if (!projectName) return;
// 移除空状态提示
if (emptyState) {
emptyState.remove();
}
// 创建新项目元素
const projectItem = document.createElement('li');
projectItem.className = 'project-item adding';
projectItem.innerHTML = `
<div class="project-text">${projectName}</div>
<button class="delete-btn">删除</button>
`;
// 添加到列表
projectsList.appendChild(projectItem);
// 添加删除事件
const deleteBtn = projectItem.querySelector('.delete-btn');
deleteBtn.addEventListener('click', function() {
deleteProject(projectItem);
});
// 清空输入框
projectInput.value = '';
// 动画结束后移除临时类
setTimeout(() => {
projectItem.classList.remove('adding');
}, 500);
// 添加脉冲动画
setTimeout(() => {
projectItem.classList.add('pulse');
setTimeout(() => {
projectItem.classList.remove('pulse');
}, 500);
}, 550);
}
function deleteProject(projectItem) {
projectItem.classList.add('removing');
setTimeout(() => {
projectItem.remove();
// 如果没有项目了,显示空状态
if (projectsList.children.length === 0) {
const emptyState = document.createElement('li');
emptyState.className = 'empty-state';
emptyState.textContent = '暂无项目,请添加新项目';
projectsList.appendChild(emptyState);
}
}, 500);
}
// 初始添加几个示例项目
const sampleProjects = ['网站开发', '移动应用', '数据分析'];
sampleProjects.forEach(project => {
projectInput.value = project;
addProject();
});
});
</script>
</body>
</html>