动态待办事项列表
这是一个非常经典的入门案例,展示了如何使用JavaScript来动态地添加、删除和修改网页内容。

(图片来源网络,侵删)
功能说明:
- 在输入框中输入任务,点击“添加”按钮,任务会出现在下方列表中。
- 每个任务前面有一个复选框,勾选后,任务文本会有删除线效果。
- 每个任务后面有一个“删除”按钮,点击后可以从列表中移除该任务。
代码实现:
HTML 文件 (index.html)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">JavaScript 待办事项列表</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<h1>我的待办事项</h1>
<div class="input-area">
<input type="text" id="taskInput" placeholder="请输入新任务...">
<button id="addTaskBtn">添加</button>
</div>
<ul id="taskList">
<!-- 任务列表将在这里动态生成 -->
</ul>
</div>
<script src="script.js"></script>
</body>
</html>
CSS 文件 (style.css)
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
background-color: #f4f7f6;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
.container {
background: #fff;
padding: 2rem;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
width: 90%;
max-width: 500px;
}
h1 {
text-align: center;
color: #333;
margin-bottom: 1.5rem;
}
.input-area {
display: flex;
margin-bottom: 1.5rem;
}
#taskInput {
flex-grow: 1;
padding: 0.75rem;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 1rem;
outline: none;
}
#taskInput:focus {
border-color: #007bff;
}
#addTaskBtn {
padding: 0.75rem 1.5rem;
margin-left: 0.5rem;
border: none;
background-color: #007bff;
color: white;
border-radius: 4px;
cursor: pointer;
font-size: 1rem;
transition: background-color 0.3s;
}
#addTaskBtn:hover {
background-color: #0056b3;
}
#taskList {
list-style: none;
padding: 0;
}
.task-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.75rem;
border-bottom: 1px solid #eee;
transition: background-color 0.2s;
}
.task-item:hover {
background-color: #f9f9f9;
}
.task-item.completed .task-text {
text-decoration: line-through;
color: #888;
}
.task-checkbox {
margin-right: 1rem;
}
.task-text {
flex-grow: 1;
}
.delete-btn {
background: #dc3545;
color: white;
border: none;
padding: 0.4rem 0.8rem;
border-radius: 4px;
cursor: pointer;
font-size: 0.9rem;
transition: background-color 0.3s;
}
.delete-btn:hover {
background: #c82333;
}
JavaScript 文件 (script.js)
// 获取DOM元素
const taskInput = document.getElementById('taskInput');
const addTaskBtn = document.getElementById('addTaskBtn');
const taskList = document.getElementById('taskList');
// 从localStorage加载任务
let tasks = JSON.parse(localStorage.getItem('tasks')) || [];
// 渲染任务列表
function renderTasks() {
taskList.innerHTML = ''; // 清空当前列表
tasks.forEach((task, index) => {
const li = document.createElement('li');
li.className = `task-item ${task.completed ? 'completed' : ''}`;
li.innerHTML = `
<input type="checkbox" class="task-checkbox" ${task.completed ? 'checked' : ''}>
<span class="task-text">${task.text}</span>
<button class="delete-btn">删除</button>
`;
// 添加复选框事件监听
li.querySelector('.task-checkbox').addEventListener('change', () => {
toggleTask(index);
});
// 添加删除按钮事件监听
li.querySelector('.delete-btn').addEventListener('click', () => {
deleteTask(index);
});
taskList.appendChild(li);
});
}
// 添加新任务
function addTask() {
const taskText = taskInput.value.trim();
if (taskText === '') {
alert('请输入任务内容!');
return;
}
tasks.push({ text: taskText, completed: false });
saveTasks();
renderTasks();
taskInput.value = ''; // 清空输入框
}
// 切换任务完成状态
function toggleTask(index) {
tasks[index].completed = !tasks[index].completed;
saveTasks();
renderTasks();
}
// 删除任务
function deleteTask(index) {
tasks.splice(index, 1);
saveTasks();
renderTasks();
}
// 保存任务到localStorage
function saveTasks() {
localStorage.setItem('tasks', JSON.stringify(tasks));
}
// 事件监听
addTaskBtn.addEventListener('click', addTask);
// 允许按Enter键添加任务
taskInput.addEventListener('keypress', (e) => {
if (e.key === 'Enter') {
addTask();
}
});
// 初始渲染
renderTasks();
简易计算器
这个案例展示了如何处理用户输入、执行数学运算并更新页面。

