一个记事本(可复制源码)

html+css+js做了一个记事本,可复制源码
在这里插入图片描述
在这里插入图片描述

html

<!DOCTYPE html>  
<html lang="zh">  <head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title>记事本</title>  <link rel="stylesheet" href="styles.css">  
</head>  <body>  <div class="notebook">  <div class="container">  <h1>记事本</h1>  <button id="themeToggle">切换主题</button>  <div class="side-buttons">  <button class="nav-button" id="exportNotes">导出事件</button>  <button class="nav-button" id="printNotes">打印事件</button>  </div>  <div class="page">  <div class="input-section">  <h2>添加新事件</h2>  <input type="date" id="dateInput" />  <input type="text" id="eventInput" placeholder="输入事件..." />  <div class="select-group">  <select id="categorySelect">  <option value="工作">工作</option>  <option value="学习">学习</option>  <option value="个人">个人</option>  </select>  <select id="prioritySelect">  <option value="">高优先级</option>  <option value="">中优先级</option>  <option value="">低优先级</option>  </select>  </div>  <button id="addButton">添加事件</button>  </div>  <div class="search-section">  <h2>我的记事</h2>  <input type="text" id="searchInput" placeholder="搜索事件..." />  <ul id="notesList"></ul>  </div>  </div>  </div>  </div>  <script src="script.js"></script>  
</body>  </html>

css

