Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >手撸一个前端天气卡片

手撸一个前端天气卡片

作者头像
戴兜
发布于 2023-02-23 02:03:32
发布于 2023-02-23 02:03:32
1.8K00
代码可运行
举报
文章被收录于专栏:daidrdaidr
运行总次数:0
代码可运行

自己亲手做一个天气卡片组件的想法其实很早就有了,但是做起来难度还是很大的(布局、数据源、天气展示、自适应),最终不了了之。最近学校社团面试题目是做一个天气卡片,正好可以借此机会趁着国庆小长假静下心来好好研究一番。于是就有了今天的这篇文章。 (实际上在国庆小长假之前就基本上把问题搞定了)目前版本的DouWeather托管在临时仓库,因为没有考虑代码结构,后期维护困难。可以watch一下这个仓库关注后续进展,我会抽时间重构下代码并在这个仓库更新。

Ⅰ.设计构思阶段

1. 灵感来源

我给DouWeather(后称DW)的定位是网页小组件,也是出于这个考虑,我参考了如iOS系统的小部件、新版MIUI系统小组件、鸿蒙系统小部件、win11小组件,发现都无一例外具有同一特征:扁平化,圆角,选用无衬线字体,元素风格简洁,并且四者都在或背景或图标中大量使用渐变,使小部件表现得较为灵动。其中win11小部件添加了浅阴影,可能是为了让小部件从亚克力背景中凸显出来。

于是乎,我也照猫画虎,设计了DW的晴天图标,并且用XD设计出了第一种卡片样式(现DW的medium卡片样式)。

注: DouWeather的设计也参考了google adsense(MD2),mew等网站的设计风格。

将medium类样式的卡片缩短,便衍生出了一个正方形的small样式小组件。

之前心血来潮想写天气卡片的时候也做过图,当时参考的MD风格,正好趁着国庆回家从电脑里边翻了出来,下面便不知道多久前天气卡片的初稿…就…蛮抽象的…

2. 图标设计

DW中许多要素都借鉴了小米天气,图标也是如此。DW尽量保证图标整体风格简洁,使用大块的渐变背景突出天气特点。在正式开干前,我就仿照小米天气做出了晴、阴、多云这三个图标,方便之后的设计和开发。格式依然采用了svg,控制组件整体的体积,保证加载速度。

开发过程中受到室友启发,尝试为天气图标增加了一些动画,不过有些喧宾夺主,最后不了了之。

3. normal样式和detail样式?

开发前我其实仅仅计划做出两种样式(即small和medium)。做normal样式的主要原因,是开发过程中我发现:当medium样式被置于一个宽度过大的元素上方时,会显得内容空洞,不够美观。于是便在medium样式的基础上,加长了宽度,增加了空气质量、防晒建议等数据展示。而detail样式,纯粹是因为我对小米天气的趋势预报爱得深沉,想要在DW中复刻一个出来。

Ⅱ. 开发阶段

1. 不借助构建工具如何优雅地使用Web Components?

在写天气卡片前,我只使用过一次Web Components,那是在原神玩家信息查询中,当时是因为有很多重复的要素(角色信息),所以想尝试用这个新鲜玩意封装一下。得到的教训就是:如果不用构建工具,又想要较为优雅地开发,template标签是必不可少的,否则维护代码简直要了我的老命。

2. 如何优雅地显示图标?

天气图标会在卡片中大量复用(尤其是detail样式),如果没有一个比较简洁的调用方式,维护起来会很困难。并且在开发时图标仅设计了3个,需要顾及开发后期如何便捷地对图标增删改,尽量降低图标检索和主体代码间的耦合度。在前端中,一般有下面几种图标引入方式:

① 使用@font-face引入图标字体文件

大型图标字体一般都采用这种方式,如Font Awesome和Material Icons。优点是操作直观,能够使用font-size或者color直接修改图标展现形式,而且得益于浏览器对colr的支持,能够使用彩色图标字体。不过缺点也很明显:维护较为困难,尤其是涉及到渐变填充,目前还没有什么字体制作软件能够较为优雅地完成这个任务。并且某些手机自定义字体的hook逻辑可能导致这种方法引入的图标字体无法生效。

