每日主题切换网页:用纯前端技术打造随心情变化的动态界面

🎨 每日主题切换网页:用纯前端技术打造随心情变化的动态界面

项目地址:https://github.com/hhse/daily-theme-switcher

在线演示:https://hhse.github.io/daily-theme-switcher

这里写目录标题

  • 🎨 每日主题切换网页:用纯前端技术打造随心情变化的动态界面
    • 📖 项目简介
    • ✨ 核心特色
      • 🎯 智能时间感知
      • 😊 丰富的心情主题
      • 🎮 流畅的交互体验
    • 🛠️ 技术实现
      • 前端技术栈
      • 核心技术要点
        • 1. CSS变量系统
        • 2. 主题切换机制
        • 3. 响应式设计
        • 4. 动画效果实现
        • 5. 本地存储
    • 🎯 设计亮点
      • 1. 用户体验优化
      • 2. 性能优化
      • 3. 可扩展性
    • 📱 移动端适配
      • 触摸支持
      • 响应式布局
    • 🚀 部署方案
      • 1. GitHub Pages(推荐)
      • 2. Netlify
      • 3. Vercel
      • 4. 阿里云OSS/腾讯云COS
    • 🔧 自定义扩展
      • 添加新主题
      • 修改时间规则
    • 📊 项目结构
    • 🎨 主题预览
      • 清晨主题
      • 午后主题
      • 黄昏主题
      • 夜晚主题
    • 💡 技术总结
      • 学习要点
      • 应用场景
      • 扩展方向
    • 🔗 相关资源
    • 📝 结语

📖 项目简介

在这里插入图片描述

这是一个具有特色的动态主题切换网页,能够根据时间、心情或随机因素自动改变界面主题,为每次访问提供不同的视觉体验。项目采用纯前端技术栈,无需后端支持,可以直接部署到任何静态网站托管服务。

✨ 核心特色

🎯 智能时间感知

  • 自动主题切换:根据一天中的不同时间段自动切换主题
    • 🌅 清晨 (5:00-12:00):温暖的晨光主题,充满希望和活力
    • ☀️ 午后 (12:00-17:00):明亮的午后主题,充满活力和创造力
    • 🌆 黄昏 (17:00-20:00):温暖的夕阳主题,宁静而美好
    • 🌙 夜晚 (20:00-5:00):深邃的夜空主题,神秘而宁静

😊 丰富的心情主题

  • 多种心情选择:开心、平静、活力、浪漫等主题
  • 表情符号反馈:每个主题都有对应的表情和心情描述
  • 随机主题:每天随机选择,增加新鲜感

🎮 流畅的交互体验

  • 平滑动画:优雅的主题切换过渡效果
  • 粒子效果:点击释放彩色粒子动画
  • 颜色变换:动态改变界面色彩
  • 鼠标跟随:背景装饰跟随鼠标移动

🛠️ 技术实现

前端技术栈

  • HTML5:语义化标签,现代化结构
  • CSS3:CSS变量、Flexbox、Grid、动画
  • JavaScript ES6+:类、模块化、现代语法
  • 响应式设计:移动优先的设计理念

核心技术要点

1. CSS变量系统
:root {--primary-color: #4a90e2;--secondary-color: #f39c12;--accent-color: #e74c3c;--background-color: #f8f9fa;--surface-color: #ffffff;--text-primary: #2c3e50;--text-secondary: #7f8c8d;--border-color: #e9ecef;--shadow-color: rgba(0, 0, 0, 0.1);--gradient-start: #667eea;--gradient-end: #764ba2;
}

优势

  • 易于主题切换和维护
  • 支持动态修改
  • 浏览器兼容性好
