天气胶囊:网页上的微型气象站

532次阅读
8 条评论

共计 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 判断背后都是无数次调试的成果。”—— 某前端架构师点评


🛠️ 项目使用指南

📥 快速开始

  1. 下载项目文件

  2. 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>
  1. 同步加载 weather.cssweather.js

🎨 样式定制说明

  • 修改主题色:编辑 weather.css 中的 CSS 变量
  • 调整布局尺寸:通过修改 .weather-card 的宽高
  • 自定义动画效果:替换或新增 weatherIconMap 中的图标与动画函数

⚙️ 关键配置项

文件名 配置项 推荐操作
weather.js API_URL_BASE 替换为天气 API 的 id 和 key
weather.js TENCENT_MAP_API_KEY 申请并填写你自己的地图服务密钥
weather.css 所有 CSS 变量 匹配品牌视觉风格

💡 高级定制建议

  1. 更换天气图标

    // 修改为 Font Awesome 其他类名
    this.weatherIconMap[' 晴 '] = {
     icon: 'fa-sun-o',
     effect: this.animateSunshine
    };
  2. 新增天气类型

    this.weatherIconMap[' 雾 '] = {
     icon: 'fa-smog',
     effect: this.animateFog
    };
  3. 多语言支持
    updateDisplay() 方法中加入语言判断逻辑,轻松扩展不同语言版本。

  4. 多 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:悬停动画触发样式

⚡ 实用短代码集锦

  1. 地址清洗:name.replace(/[ 省市县区]$/, '')
  2. 错误降级:fallbackPlace = district || city || province
  3. 时间显示:new Date().toLocaleTimeString()
  4. 温度单位:${temperature}°C
  5. 风速格式:${windSpeed}级
  6. 湿度显示:${humidity}%
  7. 天气图标:fas ${weatherConfig.icon}
  8. 画布清空:ctx.clearRect(0, 0, 120, 120)
  9. 加载控制:loader.style.display = 'none'
  10. 内容显示:content.style.opacity = '1'

正文完
CNLOVAU的微信订阅号
post-qrcode
 3
本站所有内容皆在小程序同步更新
LAO WU
版权声明:本站原创文章,由 LAO WU 于2025-07-04发表,共计4169字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处!
🫶
如果本文对您有帮助的话,请不要忘了留下点赞和评论哟~
⚠️ 评论规则
一旦您发表评论,即代表您同意本站的评论规则,本站有权利对您的评论进行“批准、驳回、移至回收站”等操作
评论(8 条评论)
test 评论达人 LV.1
2026-01-08 11:40:04 回复

再试试看

 Windows  Chrome  中国安徽省合肥市联通
test 评论达人 LV.1
2026-01-08 11:06:11 回复

哇这么厉害

 Windows  Chrome  中国安徽省合肥市联通
grbox 评论达人 LV.1
2025-07-05 08:33:44 回复

支持大佬

 Android  Chrome  中国陕西省移动

CNLOVAU