不过,在DW中也有一部分图标采用了这种方式,那便是风向的图标,图标单色且数量固定不需要频繁修改(8个方位),非常适合使用这种方式。

② 使用svg的symbol

这也是很常用的一种图标引用方式,兼容性极好。维护相对方便,能够支持一些动画。AI能够直接导出图标为symbol标签,而且有许多构建工具也能够为此提供支持,基本没有缺点。

然而DW的天气图标并没有采用上述的两种方式。我对图标部分使用Web Components做了封装,已经是类似symbol的作用,因此再使用symbol便显得有些多此一举。

封装后的天气图标调用就方便多了,可以直接使用 <dw-icon type="sunny"></dw-icon> 这样的代码来调用特定的图标,下面是一个示例。

See the Pen WebComponents封装天气图标 by 戴兜 (@DaiDR) on CodePen.

之后打算使用gulp,这种方式也能够为开发提供便利。

3. 自适应怎么做?

在天气组件的开发过程中,我才发现还原设计稿其实是这其中最简单的一件事。我需要保证卡片中的所有元素都能有条不紊地展现出来,我原本想要固定每一种样式的卡片宽度,这样能够确保卡片的布局总是完美的,但是会使天气卡片的泛用性大打折扣,其他使用DW的人并不会专门为了一个小组件而修改自己的布局方案,同时固定宽度意味着在移动设备上,天气卡片的体验会很糟糕。但是自适应,又该怎么做呢?

最常用的自适应方法是写媒体查询,但是我不能使用媒体查询,其他开发者在哪儿插入卡片、怎么插入卡片、卡片的父级元素是什么状态我都无从得知,我不能仅通过屏幕尺寸判断出天气卡片目前的状态。

我也不能通过判断卡片宽度就隐藏或显示某些元素,因为之后的版本DW会将数据展示的部分模块化,允许其他开发者自定义展示哪些数据,擅自修改展示的元素可能导致其他开发者的配置没法如预期那样展示出来。

既然谈到了判断父容器尺寸,不如来谈谈实现方式。一般来说,我常用的方法是在父容器中嵌入一个iframe,通过iframe的尺寸变化监听容器尺寸变化,或许未来也可以试试css容器查询(Container Queries),能够提供很大便利,不过目前这个特性还处在pr阶段…兼容性列表

我一度想要固定卡片宽度,事实上直到我将DW的布局和逻辑基本全部写完后,我依然没有找到很好的解决方案。

给我灵感的,是windows的资源管理器:

天气卡片的主体元素固定在左侧不动,右侧的数据展示根据卡片宽度显示滚动条,实现也非常简单,因为我使用的弹性布局,只要在原来的数据展示区域外边包装一层带有 flex-grow: 1; 样式的容器就好了。

4. detail样式的数据展示

这一部分也很复杂,因为社团面试任务中有提到图表展示,当时是想复刻一个小米天气的15天趋势预报试试水,如果成了的话之后还可以拓展到小时预报之类的图表展示。图表部分是使用svg实现的,为了让暗黑模式的样式操作能够便利,所以使用了svg而不是canvas。绘图直接用的浏览器原生js实现,只需要绘制一个折线图,chartjs显然有些大材小用,比较臃肿。原先设计稿中采用的展示方式很难优雅地在中间位置插入图表,所以后来将早上数据、图表、晚上数据全部分了开来,因为列宽是一致的,所以也不用担心错位的问题。

原设计

修改后

接着就是绘制图表了,首先统一计算出折点的X坐标,接着按照温度确定出每个折点的Y坐标,折点用的是svg的circle元素,折线部分直接用path搞定了。

path的d参数语法逻辑其实和canvas绘制的逻辑是相类似的,首先使用M(MoveTo)指令将起点移动到第一个点的位置,接着只需要使用L(LineTo)指令绘制之剩下折线便完成了。

4. 暗黑模式

只需要使用 @media(prefers-color-scheme: dark) 这个媒体查询便能够定义暗黑模式下的卡片样式。