* {  box-sizing: border-box;  margin: 0;  padding: 0;  
}  body {  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;  background: linear-gradient(135deg, #e3f2fd, #bbdefb);  display: flex;  justify-content: center;  align-items: center;  height: 100vh;  color: #333;  transition: background-color 0.4s;  
}  body.dark-theme {  background: linear-gradient(135deg, #2b2c35, #34495e);  
}  .notebook {  max-width: 800px;  width: 90%;  padding: 30px;  background: #ffffff;  box-shadow: 0 8px 30px rgba(0, 0, 0, 0.15);  border-radius: 12px;  position: relative;  
}  h1, h2 {  text-align: center;  margin-bottom: 20px;  color: #3f51b5;  
}  button {  padding: 12px 20px;  border: none;  background-color: #3f51b5;  color: white;  border-radius: 5px;  font-size: 16px;  cursor: pointer;  transition: all 0.3s ease, transform 0.2s ease;  
}  button:hover {  background-color: #5c6bc0;  transform: translateY(-2px);  
}  .side-buttons {  position: absolute;  top: 30px;  right: 30px;  display: flex;  flex-direction: column;  gap: 10px;  
}  .page {  margin-top: 20px;  
}  .input-section,  
.search-section {  background-color: rgba(255, 255, 255, 0.9);  padding: 20px;  border-radius: 10px;  margin-bottom: 20px;  box-shadow: 0 2px 15px rgba(33, 37, 41, 0.1);  
}  .input-section h2,  
.search-section h2 {  margin-bottom: 15px;  color: #3f51b5;  
}  input[type="date"],  
input[type="text"],  
select {  width: 100%;  padding: 10px;  border-radius: 5px;  border: 1px solid #ddd;  margin-bottom: 15px;  transition: border-color 0.3s ease;  
}  input:focus,  
select:focus {  border-color: #3f51b5;  outline: none;  
}  .select-group {  display: flex;  justify-content: space-between;  
}  ul {  list-style-type: none;  padding: 0;  
}  li {  background: #fff;  margin-bottom: 10px;  padding: 12px 15px;  border-radius: 8px;  border-left: 4px solid #3f51b5;  transition: all 0.3s;  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);  justify-content: space-between; 
}  li:hover {  background: #f0f0f0;  
}  body.dark-theme .notebook {  background-color: #34495e;  
}  body.dark-theme button {  background-color: #5a8dee;  
}  body.dark-theme button:hover {  background-color: #4a76cc;  
}  body.dark-theme input[type="date"],  
body.dark-theme input[type="text"],  
body.dark-theme select {  background-color: #545a67;  color: #ddd;  border-color: #666;  
}  body.dark-theme h1,  
body.dark-theme h2,  
body.dark-theme li {  color: #ddd;  
}

js

let currentPage = 1;  // 初始化记事本  
function loadNotes() {  const notesList = JSON.parse(localStorage.getItem('notesList')) || [];  const notesListPage1 = document.getElementById('notesList');  const notesListPage2 = document.getElementById('notesListPage2');  notesListPage1.innerHTML = '';  notesListPage2.innerHTML = '';  notesList.forEach((note, index) => {  appendNoteToList(note, index, notesListPage1);  appendNoteToList(note, index, notesListPage2);  });  
}  // 追加事件到列表  
function appendNoteToList(note, index, list) {  const listItem = document.createElement('li');  listItem.textContent = `${note.date} (${note.category}, ${note.priority}): ${note.event}`;  const editButton = document.createElement('button');  editButton.textContent = '编辑';  editButton.style.marginLeft = '10px';  editButton.onclick = () => editNote(index);  listItem.appendChild(editButton);  const deleteButton = document.createElement('button');  deleteButton.textContent = '删除';  deleteButton.style.marginLeft = '10px';  deleteButton.onclick = () => deleteNote(index);  listItem.appendChild(deleteButton);  list.appendChild(listItem);  
}  // 添加事件到列表  
document.addEventListener('DOMContentLoaded', function () {  // 加载记事  loadNotes();  // 添加事件按钮  document.getElementById('addButton').addEventListener('click', function () {  const dateInput = document.getElementById('dateInput').value;  const eventInput = document.getElementById('eventInput').value;  const categoryInput = document.getElementById('categorySelect').value;  const priorityInput = document.getElementById('prioritySelect').value;  if (addNoteToList(dateInput, eventInput, categoryInput, priorityInput)) {  document.getElementById('dateInput').value = '';  document.getElementById('eventInput').value = '';  }  });  // 事件搜索功能  document.getElementById('searchInput').addEventListener('input', function () {  const filter = this.value.toLowerCase();  const notesList = JSON.parse(localStorage.getItem('notesList')) || [];  const filteredNotes = notesList.filter(note => note.event.toLowerCase().includes(filter));  displayNotes(filteredNotes);  });  // 导出和打印按钮  document.getElementById('exportNotes').addEventListener('click', exportNotes);  document.getElementById('printNotes').addEventListener('click', printNotes);  // 切换主题  document.getElementById('themeToggle').addEventListener('click', function () {  document.body.classList.toggle('dark-theme');  });  
});  // 加载记事  
function loadNotes() {  const notesList = JSON.parse(localStorage.getItem('notesList')) || [];  displayNotes(notesList);  
}  // 显示记事  
function displayNotes(notesList) {  const notesListElement = document.getElementById('notesList');  notesListElement.innerHTML = '';  notesList.forEach((note, index) => {  const listItem = document.createElement('li');  listItem.style.display = 'flex'; // 使用 Flexbox 布局  listItem.style.justifyContent = 'space-between'; // 使内容两边对齐  listItem.innerHTML = `${note.date} (${note.category}, ${note.priority}): ${note.event}`;  const buttonContainer = document.createElement('div'); // 创建一个容器来装按钮  buttonContainer.style.display = 'flex'; // 使用 Flexbox 布局  buttonContainer.style.gap = '10px'; // 按钮之间的间距  // 添加编辑按钮  const editButton = document.createElement('button');  editButton.textContent = '编辑';  editButton.onclick = () => editNote(index);  buttonContainer.appendChild(editButton);  // 添加删除按钮  const deleteButton = document.createElement('button');  deleteButton.textContent = '删除';  deleteButton.onclick = () => deleteNote(index);  buttonContainer.appendChild(deleteButton);  listItem.appendChild(buttonContainer); // 将按钮容器添加到列表项  notesListElement.appendChild(listItem); // 将列表项添加到列表  });  
}  // 添加事件  
function addNoteToList(dateInput, eventInput, categoryInput, priorityInput) {  if (dateInput && eventInput) {  const note = { date: dateInput, event: eventInput, category: categoryInput, priority: priorityInput };  const notesList = JSON.parse(localStorage.getItem('notesList')) || [];  notesList.push(note);  localStorage.setItem('notesList', JSON.stringify(notesList));  displayNotes(notesList);  return true;  } else {  alert('请填写日期和事件。');  return false;  }  
}  // 编辑事件  
function editNote(index) {  const notesList = JSON.parse(localStorage.getItem('notesList')) || [];  const note = notesList[index];  document.getElementById('dateInput').value = note.date;  document.getElementById('eventInput').value = note.event;  document.getElementById('categorySelect').value = note.category;  document.getElementById('prioritySelect').value = note.priority;  deleteNote(index);  
}  // 删除事件  
function deleteNote(index) {  const notesList = JSON.parse(localStorage.getItem('notesList')) || [];  notesList.splice(index, 1);  localStorage.setItem('notesList', JSON.stringify(notesList));  displayNotes(notesList);  
}  // 导出事件为文本文件  
function exportNotes() {  const notesList = JSON.parse(localStorage.getItem('notesList')) || [];  const notesText = notesList.map(note => `${note.date} (${note.category}, ${note.priority}): ${note.event}`).join('\n');  const blob = new Blob([notesText], { type: 'text/plain' });  const link = document.createElement('a');  link.href = URL.createObjectURL(blob);  link.download = 'notes.txt';  link.click();  
}  // 打印事件  
function printNotes() {  const notesList = JSON.parse(localStorage.getItem('notesList')) || [];  const notesText = notesList.map(note => `${note.date} (${note.category}, ${note.priority}): ${note.event}`).join('\n');  const printWindow = window.open('', '', 'height=400,width=600');  printWindow.document.write('<pre>' + notesText + '</pre>');  printWindow.document.close();  printWindow.print();  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/3756.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

川大华西团队发表关于早期癌症研究的综述,探索AI在预测癌症进展的应用|顶刊精析·24-11-05

小罗碎碎念 这篇文章于2024-10-21发表在《Nature Reviews Cancer》&#xff0c;是一篇关于早期癌症研究的综述文章&#xff0c;标题为《Emerging strategies to investigate the biology of early cancer》。 作者角色姓名单位名称&#xff08;中文&#xff09;第一作者Ran Zho…

AI 翻唱

本文记录用 So-vits-svc 4.1 训练模型全过程。 需要用到的工具 UVR&#xff1a;用于人声歌声分离&#xff0c;降噪。 (项目传送门) Slicer-gui(Audio-Slicer)&#xff1a;用于音频裁剪。(项目传送门) So-vits-svc 4.1&#xff1a;训练模型&#xff0c;GitHub项目中详细介绍…

讲讲⾼可用的原则?

大家好&#xff0c;我是锋哥。今天分享关于【讲讲⾼可用的原则&#xff1f;】面试题。希望对大家有帮助&#xff1b; 讲讲⾼可用的原则&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在当今信息化时代&#xff0c;随着互联网技术的快速发展&#xff0…

Java 基于SpringBoot+Vue 的公交智能化系统,附源码、文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Leetcode 二叉树中的最大路径和

算法思想 这道题要求在一棵二叉树中找到路径和最大的路径。路径可以从树中任意一个节点开始&#xff0c;到任意一个节点结束&#xff0c;但路径上的节点必须是连续的。 算法使用递归的方式来遍历树中的每个节点&#xff0c;并在遍历过程中计算包含当前节点的最大路径和。具体…

《2024中国城市音乐产业发展指数报告》重磅发布

11月4日,《2024中国城市音乐产业发展指数研究报告》(以下简称“报告”)在成都首次公开发布。该报告由中国音像与数字出版协会音乐产业促进工作委员会指导编制,道略产业研究院、四川音乐学院孙洪斌教授团队深度参与。 该指数评价对象涵盖直辖市、副省级城市和省会城市等共36个城…

解锁金融未来,Python带你玩转大数据!

厌倦了复杂的金融报表&#xff0c;想用数据驱动投资决策&#xff0c;却不知从何下手&#xff1f; 别担心&#xff01; 《Python金融大数据分析快速入门与案例详解》带你轻松入门&#xff0c;掌握数据分析利器&#xff0c;成为金融领域的弄潮儿&#xff01; 为什么选择这本书&…

STM32 + CubeMX + 硬件SPI + W5500 +TcpClient

这篇文章记录一下STM32W5500TCP_Client的调试过程&#xff0c;实现TCP客户端数据的接收与发送。 目录 一、W5500模块介绍二、Stm32CubeMx配置三、Keil代码编写1、添加W5500驱动代码到工程&#xff08;添加方法不赘述&#xff0c;驱动代码可以在官网找&#xff09;2、在工程中增…

template advanced

一.仿函数再探 stl_stack/queue-CSDN博客 在priority_queue中&#xff0c;我们介绍了仿函数作为第三个参数来改变堆的类型&#xff0c;而仿函数还有其他的用处。 那么我们是否可以借助优先级队列来对日期类进行排序呢&#xff1f; 答案是可以的&#xff0c;但前提是该日期…

spring源码[spring启动流程]

spring启动流程 AnnotationConfigApplicationContext的构造方法 1.父类构造方法&#xff0c;构造一个DefaultListableBeanFactory 在调用AnnotationConfigApplicationContext的构造方法之前&#xff0c;会调用父类GenericApplicationContext的无参构造方法&#xff0c;会构造…

使用Python做一个微信机器人

使用Python制作微信机器人是一个有趣且实用的项目&#xff0c;它可以让您自动化处理微信消息、监控微信群、甚至实现智能聊天等功能。 请求参数 Header 参数 export interface ApifoxModel {"X-GEWE-TOKEN": string;[property: string]: any; } Body 参数applicat…

Python-创建并调用自定义文件中的模块/函数

背景&#xff1a;在Python编程中&#xff0c;我们常常需要创建自己的专属文件&#xff0c;以便帮助我们更高效&#xff0c;快捷地完成任务。那么在Python中我们怎么创建并调用自己文件中的模块/函数呢? 在Python中调用自定义文件&#xff0c;通常是指调用自己编写的Python模块…

【C++】C++17结构化绑定、std::optional、std::variant、std::any

二十二、C17中的结构化绑定、std::optional、std::variant、std::any 本部分是一个小系列&#xff0c;介绍C17中新引入的、用来解决各种不同返回情况的、标准库新组件。 1、C的结构化绑定 结构化绑定structured bindings是C17中引入的一项特性&#xff0c;它允许开发者方便地…

ntkrnlmp.exe导致蓝屏死机的解决方法

在使用Windows操作系统的过程中&#xff0c;用户可能会遇到由ntkrnlmp.exe文件错误引发的蓝屏死机&#xff08;Blue Screen of Death, BSOD&#xff09;问题&#xff0c;这不仅影响了日常的工作效率&#xff0c;也可能造成数据丢失的风险。本文将为您提供一系列即时排查与修复n…

U3D游戏开发之骨骼动画相关

目录 1 作为U3D程序如何制作骨骼动画 2 骨骼动画程序代码相关 这个内容我在很久之前就想写了&#xff0c;很多项目也与骨骼动画挂钩&#xff0c;今天我们揭秘的是2D骨骼动画。来聊一聊大家可能非常关注的两个问题&#xff1a;作为程序如何制作骨骼动画&#xff1f;接到美术的骨…

java:题目:用Java实现简单的自取取款操作

import java.util.Scanner; public class ATM {public static void main(String[] args){//自主取款主类Scanner scnew Scanner(System.in);System.out.println("请输入账户号码&#xff1a;");String BankAccoutsrsc.nextLine();/BankAccout3 newBankAccoutnew Bank…

VLAN 高级技术 ——QinQ的配置

QinQ的概述&#xff1a; QinQ技术是一种扩展虚拟局域网&#xff08;VLAN&#xff09;数量空间的技术&#xff0c;通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来实现。以下是对QinQ技术的详细概述&#xff1a; QinQ技术的定义与背景 定义&#xff1a;QinQ&#xff08…

不得不承认供电公司信息宣传向媒体投稿的好方法找到了

初入国网供电公司,我被分配到了信息宣传部门,负责每月的信息宣传投稿任务。这项任务看似简单,实则充满挑战。一开始,我满怀热情,以为只要写出高质量的文章,就能顺利发表。然而,现实给了我当头一棒。传统的邮箱投稿方式,不仅竞争压力大,审核严格,而且周期漫长。每次投稿后,我总是…

『YOLOV5』| 一文搞定训练过程中的意外终止、以及想继续增加训练轮数!

文章目录 情况一&#xff1a;意外训练中断&#xff08;程序未训练完成&#xff0c;想完成目标训练轮数&#xff09;情况二&#xff1a;自动训练完成&#xff08;程序已完成训练&#xff0c;想增加训练轮数&#xff09; 情况一&#xff1a;意外训练中断&#xff08;程序未训练完…

GCC编译器的`-Wall`、`-Wextra`和`-pedantic`选项解读

gcc是广泛使用的开源编译器&#xff0c;-Wall、-Wextra和-pedantic是gcc中用于控制警告信息的选项&#xff0c;以下是详细介绍&#xff1a; -Wall&#xff08;启用大部分警告&#xff09; 功能&#xff1a;-Wall 选项用于启用一系列常用的警告信息&#xff0c;这些警告能帮助…