`

看HTML5如何化解大型复杂网络拓扑图的分组嵌套效果

阅读更多

忙完3D,最近又开始用HTML5给客户开发网管界面。这次客户的需求很明确,要把一个关系很复杂的多层嵌套网络拓扑图做得尽可能美观和清晰。现实应用中,网络拓扑图结构可能很简单,也可能非常复杂,比如这种节点较多的单层拓扑:




稍复杂一些的:



 

再复杂一些的:



 

在这些拓扑图中常见的场景是,很多网络节点需要组成一组,这常被称为“网元组”。一般来说,网元组会有一个形状,双击可以展开/闭合。例如下图中的像如下:


 

 
 这次客户的需求中,最大的难点就是需要有五层网元组的嵌套,五层同时展开时,要求清晰美观。常规的分组形状有圆形、矩形、平行四边形等,无论哪种形状,分组多了后,就会产生审美疲劳。比如,我让设计师mm简单地把五层嵌套画个图,它看起来会是这样:


 我把这个图给客户看了以后,客户表示希望“结构能够更加清晰”。那天,魔都大雨倾盆,我抓耳挠腮一个下午,终于有了一些灵感。

 

颜色

 

怎样才能使得结构效果更加清晰?我想到的是用颜色。颜色永远是图形设计里面的第一要素。如果分组颜色千篇一律,自然就看不太清楚包含关系。但是颜色太多五颜六色,显然也不符合电信UI系统的风格。那颜色要如何设置呢?层层嵌套的分组,层层……叮!你有没有想到一种蔬菜?

 



 

 

(此处哼唱“如果你可以一层一层一层地剥开我的心……”一百遍……)

 

这颗大洋葱看上去层次分明,是因为它的颜色从内到外有一定规律的变化:渐变。说到渐变,又想起最近GF推荐的一枚游戏,大概内容是按照颜色的渐变规律来排列一些方块。(很无聊有没有?)



 

不过,前端设计中,配色倒是很重要的一个环节。

 

总之,想好了用渐变的配色来使嵌套组更清晰后,就大胆地尝试一下:

var group = new twaver.Group();
group.setStyle('group.fill.color', style[3]);
group.setStyle('group.deep', 0);
group.setStyle('group.outline.width', style[1]);
group.setStyle('group.outline.color', style[0]);
group.setStyle('group.shape', 'roundrect');
group.setStyle('select.style', 'none');
group.setStyle('vector.outline.pattern', style[2]);
group.setStyle('label.font', '14px "Microsoft Yahei"');
group.setStyle('whole.alpha', 0.8);
group.setStyle('group.padding', -10);
group.setStyle('label.position', 'topright.topleft');
group.setName(name);
group.setLocation(100+150*level, 300);

box.add(group);

 


 

数据量更大的时候,看看分组是不是会更加清晰?



 

 

更多颜色

 

这个图做出来之后,拿给周围几个同事看,大家纷纷表示不错,但是似乎有一些死板,不够生动。生动。。那就是要活灵活现的,于是我继续抓耳挠腮,又想到了一些瓜果蔬菜:




 

 

果然还是配色不够明艳啊。我又让设计师mm给找了几个色值调整了一下:



 

 

折角

 

有了写花瓣层叠的感觉,是不是舒服多了?不过,方方正正的组的形状,还是太死板,缺乏立体感。看到桌子上的一张折了角的白纸,突然有了灵感。

 

给方形的组做一个折角效果,不知效果如何。要做这个效果,就要重写group的绘制,自己接管2d绘制了。Group的形状将不再是一个矩形,而是一个切角的矩形。

//draw round rect body.

var roundRadius=10;
ctx.save();
ctx.beginPath();
ctx.moveTo(rect.x+roundRadius, rect.y);
ctx.lineTo(rect.x+rect.width-60, rect.y);
ctx.lineTo(rect.x+rect.width, rect.y+28);
ctx.lineTo(rect.x+rect.width, rect.y+rect.height-roundRadius);
ctx.quadraticCurveTo(rect.x+rect.width, rect.y+rect.height, rect.x+rect.width-roundRadius, rect.y+rect.height);
ctx.lineTo(rect.x+roundRadius, rect.y+rect.height);
ctx.quadraticCurveTo(rect.x, rect.y+rect.height, rect.x, rect.y+rect.height-roundRadius);
ctx.lineTo(rect.x, rect.y+roundRadius);
ctx.quadraticCurveTo(rect.x, rect.y, rect.x+roundRadius, rect.y);
ctx.save();
ctx.shadowOffsetX = 4;
ctx.shadowOffsetY = 4;
ctx.shadowBlur = 4;
ctx.shadowColor ="#555555";
ctx.fill();
ctx.restore();
ctx.lineWidth=node.getStyle('group.outline.width');
ctx.strokeStyle=node.getStyle('group.outline.color');
ctx.stroke();
ctx.restore();

 

通过绘制一个带圆角的矩形并切掉一个角,stroke到画布上。看看效果:


 

再通过增加圆角、切角、增加阴影、设置不同的边框线宽,让分组进一步产生“层层递进”的感觉。现在就剩下画折角的细节了。

 

折角这里,需要画一个被折下来的直角三角形。三角形的颜色,应该是“纸”的背面颜色。这里小心定义三角形的形状,并进行填充:

//draw corlor.

ctx.fillStyle=node.getStyle('group.outline.color');
ctx.lineWidth=node.getStyle('group.outline.width');
ctx.lineJoin='bevel';
ctx.beginPath();
ctx.moveTo(rect.x+rect.width-60, rect.y);
ctx.lineTo(rect.x+rect.width-23-10, rect.y+47-10);
ctx.quadraticCurveTo(rect.x+rect.width-23, rect.y+46, rect.x+rect.width-23+10, rect.y+47-10);
ctx.lineTo(rect.x+rect.width, rect.y+28);
ctx.closePath();
ctx.save();
ctx.shadowOffsetX = 4;
ctx.shadowOffsetY = 4;
ctx.shadowBlur = 4;
ctx.shadowColor ="#777777";
ctx.fill();
ctx.restore();
ctx.strokeStyle=node.getStyle('group.outline.color');
ctx.stroke();

 

效果如下,立体感出来以后,是不是生动了很多?


 

这里要注意的是,折角的阴影也要设置,并且填充要使用和边框相同的颜色,增加“折纸”的立体感。

 

小细节

 

折纸效果有了,不过左侧上方略显空旷,于是利用canvas的2d来练练手,画个path看看:

ctx.save();
ctx.strokeStyle='#27A3DA';
ctx.lineWidth=2;
ctx.beginPath();
ctx.moveTo(rect.x+31, rect.y+5);
ctx.lineTo(rect.x+25, rect.y+20);
ctx.bezierCurveTo(rect.x+25, rect.y+26, rect.x+28, rect.y+28, rect.x+32, rect.y+23);
ctx.lineTo(rect.x+42, rect.y-2);
ctx.bezierCurveTo(rect.x+42, rect.y-12, rect.x+32, rect.y-10, rect.x+32, rect.y-5);
ctx.lineTo(rect.x+29, rect.y-1);

ctx.shadowOffsetX = 1;
ctx.shadowOffsetY = 1;
ctx.shadowBlur = 1;
ctx.shadowColor ="#aaaaaa";
ctx.stroke();
ctx.restore();

 

运行一下,你猜是神马?



 

哈哈,一个小回形针瞬间跃然纸上了,感觉萌萌哒!为了增加立体感,回形针也是要设置阴影的,不过偏移不要太大、颜色要淡一些,像这样:




 

适当明艳的色彩,加上折角、阴影和小回形针,这回这个层层嵌套总算是清晰又好看了吧?

 

运行一下,拖拖拽拽,因为之前已经做了不少图标、线条的样式,所以总体效果还是很不错的!



 



 

后记

 

最后还是想唠叨几句HTML5的canvas,虽然已经不是什么新鲜技术了,但直接在浏览器中绘制网络拓扑图的逻辑关系,而不需要安装任何插件,对于很多正在更新换代的OSS系统来说,还是很有吸引力的。当技术本身不再有壁垒,我们更应该注重的是实际业务中应用,比如在画这种组织结构关系非常复杂的拓扑图时,如何让图形更加清晰、易懂,让技术真正落到实处。

 

 

  • 大小: 24.6 KB
  • 大小: 37.7 KB
  • 大小: 145.2 KB
  • 大小: 61.7 KB
  • 大小: 55.8 KB
  • 大小: 43.6 KB
  • 大小: 283.5 KB
  • 大小: 20.9 KB
  • 大小: 50.5 KB
  • 大小: 285.6 KB
  • 大小: 139 KB
  • 大小: 157 KB
  • 大小: 67.4 KB
  • 大小: 95.4 KB
  • 大小: 104.4 KB
  • 大小: 63.6 KB
  • 大小: 16 KB
  • 大小: 118.8 KB
  • 大小: 157.3 KB
  • 大小: 141.7 KB
分享到:
评论

相关推荐

    HTML5列表的嵌套应用.pdf

    HTML5 列表的嵌套应用 HTML5 列表的嵌套应用是指在 HTML5 中创建嵌套列表的方法和技术。嵌套列表是指在一个列表项中包含另一个列表项,以便更好地组织和展示信息。在 HTML5 中,使用 `<ul>` 和 `<li>` 元素可以创建...

    制作网络拓扑图的好工具Fpinger

    一款适合日常管理的网管软件,能实现基本的监视、定位、检测、追踪等功能。这款软件的最大特点就是可以让我们制作出自己的电子拓扑图,以后,无论是日常... ●拓扑图可嵌套,轻松建立大型网络 【转自bbs.bitsCN.com】

    网页嵌套地图 嵌套地图 谷歌地图 web开放

    网页中嵌套google地图的实践不仅限于上述基本步骤,还可以结合其他Web技术,如AJAX动态加载数据,实现更复杂的地图应用,如实时交通信息、天气预报、用户位置追踪等。同时,谷歌地图API还支持自定义样式和图层,允许...

    winfrom中嵌套html,跟html的交互

    在Windows Forms(WinForms)应用开发中,有时候我们需要在应用程序中展示富文本或者实现复杂的用户交互,这时可以采用嵌入HTML的方式。本文将详细介绍如何在WinForms中嵌入HTML,并与HTML进行交互,同时通过提供的...

    Html页面嵌套页面练习

    在“Html页面嵌套页面练习”这个主题中,我们主要关注如何通过HTML来创建美观且功能丰富的网页,其中包括主页、注册页面、登录页面以及搜索页面的设计。 首先,让我们来探讨主页的设计。一个吸引人的主页不仅要有...

    marquee嵌套这后出现的效果

    5. **JavaScript交互**:虽然标签本身是HTML,但结合JavaScript可以实现更复杂的控制,比如动态改变滚动速度、暂停滚动、响应用户交互等。对于嵌套`<marquee>`,可以使用JavaScript事件监听器来实现更精细的控制,...

    Android-复杂界面实现RecyclerView嵌套ViewPagerRecyclerView多布局实现

    在Android应用开发中,复杂界面的设计常常涉及到组件的嵌套和多布局的使用。本教程将深入探讨如何利用RecyclerView和ViewPager来构建一个高效且可扩展的界面。RecyclerView因其高效的列表展示能力而广受欢迎,而...

    HTML嵌套Flash播放视频插件及源码.zip

    5. **HTML配置**: "HTML嵌套Flash播放视频.txt"很可能是指导如何在HTML文件中正确嵌入Flash播放器的文本文件。它可能会包含具体的HTML代码示例,教我们如何设置`object`或`embed`标签,以及如何传递视频文件路径给...

    列表ListView嵌套Gallery效果.zip

    列表ListView嵌套Gallery效果,该项目实现了列表嵌套Gallery,列表中的每一个Item中放的是横向的Gallery,可以对列表中的每一行进行左右滑动,并可以对Gallery的每一个Item进行点击操作。  

    java ui 嵌套html

    自己上传自己下载,Java swing 嵌套html

    android 分组展示效果(合集)

    - 在实际开发中,有许多优秀的第三方库可以帮助实现更复杂、美观的分组展示效果,例如`StickyHeaderListView`(带有固定头部的ListView)、`SectionIndexer`(提供字母索引侧滑栏)等。 8. **动画效果**: - 添加...

    kettle解析xml多层分组嵌套数据,StAX方法,完整解析案例(包含xml文件以及ktr文件)

    kettle 解析xml数据,xml多层分组嵌套,xml stax方法,完整解析案例使用(包含xml文件以及ktr文件)。ETL大数据迁移,数据清洗。XML Input Stream (StAX) 方法

    自定义双层嵌套饼图实现

    在IT领域,可视化数据是传达复杂信息的有效方式,饼图作为一种直观的数据表示工具,被广泛应用于各种场景。本文将深入探讨如何实现一个自定义的双层嵌套饼图,其中包括内层饼图、外层饼图的展示,以及动态动画和放大...

    flex jsp 嵌套 swf html

    5. **系统拓扑图数据**:在JSP中,获取并处理系统拓扑数据,例如从数据库查询网络设备信息。然后,通过AMF将这些数据发送给Flex应用。 6. **显示拓扑图**:在Flex应用接收到数据后,动态渲染系统拓扑图。利用Flex的...

    HTML5+CSS3原图对比查看特效源码

    总结起来,这个"HTML5+CSS3原图对比查看特效源码"展示了如何结合HTML5的新特性、CSS3的丰富样式和动画效果以及JavaScript的动态交互能力,创建出一个实用且美观的图片对比工具。对于学习和理解Web前端开发的开发者来...

    list嵌套list例子

    总之,列表嵌套列表是Python中处理复杂数据结构的有效手段,广泛应用于数据处理、算法实现和事件驱动编程等多个领域。理解和熟练掌握嵌套列表的操作,对于提高编程效率和代码质量至关重要。在实际编程中,要根据具体...

    TableLayout实现gridview嵌套gridview效果

    本篇文章将详细探讨如何利用`TableLayout`实现`GridView`的嵌套效果,以此达到更复杂的界面设计需求。 `TableLayout`是一个基于`LinearLayout`的容器,它允许你以行和列的形式组织子视图。每个子视图通常是一个`...

    div嵌套html不用iframe

    最近在做作业中需要在不用iframe的情况下嵌套页面,所以只好在div中嵌套,用的是jquery方法。 复制代码代码如下: [removed] $(document).ready(function() { $(“#button”).click(function() { $(“#content”)....

    嵌套LISTVIEW嵌套adapter

    当数据结构复杂,需要在一个ListView中显示其他ListView时,我们就会涉及到“嵌套ListView”或者“嵌套adapter”的概念。这通常发生在制作如说明书或使用手册类的应用程序中,因为这些应用往往需要展示层次分明、...

    8.GoC-第八课--for嵌套循环B.pdf

    for嵌套循环的基本概念和应用 在信息学第二课堂中,我们学习了for嵌套循环的基本概念和应用。for嵌套循环是一种常用的编程技术,它可以用来解决复杂的问题。 基本概念: * for循环的格式:for(单次表达式;条件...

Global site tag (gtag.js) - Google Analytics