2006 年,我有一个想法,就是利用 雅虎天气 API 作为数据源,在公司的网站上显示实时天气信息。 然而,当时唯一有效的方法是使用 Flash,而公司由于开发时间的原因不愿意这样做。
六年后,作为我自己的公司 Engage Web 的技术总监,我重新审视了这个想法,并将其提升了几个阶段。 2012 年,Flash 不再必要,因为它在 2006 年所能做的所有事情现在都可以用 CSS3 Keyframes 完成。
我们的目标是让网站使用浏览者的地理位置来显示实时天气状况。 我们希望一天中的时间能够根据用户所在的地理位置进行反映,例如,在英国伦敦查看网站的用户看到的是与在美国加利福尼亚州圣地亚哥的用户在同一时间查看网站所看到的不同的样式。 目标是让人们可以通过我们的网站看到窗外的天气状况。
以下只是一些网站标题在任何给定时间可能呈现的最终状态的示例







不幸的是,我们遇到了由网页开发人员的旧敌人 Internet Explorer 引起的某些技术上的直接障碍。 IE 无法处理地理定位,因此无法从用户浏览器中获取其位置的准确近似值。 相反,我们不得不使用 IP 查询 API 来获取用户的位置,该位置仅精确到用户最近的首府城市(或大城市)。 为此,我们使用了 ipinfodb.com。 基于输入到该网站的 IP 地址,它会返回用户的国家、州/省和城市/镇。 我们只需要国家和城市/镇,然后将其输入到雅虎天气 API 中,返回该地区的实时天气数据。
如果没有从 ipinfodb.com 返回数据(例如,如果网站出现故障,或者无法从用户那里检索 IP 数据),则位置将默认为英国伦敦。
雅虎天气 API 和 ipinfodb.com 都会返回经度和纬度,然后使用这些经度和纬度来计算日落和日出时间,进而触发网站上的日出和日落。
最后的点睛之笔是月相,这是所有计算中最复杂的,尽管它只需要日期作为变量。
晴天还是雨天
让我们从天气开始。 雅虎以数字形式返回天气信息,目前在 0-47 之间,无信息时显示错误号 3200。 每个数字都代表不同的天气类型。
0 tornado
1 tropical storm
2 hurricane
3 severe thunderstorms
4 thunderstorms
5 mixed rain and snow
6 mixed rain and sleet
7 mixed snow and sleet
8 freezing drizzle
9 drizzle
10 freezing rain
11 showers
12 showers
13 snow flurries
14 light snow showers
15 blowing snow
16 snow
17 hail
18 sleet
19 dust
20 foggy
21 haze
22 smoky
23 blustery
24 windy
25 cold
26 cloudy
27 mostly cloudy (night)
28 mostly cloudy (day)
29 partly cloudy (night)
30 partly cloudy (day)
31 clear (night)
32 sunny
33 fair (night)
34 fair (day)
35 mixed rain and hail
36 hot
37 isolated thunderstorms
38 scattered thunderstorms
39 scattered thunderstorms
40 scattered showers
41 heavy snow
42 scattered snow showers
43 heavy snow
44 partly cloudy
45 thundershowers
46 snow showers
47 isolated thundershowers
然后我们将天气类型分为四个数字。 第一个数字控制云层,它们有多亮或多暗,以及有多浓密。 第二个数字控制降雨。 网站上有不同程度的降雨,从小雨到暴雨不等。 第三个数字控制效果,例如闪电或雪,第四个数字用于偶然效果,例如灰尘或雾。
$weatherarray[39]=array('scattered thunderstorms',3,2,5,2);
$weatherarray[40]=array('scattered showers',3,2,0,2);
$weatherarray[41]=array('heavy snow',1,0,3,0);
我们在英国看到的比较常见的一种效果是降雨(我们有很多降雨),因此以下是我们在网站上如何实现降雨效果的。 以下动画降雨 gif 会以合适的透明度显示,具体取决于雅虎天气 API 中报告的降雨量。 我们以前的代码从雅虎获取信息,并为降雨强度分配变量,这些变量控制以下代码中动画降雨 gif 的透明度。