(图片来源网络,侵删)
功能说明:
- 支持基本的加减乘除运算。
- 支持小数点运算。
- 有清除按钮可以重置计算器。
- 连续运算功能(
3 + 5 * 2)。
代码实现:
HTML 文件 (calculator.html)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">简易计算器</title>
<link rel="stylesheet" href="calculator.css">
</head>
<body>
<div class="calculator">
<div class="display">
<input type="text" id="display" readonly>
</div>
<div class="buttons">
<button class="btn-clear">C</button>
<button class="btn-operator">/</button>
<button class="btn-operator">*</button>
<button class="btn-operator">-</button>
<button class="btn-number">7</button>
<button class="btn-number">8</button>
<button class="btn-number">9</button>
<button class="btn-operator">+</button>
<button class="btn-number">4</button>
<button class="btn-number">5</button>
<button class="btn-number">6</button>
<button class="btn-equals" rowspan="2">=</button>
<button class="btn-number">1</button>
<button class="btn-number">2</button>
<button class="btn-number">3</button>
<button class="btn-zero">0</button>
<button class="btn-number">.</button>
</div>
</div>
<script src="calculator.js"></script>
</body>
</html>
CSS 文件 (calculator.css)
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #333;
margin: 0;
font-family: Arial, sans-serif;
}
.calculator {
background-color: #444;
border-radius: 10px;
box-shadow: 0 5px 15px rgba(0,0,0,0.3);
padding: 20px;
}
.display {
margin-bottom: 15px;
}
#display {
width: 100%;
height: 60px;
font-size: 2.5em;
text-align: right;
padding: 0 15px;
border: none;
border-radius: 5px;
background-color: #222;
color: #fff;
box-sizing: border-box;
}
.buttons {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-gap: 10px;
}
.btn-number, .btn-operator, .btn-clear, .btn-equals, .btn-zero {
height: 50px;
font-size: 1.5em;
border: none;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.2s;
}
.btn-number {
background-color: #666;
color: white;
}
.btn-number:hover {
background-color: #777;
}
.btn-operator {
background-color: #ff9500;
color: white;
}
.btn-operator:hover {
background-color: #ffb143;
}
.btn-equals {
background-color: #2196F3;
color: white;
grid-row: span 2;
}
.btn-equals:hover {
background-color: #0b7dda;
}
.btn-clear {
background-color: #f44336;
color: white;
}
.btn-clear:hover {
background-color: #d32f2f;
}
.btn-zero {
grid-column: span 2;
}
JavaScript 文件 (calculator.js)
const display = document.getElementById('display');
const buttons = document.querySelectorAll('.buttons button');
let currentInput = '0';
let previousInput = '';
let operation = null;
let shouldResetScreen = false;
// 更新显示屏
function updateDisplay() {
display.value = currentInput;
}
// 处理数字输入
function appendNumber(number) {
if (currentInput === '0' || shouldResetScreen) {
currentInput = number;
shouldResetScreen = false;
} else {
currentInput += number;
}
updateDisplay();
}
// 处理小数点
function appendDecimal() {
if (shouldResetScreen) {
currentInput = '0.';
shouldResetScreen = false;
} else if (!currentInput.includes('.')) {
currentInput += '.';
}
updateDisplay();
}
// 选择操作符
function chooseOperation(op) {
if (operation !== null) {
calculate();
}
previousInput = currentInput;
operation = op;
shouldResetScreen = true;
}
// 执行计算
function calculate() {
let computation;
const prev = parseFloat(previousInput);
const current = parseFloat(currentInput);
if (isNaN(prev) || isNaN(current)) return;
switch (operation) {
case '+':
computation = prev + current;
break;
case '-':
computation = prev - current;
break;
case '*':
computation = prev * current;
break;
case '/':
if (current === 0) {
alert('不能除以零!');
clear();
return;
}
computation = prev / current;
break;
default:
return;
}
currentInput = computation.toString();
operation = null;
previousInput = '';
shouldResetScreen = true;
updateDisplay();
}
// 清除计算器
function clear() {
currentInput = '0';
previousInput = '';
operation = null;
shouldResetScreen = false;
updateDisplay();
}
// 添加事件监听器
buttons.forEach(button => {
button.addEventListener('click', () => {
const value = button.textContent;
if (button.classList.contains('btn-number')) {
appendNumber(value);
} else if (button.classList.contains('btn-zero')) {
appendNumber(value);
} else if (button.classList.contains('btn-operator')) {
chooseOperation(value);
} else if (button.classList.contains('btn-equals')) {
calculate();
} else if (button.classList.contains('btn-clear')) {
clear();
} else if (button.classList.contains('btn-number') && value === '.') {
appendDecimal();
}
});
});
// 初始化显示
updateDisplay();
图片轮播/幻灯片
这个案例展示了如何使用JavaScript来创建一个自动播放或手动控制的图片轮播效果。

