Zhihao's Studio.

两个大屏可视化案例的实现

Word count: 1,587 / Reading time: 5 min
2018/11/25 Share

前言

近期分别使用了ReactVue完成了两个大屏可视化案例,经历了设计师和产品经理的各种“指指点点”,也算是对可视化大屏项目有了一点点小的经验,对于两个技术栈写组件也有一点小心得,趁着周末总结一下。

大屏效果图1

大屏效果图2

可视化大屏

无论是在科幻电影还是在真实世界里,可视化大屏都是非常常见的一种表现手法。之前在昆明公安局出差,也亲眼看到了湄公河惨案的真实指挥中心和他的大屏,屏幕的宽度大约有两层楼高。

可视化大屏的特性

可视化大屏,归根到底还是运用的可视化技术,只不过展现的屏幕比起笔记本和显示器大了很多。相比于传统的桌面级可视化运用,大屏可视化的特性有:

  1. 屏幕巨大,用户通常离屏幕比较远,文字表达出来的信息需要足够清楚,通常要在字体和颜色上做文章。
  2. 弱化交互,基于键盘和鼠标的交互方式很少,更多时候系统自己做出响应,而不是让人工介入。
  3. 视觉冲击力强,设计一般都是以深色为底色,一来科技感十足,二来可以配合突出的主体动画和强设计感的元素。
  4. 场景化,一块大屏通常用来展示一类场景,场景主要由图表构成,后台管理系统那套表单通常不会出现在大屏。
  5. 动画更重要了,用动画表现出来的数据,通常是大屏项目中最迷人的地方。说动画是大屏项目的灵魂也不为过。案例一的那条红线被设计师称为“画龙点睛”之笔

Vue和React可视化组件的实现

不作为一个整体看大屏项目,其实还是一个个小的组件。在实现两个项目的过程中,由于上海和南京两地团队的技术栈差异,使用了Vue和React两种框架。于是我只能看了一晚上Vue之后就上手去写Vue的组件。两个大屏案例之间有共同的组件,不需要整个重写,只需要改写即可;改写的过程中,我也比较深刻体会到了两者的不同。

由于宽高的不确定性,做组件的第一步是获取组件在大屏上的宽高

  • React获取宽高的方式
    React获取宽高的方式比较标准,分为三步:在render的时候ref,在did的时候取值,在构造方法create。在生命周期函数的钩子里实现相应方法即可。
  • Vue获取宽高的方式
    Vue似乎更自由一些,直接在mouted钩子里就可以拿到相应组件的clientWidth。

宽高确定了,组件内部的元素和字体大小要进行相应比例的放缩,达到自适应的效果。在我的案例里使用的是d3和bizchart来完成图的绘制,d3中我大量使用了linearScale进行插值计算,而bizChart就更为简单,框架帮你完成了自适应。

动画部分通常会涉及一些元素的增加,有增加就不能缺少释放,这是内存管理的一个铁律。在完成第一个大屏的过程中,为了完成粒子放射的效果,我增加了很多粒子,起先没有将他们释放掉,只是从视觉上藏了起来,这造成了系统一段时间后会很卡。

在做组件的过程中,还需注意组件内部的样式不能影响外部。由于粗心,我就出现了这样的一个小错误,楠哥说如果在其他公司是要扣KPI的。

大屏的自动布局和宽高自适应

可视化大屏的布局部分也是一个重要的部分。在我们的案例中,使用了纯css3的vw、vh实现自适应。

视口单位

视口

在业界,极为推崇的一种理论是 Peter-Paul Koch (江湖人称“PPK大神”)提出的关于视口的解释——在桌面端,视口指的是在桌面端,指的是浏览器的可视区域;而在移动端较为复杂,它涉及到三个视口:分别是 Layout Viewport(布局视口)、 Visual Viewport(视觉视口)、Ideal Viewport。(大屏一般是桌面端)

视口单位

根据CSS3规范,视口单位主要包括4个:

  1. vw : 1vw 等于视口宽度的1%
  2. vh : 1vh 等于视口高度的1%
  3. vmin : 选取 vw 和 vh 中最小的那个
  4. vmax : 选取 vw 和 vh 中最大的那个

视口单位区别于%单位,视口单位是依赖于视口的尺寸,根据视口尺寸的百分比来定义的;而%单位则是依赖于元素的祖先元素。

用视口单位度量,视口宽度为100vw,高度为100vh,相当于将宽高分别分成了100份。

利用视口单位适配页面

利用视口单位适配页面通常有两种方法,做法一仅使用vw作为CSS单位,使用Sass函数编译。做法二搭配vw和rem,布局更优化。做法二是更为优秀的做法,我们也采用了这种方法,两点原因:

  1. 用户视觉体验更好,增加了最大最小宽度的限制;
  2. 如果选择主流的rem弹性布局方式作为项目开发的适配页面方法,那么做法二更适合于后期项目从 rem 单位过渡到 vw 单位。

结束语

由于是公司的项目,不同于我个人的项目可以开源,本文更多的讲的是上的东西,术上的东西并没有过多涉及,甚至没有一行样例代码。

真实的效果图

真实的演示现场

另一个演示现场

最后还是希望本文能给大家带来一些启发和收获。

感谢设计师Joseph的设计和督促,让我还原度较高的完成了这次大屏任务。

CATALOG
  1. 1. 前言
  2. 2. 可视化大屏
    1. 2.1. 可视化大屏的特性
    2. 2.2. Vue和React可视化组件的实现
    3. 2.3. 大屏的自动布局和宽高自适应
      1. 2.3.1. 视口单位
        1. 2.3.1.1. 视口
        2. 2.3.1.2. 视口单位
      2. 2.3.2. 利用视口单位适配页面
  3. 3. 结束语