值得一提的是,我使用了css变量,目前大部分浏览器已经兼容了,能够大幅减少重复代码。

有时候使用者可能不想让媒体查询自作主张修改卡片样式,于是乎我提供了属性 theme 来控制卡片颜色。可以使用theme="light" 或是 theme="dark" 将卡片锁定在明亮模式或暗黑模式。这点小功能我想着完全用css来实现,之前Web Components用得不多,想着用宿主选择器轻松就能搞定,便想当然地写出了下面的这段css…

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
:host {
    // 默认样式
}

:host[theme="dark"] {
    // 暗黑模式样式
}

然鹅…翻车了,样式并不会生效,翻遍了MDN后,我找到了这个选择器:host()(面向MDN编程),所以正确的写法应该是这样(所以有哪个翻过blink源码的小伙伴能告诉我为什么要这样设计么…):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
:host {
    // 默认样式
}

:host([theme="dark"]) {
    // 暗黑模式样式
}

Ⅲ. 总结

这次写DW,让我学到了许多,之前写前端很少会自己去做图表生成,经常是引用个chartjs或是echarts了事。对Web Components也有了较之前更为全面的了解,同时也熟悉了一下flex布局的使用,至少2天多的小米天气没白看,我同学看我一天到晚拿着手机刷小米天气以为我疯了

