每日主題切換網頁:用純前端技術打造隨心情變化的動態界面

🎨 每日主題切換網頁:用純前端技術打造隨心情變化的動態界面

項目地址: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
英文地址,請注明出處:http://en.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;…