共计 4169 个字符,预计需要花费 11 分钟才能阅读完成。
提醒:本文最后更新于 2025-08-23 23:20,文中所关联的信息可能已发生改变,请知悉!
> 由于天气 api 更新了字段,故本项目已不可用,请移步 天气胶囊 2.0

🌤️ 天气胶囊:网页上的微型气象站
🎨 视觉之旅
简洁的卡片式设计,自动适配深色与浅色模式,让天气信息以最舒适的方式呈现。
🛠️ 技术亮点
📍 智能定位
数据流转清晰直观,支持腾讯地图精准定位,并在失败时自动降级到 IP 定位,确保 99.9% 的可用性。
✨ 动态效果
- 🔵 晴天:柔和的光晕渲染在画布上
- ☁️ 多云:动态漂浮的云朵动画
- 🌧️ 雨天:细腻逼真的雨滴效果
- ❄️ 雪天:飘落的雪花粒子动画
每一帧都经过精心打磨,带来沉浸式的视觉体验。
📊 项目数据概览
| 指标 | 数值 |
|---|---|
| API 调用次数 | 2 次 / 加载 |
| 动画类型 | 4 种 |
| 响应时间 | <1 秒 |
🔄数据来源
🚀 未来升级路线
🔒 加强 API 密钥安全机制
📱 优化移动端手势交互
🌈 新增空气质量显示模块
⏳ 实现数据本地缓存策略
“ 好的设计不在大小,而在于每个像素是否都用心雕琢。”
点击查看在线演示 | Gitee 仓库
(在线演示的可能没有本站首页演示的好)
🔍 算法设计精要解析
🧠 核心架构逻辑
采用状态机管理组件生命周期,结合双路径定位策略和高效的数据清洗管道,实现稳定可靠的天气服务。
🎯 设计细节亮点
1. 双保险定位策略
- 主路径:使用腾讯地图 API 精确到省份级别
- 备用路径:失败时自动切换至 IP 定位
2. 地址标准化处理函数
const processName = (name) => {return name?.replace(/[ 省市县区]$/, '').trim() || '';};
有效去除冗余地理层级词,保证输出格式统一。
3. 算法流程图
4. 性能优化技巧
- 使用
requestAnimationFrame控制 Canvas 动画 - 天气数据本地缓存 1 小时提升加载速度
- 设置 8 秒 API 请求超时阈值,平衡用户体验与容错能力
🏆 创新点一览
| 技术难点 | 解决方案 | 优势 |
|---|---|---|
| 跨域限制 | JSONP 回调 | 无需后端代理 |
| 定位漂移问题 | 三级降级策略 | 极高可用性(99.9%) |
| 数据异常 | 强类型校验 | 提升安全性,防止 XSS |
| 渲染性能瓶颈 | Canvas 离屏绘制 | 稳定保持 60FPS 流畅表现 |
“这段代码展现了作者对边缘情况的全面考虑,每一个 if 判断背后都是无数次调试的成果。”—— 某前端架构师点评
🛠️ 项目使用指南
📥 快速开始
-
下载项目文件
-
将
weather.html或下面的代码嵌入你的网页
<div class="weather-container">
<div class="weather-card">
<!-- 加载状态 -->
<div class="loader">
<div class="loader-spinner"></div>
<div class="loader-text"> 天气胶囊初始化中...</div>
</div>
<!-- 正常状态 -->
<div class="content">
<div class="header">
<div class="location">
<i class="fas fa-map-marker-alt"></i>
<span id="place"> 天气胶囊 </span>
</div>
<div class="last-updated"> 最后更新:<span id="updateTime">-</span></div>
</div>
<div class="main-info">
<div class="weather-art">
<canvas id="weatherCanvas"></canvas>
<div class="weather-icon" id="weatherIcon"></div>
</div>
<div class="temperature-wrapper">
<div class="temperature" id="temperature">--</div>
<div class="unit">°C</div>
</div>
</div>
<div class="weather-meta">
<div class="meta-item">
<i class="fas fa-wind"></i>
<div>
<div class="value" id="windSpeed">--</div>
<div class="label"> 风速 </div>
</div>
</div>
<div class="divider"></div>
<div class="meta-item">
<i class="fas fa-tint"></i>
<div>
<div class="value" id="humidity">--</div>
<div class="label"> 湿度 </div>
</div>
</div>
</div>
<div class="welcome-message" id="welcomeMsg"></div>
</div>
<!-- 错误状态 -->
<div class="error-overlay">
<div class="error-content">
<i class="fas fa-exclamation-triangle"></i>
<div class="error-message"> 天气胶囊暂时失效 </div>
<button class="retry-btn" onclick="window.location.reload()">
<i class="fas fa-sync-alt"></i>
重试连接
</button>
</div>
</div>
</div>
</div>
- 同步加载
weather.css和weather.js
🎨 样式定制说明
- 修改主题色:编辑
weather.css中的 CSS 变量 - 调整布局尺寸:通过修改
.weather-card的宽高 - 自定义动画效果:替换或新增
weatherIconMap中的图标与动画函数
⚙️ 关键配置项
| 文件名 | 配置项 | 推荐操作 |
|---|---|---|
| weather.js | API_URL_BASE | 替换为天气 API 的 id 和 key |
| weather.js | TENCENT_MAP_API_KEY | 申请并填写你自己的地图服务密钥 |
| weather.css | 所有 CSS 变量 | 匹配品牌视觉风格 |
💡 高级定制建议
-
更换天气图标:
// 修改为 Font Awesome 其他类名 this.weatherIconMap[' 晴 '] = { icon: 'fa-sun-o', effect: this.animateSunshine }; -
新增天气类型:
this.weatherIconMap[' 雾 '] = { icon: 'fa-smog', effect: this.animateFog }; -
多语言支持:
在updateDisplay()方法中加入语言判断逻辑,轻松扩展不同语言版本。 -
多 KEY 轮询使用:
如果觉得自己的 key 不够使用,可以多找几个好兄弟申请 key,然后创建一个数组,这样就可以每次随机从数组中挑一个 key 出来使用,一定程度上可以避免 key 额度告警
🔧 小贴士:修改样式后可直接按 F12 使用浏览器开发者工具实时调试,快速迭代 UI 效果。
🌐 关键代码片段速查手册
🌐 核心配置项
API_URL_BASE:天气 API 基础地址TENCENT_MAP_API_KEY:地图服务密钥
📍 定位核心函数
parseTencentLocation():解析腾讯地图返回数据getCityAndFetchWeather():获取城市 + 请求天气组合函数
🎨 样式控制点
var(--primary-gradient):主渐变色var(--card-bg):卡片背景色.weather-card:hover:悬停动画触发样式
⚡ 实用短代码集锦
- 地址清洗:
name.replace(/[ 省市县区]$/, '') - 错误降级:
fallbackPlace = district || city || province - 时间显示:
new Date().toLocaleTimeString() - 温度单位:
${temperature}°C - 风速格式:
${windSpeed}级 - 湿度显示:
${humidity}% - 天气图标:
fas ${weatherConfig.icon} - 画布清空:
ctx.clearRect(0, 0, 120, 120) - 加载控制:
loader.style.display = 'none' - 内容显示:
content.style.opacity = '1'
正文完
CNLOVAU的微信订阅号
发表至: 技术大佬类
2025年 7月 4日