code{background: #f5f2f0;}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
每个前端都需要知道这些面向未来的CSS技术
前端技术日新月异,我们需要不断学习来更新自己的前端知识并运用到自己的项目中。这次笔者整理一些未来普及或者现在同学们可能已经用到的CSS特性,包括SVG图标、滚动特性、CSS自定义属性、CSS现代伪类 、JS in CSS、Web Layout、混合模式和滤镜、CSS计数器等等。
lizhenwen
2021/07/28
6930
为什么我们不擅长 CSS
快来免费体验ChatGpt plus版本的,我们出的钱 体验地址: https://chat.waixingyun.cn 可以加入网站底部技术群,一起找bug,另外新版作图神器已上线 https://cube.waixingyun.cn/home
前端小智@大迁世界
2024/02/12
3520
为什么我们不擅长 CSS
用过 tailwindcss 才知道,命名真的是顶级痛点
对 tailwindcss 早有耳闻,但在我以前的观念里,tailwindcss 那简直就是开历史倒车,所谓的原子化 css,不就是早年的 bootstrap 么?我怎么可能接受这样的技术方案?
用户6901603
2024/06/07
6380
用过 tailwindcss 才知道,命名真的是顶级痛点
聊聊 React 组件库的技术选型与设计
最近在业务中开发了一套定制化的 C 端组件库,在这个过程中遇到了一些组件库技术选型和设计的问题,在参考公司内外的多个组件库后确定了最终的方案。本文希望通过向读者介绍技术选型的过程中的方案比较和组件库设计中的考量,让读者在组件库的技术选型和设计上有所启发。
前端迷
2021/03/18
2.1K0
聊聊 React 组件库的技术选型与设计
不懂设计的产品不是好开发
通过这篇文章,我将向大家介绍下关于设计的一些基本知识,让广大开发者在平时的开发中,可以更好的和设计、产品合作(撕逼)。
用户1907613
2022/03/31
2.8K0
不懂设计的产品不是好开发
React组件设计实践总结03 - 样式的管理
CSS 是前端开发的重要组成部分,但是它并不完美,本文主要探讨 React 样式管理方面的一些解决方案,目的是实现样式的高度可定制化, 让大型项目的样式代码更容易维护.
_sx_
2019/08/07
7.4K0
React组件设计实践总结03 - 样式的管理
一步到位:三行CSS代码轻松实现全网站暗黑模式
在另一篇博文中,Mads Stoumann详细介绍了如何使用SVG和CSS重新创建Apple的暗黑模式图标。这证明了他在此领域的深厚技术和创新能力。
前端小智@大迁世界
2023/05/23
1.9K0
一步到位:三行CSS代码轻松实现全网站暗黑模式
必读~苹果iOS小组件Widget设计终极完全指南
静电说:今天特别为小伙伴们准备了这篇有知识点有实例操作的Widget终极设计指南,干货真的很多,千万不要错过。
用户5009027
2020/11/03
7.8K0
electron+vue从0到1实现一个桌面端日期时间倒计时软件实践(持续更新)
我正在参加跨端技术专题征文活动,详情查看:juejin.cn/post/710123…
十里青山
2022/08/22
1.5K0
electron+vue从0到1实现一个桌面端日期时间倒计时软件实践(持续更新)
响应式设计
IMWeb前端团队
2017/12/29
2.7K0
这么牛逼的前端 UI 设计库必须了解下!
今天给大家推荐一个漂亮的前端 UI 设计库 NextUI,跟 NextJS 是同一家开发的,看起来很不错,Github上已有 10.7K Star。
程序员老鱼
2023/08/10
2.8K0
这么牛逼的前端 UI 设计库必须了解下!
你不知道的CSS
这是一个速记属性,通常用于通过有效地停止继承,从而将所有属性重置为各自的初始值,或者用于强制所有属性的继承。
智影Yodonicc
2022/06/06
2.5K2
你不知道的CSS
QQ天气H5-前端完整解析
IMWeb前端团队
2017/12/29
2.9K0
QQ天气H5-前端完整解析
使用 Vanilla JavaScript 框架创建一个简单的天气应用
大家好,不知道大家听说过 Vanilla JavaScript 这款 框架吗?最近我在浏览国外的一些技术网站时,这个词出现的频率实在是在太高了,好多框架都宣称自己是基于 Vanilla JavaScript。那到底什么是 Vanilla JavaScript 呢?
前端达人
2020/02/27
1.8K0
使用 Vanilla JavaScript 框架创建一个简单的天气应用
BootStrap 前端框架简介
回顾之前HTML+CSS的布局方式,都是使用像素(px)来布局网页的,可是现在随着用户使用终端设备的多样化,平板手机已经很常见,所以如何制作适合手机使用的网页? 还是使用以前的固定单位去布局,会引发两个问题: (1)分辨率太大,网页两边留白太多 (2)分辨率太小,页面显示不完全
张哥编程
2024/12/13
1.1K0
BootStrap 前端框架简介
你应该知道的折叠屏手机适配
从目前推出的这几款折叠手机可以看出:折叠手机从折叠到展开,屏幕的变化类似于 iphone 到 ipad。
WecTeam
2019/12/16
2.2K0
你应该知道的折叠屏手机适配
前端基础知识概述 -- 移动端开发的屏幕、图像、字体与布局的兼容适配
前端的一大工作内容就是去兼容页面在不同内核的浏览器,不同的设备,不同的分辨率下的行为,使页面的能正常工作在各种各样的宿主环境当中。
Sb_Coco
2019/09/06
3.3K0
深色模式适配指南
随着 iOS 13 的发布,深色模式(Dark Mode)越来越多地出现在大众的视野中,支持深色模式已经成为现代移动应用和网站的一个潮流,前段时间更是因为微信的适配再度引起热议。深色模式不仅可以大幅减少电量的消耗,减弱强光对比,还能提供更好的可视性和沉浸感。
政采云前端团队
2020/08/18
3K0
深色模式适配指南
让你开发更舒适的 Tailwind 技巧
使用 Tailwind CSS,我避免了在 React 项目中复制大量 CSS 文件的麻烦,使网页开发变得更加迅速高效。虽然 Tailwind 已经非常优秀,但我还是发现了一些技巧,可以进一步提升使用这个框架的体验。
前端小智@大迁世界
2024/02/12
7620
让你开发更舒适的 Tailwind 技巧
使用CSS提高网站性能的30种方法
根据httparchive.org的页面重量报告,CSS在平均70个请求和2MB的网页上占7个HTTP请求和70Kb的代码。这并不是网站性能糟糕的最坏原因(我正看着你呢,JavaScript),但CSS面临着特定的挑战:
艾编程
2022/12/30
3.8K0
使用CSS提高网站性能的30种方法
相关推荐
每个前端都需要知道这些面向未来的CSS技术
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验