2. 主题切换机制
class ThemeManager {constructor() {this.currentTheme = 'auto';this.themes = {auto: { name: '自动模式', description: '根据时间自动切换主题' },morning: { name: '清晨', description: '温暖的晨光主题,充满希望和活力' },// ... 更多主题};}applyTheme(theme) {const body = document.body;body.removeAttribute('data-theme');if (theme === 'auto') {theme = this.getTimeBasedTheme();}body.setAttribute('data-theme', theme);}getTimeBasedTheme() {const hour = new Date().getHours();if (hour >= 5 && hour < 12) return 'morning';else if (hour >= 12 && hour < 17) return 'afternoon';else if (hour >= 17 && hour < 20) return 'evening';else return 'night';}
}
3. 响应式设计
/* 桌面端 */
@media (min-width: 768px) {.container {max-width: 1200px;margin: 0 auto;}
}/* 平板端 */
@media (max-width: 768px) {.title {font-size: 2rem;}.control-buttons {gap: 8px;}
}/* 手机端 */
@media (max-width: 480px) {.title {font-size: 1.5rem;}.theme-btn {padding: 8px 12px;font-size: 0.8rem;}
}
4. 动画效果实现
/* 主题切换动画 */
.theme-transition {transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}/* 浮动动画 */
@keyframes float {0%, 100% {transform: translateY(0px) rotate(0deg);}50% {transform: translateY(-20px) rotate(180deg);}
}/* 粒子效果 */
.particle {position: absolute;width: 4px;height: 4px;background: var(--accent-color);border-radius: 50%;animation: float 3s ease-in-out infinite;
}
5. 本地存储
saveTheme() {localStorage.setItem('dailyTheme', this.currentTheme);localStorage.setItem('themeSwitchCount', this.switchCount);
}loadTheme() {const savedTheme = localStorage.getItem('dailyTheme');const savedCount = localStorage.getItem('themeSwitchCount');if (savedTheme) {this.currentTheme = savedTheme;}if (savedCount) {this.switchCount = parseInt(savedCount);}
}

🎯 设计亮点

1. 用户体验优化

  • 键盘快捷键:数字键1-8快速切换主题
  • 触摸手势:支持移动设备上下滑动切换
  • 实时反馈:主题切换时的视觉和动画反馈
  • 状态记忆:记住用户偏好和操作历史

2. 性能优化

  • CSS变量:减少重复代码,提高维护性
  • 事件委托:高效的事件处理机制
  • 防抖处理:优化频繁操作
  • 懒加载:按需加载资源

3. 可扩展性