(图片来源网络,侵删)
功能说明:
- 自动播放图片,每隔几秒切换一张。
- 提供左右箭头按钮,可以手动切换图片。
- 提供底部指示器,显示当前是第几张图片,并可以点击跳转。
代码实现:
HTML 文件 (slideshow.html)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">图片轮播</title>
<link rel="stylesheet" href="slideshow.css">
</head>
<body>
<div class="slideshow-container">
<div class="slides fade">
<img src="https://picsum.photos/seed/slide1/800/400.jpg" style="width:100%">
</div>
<div class="slides fade">
<img src="https://picsum.photos/seed/slide2/800/400.jpg" style="width:100%">
</div>
<div class="slides fade">
<img src="https://picsum.photos/seed/slide3/800/400.jpg" style="width:100%">
</div>
<!-- 左右箭头 -->
<a class="prev">❮</a>
<a class="next">❯</a>
<!-- 指示器 -->
<div class="dots-container">
<span class="dot active"></span>
<span class="dot"></span>
<span class="dot"></span>
</div>
</div>
<script src="slideshow.js"></script>
</body>
</html>
CSS 文件 (slideshow.css)
* {box-sizing: border-box}
body {font-family: Verdana, sans-serif; margin:0}
.mySlides {display: none}
img {vertical-align: middle;}
/* 轮播容器 */
.slideshow-container {
max-width: 800px;
position: relative;
margin: auto;
}
/* 隐藏图片 */
.fade {
display: none;
}
/* 显示第一张图片 */
.active-slide {
display: block;
}
/* 箭头按钮 */
.prev, .next {
cursor: pointer;
position: absolute;
top: 50%;
width: auto;
margin-top: -22px;
padding: 16px;
color: white;
font-weight: bold;
font-size: 18px;
transition: 0.6s ease;
border-radius: 0 3px 3px 0;
user-select: none;
}
.next {
right: 0;
border-radius: 3px 0 0 3px;
}
.prev:hover, .next:hover {
background-color: rgba(0,0,0,0.8);
}
/* 指示器样式 */
.dots-container {
text-align: center;
padding: 20px;
}
.dot {
cursor: pointer;
height: 15px;
width: 15px;
margin: 0 5px;
background-color: #bbb;
border-radius: 50%;
display: inline-block;
transition: background-color 0.6s ease;
}
.active-dot, .dot:hover {
background-color: #717171;
}
JavaScript 文件 (slideshow.js)
let slideIndex = 1;
const slides = document.getElementsByClassName("slides");
const dots = document.getElementsByClassName("dot");
// 显示指定的幻灯片
function showSlides(n) {
if (n > slides.length) { slideIndex = 1; }
if (n < 1) { slideIndex = slides.length; }
// 隐藏所有幻灯片
for (let i = 0; i < slides.length; i++) {
slides[i].style.display = "none";
}
// 移除所有指示点的激活状态
for (let i = 0; i < dots.length; i++) {
dots[i].className = dots[i].className.replace(" active-dot", "");
}
// 显示当前幻灯片和激活对应指示点
slides[slideIndex - 1].style.display = "block";
dots[slideIndex - 1].className += " active-dot";
}
// 切换到下一张或上一张
function plusSlides(n) {
showSlides(slideIndex += n);
}
// 切换到指定幻灯片
function currentSlide(n) {
showSlides(slideIndex = n);
}
// 自动播放
function autoPlay() {
plusSlides(1);
setTimeout(autoPlay, 3000); // 每3秒切换一次
}
// 初始化显示第一张幻灯片
showSlides(slideIndex);
// 绑定箭头按钮事件
document.querySelector(".prev").addEventListener("click", () => plusSlides(-1));
document.querySelector(".next").addEventListener("click", () => plusSlides(1));
// 绑定指示点点击事件
for (let i = 0; i < dots.length; i++) {
dots[i].addEventListener("click", () => currentSlide(i + 1));
}
// 启动自动播放
// autoPlay(); // 如果需要自动播放,请取消这行注释
如何运行这些案例?
- 为每个案例创建一个文件夹。
- 在文件夹中创建相应的
.html,.css, 和.js文件。 - 将上面的代码分别复制到对应的文件中。
- 用浏览器打开
.html文件即可看到效果。
这些案例涵盖了DOM操作、事件处理、状态管理和简单的算法逻辑,是学习和实践JavaScript的绝佳起点。