switch ( $effect1) {
case 0:
$weathercode.= '
jQuery(\'#rain\').css("opacity", "0.0");
';
break;
case 1:
$weathercode.= '
jQuery(\'#rain\').css("opacity", "0.10");
';
break;
case 2:
$weathercode.= '
jQuery(\'#rain\').css("opacity", "0.30");
';
break;
case 3:
$weathercode.= '
jQuery(\'#rain\').css("opacity", "0.50");
';
break;
}
满月、半月、月全食
整个过程中最困难的部分是月相。 为此,我们创建了一张包含 10 种不同月相变异的大图像。 CSS 然后根据从 PHP 脚本返回的数据决定如何显示正确的图像(这些计算,从字面上说,是天文计算)。
background-position: <?php echo $moonbgimagepos; ?>px 0;


计算月相的脚本来自 这里 的代码。
距离日落还有 300 秒
这个项目最精彩的部分是日落和日出效果,它会根据查看网站的用户的实际日落和日出时间发生。 利用我们之前提到的经度和纬度,会推算出日落和日出时间(具体取决于当前是白天还是黑夜),将其转换为 Unix 时间戳,并存储为变量。
当前时间也转换为 Unix 时间戳,将日落或日出时间与当前时间之间的差值用作 jQuery 函数的超时时间,该函数处理白天和黑夜之间的转换,反之亦然。
以下 jQuery 控制三个阶段之间的转换。 日落时,“白天”背景会淡出,并被橙色辉光背景(用于日落和日出)替换,而橙色辉光背景本身随后又会淡出成夜间背景。 同时,太阳本身开始从页面顶部下降到页面底部,这需要 300 秒才能完成。
jQuery('#daytime').fadeOut(200000, 'linear', function() {
jQuery('#sill').fadeOut(100000, 'linear', function() {});
jQuery('#sunset').fadeOut(100000, 'linear', function() {});
});
在此过程中,任何相关的 天气效果也会叠加在屏幕上,例如降雨、降雪、闪电和云层移动。 作为附加效果,天际线也从白天主题过渡到夜间主题,以显示建筑物逐渐变得黑暗,城市灯光亮起。
昼夜交替
作为附加效果,网站的附加样式元素(例如着色效果)会根据时间是白天还是黑夜而改变。 这是通过在建立变量后使用 PHP 文件作为 CSS 来完成的。
<link rel="stylesheet" type="text/css" href="/css/styleweather.php" />
但是,如果您恰好在太阳下山或日出时访问网站,您会看到天际线和网站主题在白天过渡到黑夜时发生变化,反之亦然。 以下代码使用 jQuery 控制此过程
jQuery('#backmask').animate( {
color: '#fff',
backgroundColor: '#48508b'
},300000, 'linear' );
jQuery('#menu-top-menu li,#blogmenu,#searchbox, #times').animate( {
color: '#fff',
backgroundColor: '#48508b'
},300000, 'linear' );
jQuery('#Phone').animate( {
color: '#fff',
backgroundColor: '#48508b',
boxShadow: '0 -10px 10px 4px #2A3160 inset'
},300000, 'linear' );
测试,测试,123
在构建由用户经度和纬度推算出的日落和日出时间触发的功能时,测试该效果本身就是一项任务。 这需要计算出世界上太阳即将升起的地方,然后通过该国家的代理服务器连接到网站以检查时间。 在这个项目中,我们学到了很多关于地理、时区和日出时间的知识!
以下是 网站 的屏幕截图,显示效果正常

感谢设计师/开发人员 Steven Morris 为这个项目完成的设计工作。
Darren,很棒的作品。
喜欢这个项目的创意想法。 还有它的工作方式……太棒了!
像你这样的人(还有你,Chris,当然 ;) )让我在网页设计/前端开发这个广阔的世界里不断追寻新的职业生涯。
谢谢!
不久前,我梦想着这样一个项目,但没有实际完成它的动力。 这样的东西可以帮助支持人工智能项目,——目前的天气会影响在线人工智能创作的心情。
当前事件也可以决定在线人工智能机器人的心情。 可以用多种方法为新闻中事件的优劣程度建立索引……但让人工智能对当前事件提出自己的观点听起来非常棘手。
Darren,非常有创意。
你好,你能帮助我进入 CSS 领域吗? 我在进行 CSS 设计时遇到了一些问题
我无法做到。 如果我需要练习的话? 指导我学习 CSS 的知识
谢谢
一种超凡脱俗的创造力。Darren 做得好,令人难过的是,即使在 2012 年,IE 仍然很糟糕!
不错!我用一个从未发布过的页面做了同样的事情。我获取了用户的地理位置,创建了一个谷歌地图,以用户位置为中心,然后用谷歌天气(这可能不再有效)检查,然后添加一个图层(将透明度设置为一个不错的值)并使用天气图像(雨、雪、云等等)。如果我有时间,我可能会在某个地方发布说明:)很棒的工作!
感谢各位的精彩评论。我今天需要给 Chris 发邮件,并在我们的设计师姓名附加到此,因为所有辛苦工作都是他做的。这个项目的编码者是 Steven Morris - 他应该得到赞扬。
哇!这太棒了:D
这正是我需要为航海网站实现的东西。灵感!
你为什么使用 jQuery 而不是 $?
是为了确保无冲突。
有意思。无冲突到底是什么?意思是另一个程序正在使用美元符号吗?
是的,来自 codeconquest 的 Charles,这正是原因!
jQuery 或 $ 不是唯一使用 $ 的 javascript 库。我不打算假装自己对这里的事情很了解,所以我建议你访问 https://api.jqueryjs.cn/jQuery.noConflict/ 来学习如何防止你的库相互冲突!
优秀文章!嘿 Chris - 你不觉得,如果我们有“推文”按钮和“点赞”按钮来发表文章,那会很不错吗?
不错的概念,但执行力充其量只能说马马虎虎。你可以看到蓝色像素,因为建筑物图像没有被正确剪切,这些建筑物没有抗锯齿,并且所有内容都使用低质量的图像。公平地说,网站的其余部分也是类似的混乱。菜单按钮上的十年以前的难看的银色渐变,看起来格格不入的页脚(说真的,过渡在哪里?),标题中的分享按钮。给自己一个帮助,解雇你的设计师吧。
告诉你别人不敢说的话,从 1985 年开始。
我同意。网站让人有很多遐想。虽然他们是一家社交媒体公司,所以对我来说,顶部的分享按钮在某种程度上是有意义的。仅仅因为 logo 是紫色的,并不意味着网站的其余部分也需要是紫色的。就是这样。
喜欢它,这太棒了
代码忍者。太棒了!
真是太棒的帖子了。CSS-Tricks 总是充满了很酷的东西,但这树立了标准。
从概念上来说,很棒。执行力值得怀疑。
很棒的 IDEA
你第一句话有一个错别字,我敢肯定你不是技术总监y:)
我们不配!太棒了。
向 Steven Morris 致敬。
我也很喜欢月相的方法。我真的很喜欢阅读,还有这种艰巨任务所需的“坚持不懈”。
很棒的工作,感谢分享!
当我看到像这样的帖子时,我意识到,在这一切方面,我还是一个蚱蜢……很棒的帖子……感谢分享你的知识……
Dunstan 几年前就做到了。
有人能告诉我,如何下载这些很棒的东西吗?
Darren,很棒的帖子,喜欢这个概念。
几周前我开始了一个类似的项目,唯一的区别是天气是用一个使用 threejs 的卡通 webgl 3d 场景显示的。但我遇到了一个大问题。在雅虎天气 API 网站上,他们说
“对于天气 RSS 提要,有两个参数
w 代表 WOEID。
u 代表度数单位(华氏度或摄氏度)。
WOEID 参数 w 是必需的。使用此参数以 WOEID 的形式指示天气预报的地理位置。”
如何动态地找到客户端位置的 WOEID?
谢谢
J
你可以使用地名、经纬度和其他值查询雅虎 API,它会为你返回一个 WOEID。
需要一个雅虎 API 密钥,但查询地址是 http://where.yahooapis.com/geocode 然后添加你的参数
它甚至可以接受“伦敦”或“格拉斯哥”之类的纯文本
希望这有帮助
这正是我需要的,非常感谢!
Jonas
它会自动选择访问者的位置,还是只显示手动选择的城市?
此外,插件对资源使用有什么影响?
致敬
嗨 Chris(和 Darren) - 很棒的文章,我喜欢你将 CSS 推向极限的方式,我现在还有另外一个挑战……我不知道它是否可以实现。
如果下雨了 - 那就很悲伤了,生成的图形会是黑暗、阴雨和毫无生气的……所以,有没有可能查看预报,然后告诉我们什么时候会是晴天(好天气)。你能让 php 代码查询雅虎 API 并找到该 IP 下一个晴天吗?
然后,你始终可以显示一张晴天图片,并可能显示一条消息“不用担心 - 你所在位置的下一个晴天是星期二……等等”。
这可能比仅仅告诉人们当前的天气状况更人性化。
很棒的文章,Darren!你在那里应用了一种非常有创意的技术。
非常棒的提示,感谢分享,Darren!
喜欢这个,很高兴分享知识:) 10x
很棒的文章!非常感谢!
哇,太棒了!东西
这绝对是一项很棒的工作。即使这并不简单 - 这仍然很棒。这是值得写信回家的东西。很棒的工作!
2007年,我在纽约做了这件事。天气、时间、月相和帝国大厦的颜色都与现实世界相符。有时我窗外看到的景色与现实惊人地相似,有时则不太像。但2009年有一次,纽约下了雷雪,我非常高兴我把它做进去了,即使它只出现了1-2个小时而已。
http://newyorkontap.com/newyorkskyline.asp