  • 模块化设计:易于添加新主题和功能
  • 配置化:主题配置集中管理
  • 插件化:支持功能扩展

📱 移动端适配

触摸支持

// 触摸手势支持
let touchStartY = 0;
document.addEventListener('touchstart', (e) => {touchStartY = e.touches[0].clientY;
});document.addEventListener('touchend', (e) => {const touchEndY = e.changedTouches[0].clientY;const diff = touchStartY - touchEndY;if (Math.abs(diff) > 50) {if (diff > 0) {// 向上滑动 - 随机主题themeManager.setTheme('random');} else {// 向下滑动 - 自动模式themeManager.setTheme('auto');}}
});

响应式布局

  • Flexbox布局:灵活的响应式布局
  • Grid系统:现代化的网格布局
  • 媒体查询:多设备适配
  • 触摸优化:移动端交互优化

🚀 部署方案

1. GitHub Pages(推荐)

# 创建gh-pages分支
git checkout -b gh-pages
git push origin gh-pages# 在GitHub设置中启用Pages
# Settings > Pages > Source: Deploy from a branch

2. Netlify

  • 直接拖拽文件夹到Netlify
  • 或连接GitHub仓库自动部署

3. Vercel

  • 导入GitHub仓库
  • 自动检测并部署

4. 阿里云OSS/腾讯云COS

  • 上传静态文件
  • 配置CDN加速

🔧 自定义扩展

添加新主题

/* 在styles.css中添加 */
body[data-theme="your-theme"] {--primary-color: #your-color;--secondary-color: #your-color;--accent-color: #your-color;--background-color: #your-color;--surface-color: #your-color;--text-primary: #your-color;--text-secondary: #your-color;--border-color: #your-color;--shadow-color: rgba(your-color, 0.1);--gradient-start: #your-color;--gradient-end: #your-color;
}
// 在script.js中添加
this.themes = {// ... 现有主题'your-theme': { name: '你的主题', description: '主题描述' }
};this.moodData = {// ... 现有心情'your-theme': { icon: '🎨', text: '你的心情描述' }
};

修改时间规则

getTimeBasedTheme() {const hour = new Date().getHours();// 自定义时间规则if (hour >= 6 && hour < 10) return 'early-morning';else if (hour >= 10 && hour < 14) return 'mid-morning';else if (hour >= 14 && hour < 18) return 'afternoon';else if (hour >= 18 && hour < 22) return 'evening';else return 'late-night';
}

📊 项目结构

daily-theme-switcher/
├── index.html          # 主页面文件
├── styles.css          # 样式文件(包含所有主题)
├── script.js           # JavaScript功能文件
├── .gitignore          # Git忽略文件
├── README.md           # 项目说明文档
└── CSDN技术分享文章.md  # 本文档

🎨 主题预览

清晨主题

  • 主色调:温暖的红色和黄色
  • 背景:柔和的粉色
  • 心情:充满希望和活力

午后主题

  • 主色调:紫色和粉色
  • 背景:淡紫色
  • 心情:充满活力和创造力

黄昏主题

  • 主色调:粉色和黄色
  • 背景:温暖的粉色
  • 心情:宁静而美好

夜晚主题

  • 主色调:蓝色和紫色
  • 背景:深色主题
  • 心情:神秘而宁静

💡 技术总结

学习要点

  1. CSS变量系统:现代CSS的主题管理方案
  2. JavaScript类设计:面向对象的代码组织
  3. 响应式设计:多设备适配的最佳实践
  4. 动画效果:CSS和JavaScript动画的结合
  5. 本地存储:浏览器数据持久化
  6. 事件处理:用户交互的完整解决方案

应用场景

  • 个人博客:动态主题切换
  • 企业官网:品牌色彩展示
  • 产品展示:多主题演示
  • 学习项目:前端技术实践

扩展方向

  • 后端集成:用户主题偏好存储
  • AI主题:基于用户行为的智能推荐
  • 主题市场:用户自定义主题分享
  • 插件系统:第三方主题和功能扩展

🔗 相关资源

  • CSS变量 MDN文档
  • JavaScript类 MDN文档
  • CSS动画 MDN文档
  • 响应式设计指南

📝 结语

这个项目展示了现代前端技术的综合应用,通过CSS变量、JavaScript类和响应式设计,实现了一个功能完整、体验优秀的动态主题切换网页。项目代码结构清晰,易于理解和扩展,适合作为前端学习项目或实际应用。

希望这个项目能够为你的前端学习之路提供一些启发和帮助!如果你有任何问题或建议,欢迎在GitHub上提交Issue或Pull Request。


项目地址:https://github.com/hhse/daily-theme-switcher

在线演示:https://hhse.github.io/daily-theme-switcher

欢迎Star和Fork!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TOPSIS(Technique for Order Preference by Similarity to Ideal Solution )简介与简单示例

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

uniapp 富文本rich-text 文本首行缩进和图片居中

1. uniapp 富文本rich-text 文本首行缩进和图片居中 1.1. rich-text 文本首行缩进使用 rich-text 组件渲染html格式的代码&#xff0c;常常因为不能自定义css导致文本不能缩进&#xff0c;以及图片不能居中等问题&#xff0c;这里可以考虑使用js的replace方法&#xff0c;替换…

Apple基础(Xcode③-Singbox Core)

brew install go open ~/.bash_profile export PATH="$PATH:$(go env GOPATH)/bin" 先确保工具链完整 go install github.com/sagernet/gomobile/cmd/gomobile@v0.1.4 go install github.com/sagernet/gomobile/cmd/gobind@v0.1.4 gomobile init -v # 关键:-v …

JVM学习日记(十四)Day14——性能监控与调优(一)

经过前几篇的铺垫&#xff0c;现在开始正式进入调优篇&#xff0c;也是大火实际用的到的和感兴趣的&#xff0c;但是前期的知识积累还是有必要的&#xff0c;所以还对JVM基础没什么了解的&#xff0c;建议还是回看主包的前几篇内容&#xff0c;当然看其他优秀的博主也是可以的。…

使用 Elasticsearch 和 AI 构建智能重复项检测

作者&#xff1a;来自 Elastic Dayananda Srinivas 探索组织如何利用 Elasticsearch 检测和处理贷款或保险申请中的重复项。 Elasticsearch 带来了大量新功能&#xff0c;帮助你为你的使用场景构建最佳搜索方案。深入了解我们的示例 notebooks&#xff0c;开始免费云试用&#…

如何在不依赖 Office 的情况下转换 PDF 为可编辑文档

在日常工作里&#xff0c;我们经常需要处理各种文件格式的转换问题&#xff0c;像Word转PDF或者PDF转Excel这样的需求屡见不鲜。它是一款功能全面的PDF转换工具&#xff0c;能够帮助你轻松应对多种文档处理任务。不仅能够实现PDF与其他格式之间的转换&#xff0c;如Word、Excel…

嵌入式学习笔记-MCU阶段--DAY09

1. oled屏幕的接口IIC应用场合&#xff1a;2.IIC通信原理概念&#xff1a;IIC&#xff08;Inter-Integrated Circuit&#xff09;其实是IICBus简称&#xff0c;所以中文应该叫集成电路总线&#xff0c;它是一种串行通信总线&#xff0c;使用多主从架构&#xff0c;由飞利浦公司…

解决 Node.js 托管 React 静态资源的跨域问题

在 Node.js 项目中托管 React 打包后的静态资源时&#xff0c;可能会遇到跨域问题&#xff08;CORS&#xff09;。以下是几种解决方案&#xff1a; 1. 使用 Express 中间件设置 CORS 头 const express require(express); const path require(path); const app express();// …

【Linux】多路转接之epoll

优化poll进行拷贝的开销poll开销过大将整个 pollfd 数组拷贝到内核态&#xff0c;以便内核检查 fd 是否就绪&#xff08;从用户态 → 内核态&#xff09;。内核检查 fd 状态&#xff0c;并填充 revents。将 pollfd 数组从内核态拷贝回用户态&#xff0c;让应用程序可以读取 rev…

下载一个JeecgBoot-master项目 导入idea需要什么操作启动项目

官网&#xff1a;开发环境搭建 | JEECG 文档中心 一般做开发的电脑里都是有的&#xff0c;没有的只能下载了 前端安装 node官网:https://nodejs.org/zh-cnpnpm安装:通过命令 后端安装: jdk17 :https://www.oracle.com/cn/java/technologies/downloads/#java17maven :https://m…

解决 InputStream 只能读取一次问题

是的&#xff0c;InputStream 的一个重要特性是它通常只能被读取一次。这是因为&#xff1a;输入流通常是单向的、顺序访问的数据源很多流&#xff08;如网络流、文件流&#xff09;读取后指针就移动了&#xff0c;无法回退有些流&#xff08;如Socket流&#xff09;甚至读取后…

数据分析面试题

技都测试 1、请列举5个 Excel 中常用的函数及写法。[ if ] IF(A1>60, "及格", "不及格") —— 若 A1 单元格数值≥60&#xff0c;返回 “及格”&#xff0c;否则返回 “不及格”。IF(B2>100, B2*0.8, B2) —— 若 B2 数值 > 100&#xff0c…

【07】VisionMaster入门到精通——Blob分折

文章目录0 视屏讲解与演示1 案例演示2 参数详解1 运行参数0 视屏讲解与演示 1 案例演示 周长使能查找U型槽 短轴使能查找U型槽 面积筛选区域 当条件不符合是&#xff0c;该模块显示红色&#xff0c;状态为NG 显示二值图像 显示Blob图像 2 参数详解 Blob分折&#xff0c;…

解释 MySQL 中的 EXPLAIN 命令的作用和使用场景

解释 MySQL 中的 EXPLAIN 命令的作用和使用场景 总结性回答 EXPLAIN 是 MySQL 中用于分析 SQL 查询执行计划的命令&#xff0c;它能展示 MySQL 如何执行一个查询&#xff0c;包括使用的索引、表连接顺序、扫描行数等关键信息。主要用于查询性能优化&#xff0c;帮助开发者识别潜…

.env 文件

.env 文件其实就是一个纯文本文件&#xff0c;用来写“环境变量”键值对&#xff0c;格式非常简单 &#x1f447;✅ .env 文件写法格式&#xff1a;每一行就是一个变量名 值&#xff0c;不要加引号&#xff0c;不要加空格DEEPSEEK_API_KEYsk-xxxxxxxxxxxxxxxxxxxx完整例子&…

机器学习——K 折交叉验证(K-Fold Cross Validation),案例:逻辑回归 交叉寻找最佳惩罚因子C

什么是交叉验证&#xff1f; 交叉验证是一种将原始数据集划分为若干个子集&#xff0c;反复训练和验证模型的策略。 交叉验证&#xff08;Cross-Validation&#xff09;适用于你在模型调参&#xff08;如逻辑回归中的 C&#xff09; 最常用的&#xff1a;K 折交叉验证&#…

蓝桥杯----串口

&#xff08;五&#xff09;、串口1、串口通信简介制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发&#xff0c;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统&#xff0c;串口USART有两根通信线Tx、Rx&#xff0c;可同时双向通信&#xff0c;称之为…

错误: 找不到或无法加载主类 原因: java.lang.ClassNotFoundException

背景&#xff1a; 代码没有更改&#xff0c;主类位置也没有移动&#xff0c;运行时突然报找不到或无法加载主类的错误 错误: 找不到或无法加载主类 原因: java.lang.ClassNotFoundException编译器上方显示 Java file is located outside of the module source root so it wont …

Lock 接口及实现类详解:从 ReentrantLock 到并发场景实践

在 Java 并发编程中&#xff0c;除了synchronized关键字&#xff0c;java.util.concurrent.locks.Lock接口及其实现类是另一种重要的同步机制。自 JDK 5 引入以来&#xff0c;Lock接口凭借灵活的 API 设计、可中断的锁获取、公平性控制等特性&#xff0c;成为复杂并发场景的首选…

「iOS」————SideTable

iOS学习前言sideTableSlideTablesSideTableBufSideTable前言 我们在上一篇中&#xff0c;简单的介绍了weak的实现原理。其中弱引用表就是存储在SideTable中的&#xff0c;这里我们来学习了解一下SideTable sideTable sideTable主要用于存储和管理对象的额外信息&#xff0c;…