整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

B端设计指南-图标 究竟应该如何设计

B端设计指南-图标 究竟应该如何设计


标是B端设计中画龙点睛的部分,全文:10636字 48图 预计阅读时间:27分钟 耐心读完,你一定有所收获

目前我主要深耕于B端设计中,深知B端图标设计与C端有很大的不同,无论是应用的场景、设计的理念,都有非常大的差异

而现在网上有不少关于C端图标如何图标绘制的文章,对于B端的方向少之又少,因此我们今天就来聊聊图标,聊聊B端图标究竟应该如何设计

在我们的设计元素中由 色彩 color、文字 font、图标 icon、图形 shape、空间 space

这五个部分组成,而图标的影响是整个产品的形象与气质,起着画龙点睛的作用


在图标的设计中,它既需要具备严谨的设计态度,同时还要兼顾设计效率

前者是提升产品的视觉表现,后者是节约企业开发成本,无论是我之前一篇文章讲到按钮,又或者是每个B端产品中的导航,都涉及到了图标。今天我就和大家来聊聊如何严谨高效的设计B端图标

在设计系统中,基础组件业务组件遍布系统的各个角落。因为大多数B端设计系统都是采取这样的核心思想去构建,这样更能够满足B端系统的实际工作需求,同时又能让设计系统真正落地,符合B端产品“复用”的设计理念,使每条产品线都能够高效的搭建。之后我会单独出一期设计系统的文章,咱们之后单独细讲


聊聊它们两的定义:

?基础组件:

每一个产品中都可以进行复用,是搭建整个系统的基础

?业务组件:

需要满足特定产品的需求,同时在功能上,不会进行多场景复用,作为单独的模块进行分类

这种思维方式在我们团队中,被称为基础业务拆分法,运用到我们的每一个产品线中

还没理解到?我举一个例子,在Teambition Clarity Design,就按照相同的思路构建的设计系统

在Teambition Clarity Design设计系统当中,所有组件都分为:基础组件、业务组件,我猜测正是通过这样的划分,才使得Teambition的设计系统能够适用于更多的业务场景,满足飞流、行云、thoughts、甘特图、协作全景等多条产品线的设计需求


回到图标当中,我们可以使用相同的思维方式,对图标进行相应的拆解分析

?基础图标:

属于整个B端图标当中的基石,主要是页面中最为基础的图标组成

比如:设置、编辑、搜索、时间日期等都属于基础图标。每个系统都必须有的基础图标,所以在绘制图标库的过程中,基础图标可以确定整个图标的性格[1]

[1] 图标性格:为图标整体给人的视觉感受(在本文第二章会着重讲到)

?业务图标:

属于B端图标设计中的业务分支,和我们每个产品的业务模块都保持一致,通常是每个系统都会有一套独有的业务系统图标

比如:公海池、线索池、归属人管理、商机管理、客户管理等,都属于业务图标。业务图标主要是要求设计师能够进行快速拓展

当然基础图标与业务图标之间也并不是一尘不变的,很多业务图标在产品中频繁的使用会被提升到基础图标当中,同理使用减少也会进行相应的剥离


1) 图标内容不同


?B端图标求同

B端产品要与同类型的图标尽量保持表意一致,在图标表达形式上差距不要太大,相似性要高

因为B端产品的本质是满足客户对于工作、效率的需求,因而在B端图标中,需要与行业中的设计语言和思路保持高度的一致,做到图标之间 “形似”,这样用户在多个B端软件进行切换过程中,会减小用户的切换成本

?C端图标存异

C端产品是要在同样的文字上进行形式上的求变,与别的产品形成个性差异。因为在目前的C端市场中,图标的同质化异常严重。想要图标独具一格,就必须突出自己的设计理念,让用户快速记住你这个品牌。因此需要考虑的是怎么样在同样的内容情况下,设计出更独特的图标风格

比如在下面的例子中,就是因为C端追求风格的原因,追赶者都会紧贴行业头部的设计风格,在设计风格上做到 “神似”,但是在每一个图标的内容上,他们都会存在巨大差异


2) 设计难点不同


?B端变化多

B端图标的设计难点在于业务名称复杂且多变在B端图标的设计场景中,会与各种业务名称进行关联,因而需要去思考每个业务所表达的特殊含义,遇到各种生僻字与英文缩写时,图标往往是需要去多维度的探究与思考

比如:在B端云产品当中,MySQL、MongoDB、SQL Server 是常见的云产品,如果你是第一次接触,需要去深入理解业务才能够准确去表达图标的含义,去理解每一个图标在行业当中设计的形式并加以设计

?C端趣味强

C端图标更多偏向与趣味性的表达,比如大多数的图标会采用去做图标视觉上的优化,而不会去考虑业务层面的东西,也因此两者的难点也存在不同的差异

3) 设计侧重点不同


?B端讲究扩展性

由于B端产品使用图标场景较少,但在图标的数量上会比C端图标多上好几倍,同时你还需要使用图标去表达不同业务间的关系,因此B端图标更讲究 扩展性

比如同样是流程申请,在快递信息流程申请、采购备料流程申请、采购流程申请的图标之间,需要存在一些相同点与不同点,这就需要你多去思考,在同时来了多个图标设计需求时,如果通过分区实现图标的快速设计

?C端讲究整体性

C端图标虽然图标数量较少,但是使用图标的场景却又十分复杂。比如品类区、我的页面中、各种功能图标以及二级页面图标,因此需要通过整体性的考虑,将多场景的图标进行串联,形成一整套视觉图标体系

4) 设计风格不同


?B端更直接

B端产品因为用户的屏幕显示参差不齐,会直接影响设计师对于颜色的直接判断,较细的图标会直接影响用户的阅读体验,因此图标形式建议多采取面性图标或者2px的线条图标,能够增加图形的识别度。图标的对比度需要满足W3C的AA、AAA原则,用户才能更好的识别

?C端更多元

C端产品因为手机屏幕分辨率的不断进步,已经进入高分辨率时代,手机屏幕色彩也更加地准确,因此图标的视觉风格会更加多元,更能让视觉设计师得到一个很好的发挥


在B端图标设计中,我们一直在追求系统、高效、高质量地输出,一方面对于B端产品而言,往往优先聚焦于主要流程的核心体验, 图标往往是低优先级的需求;另一方面,出现不统一、不美观的图标,无一例外都是在损耗着用户对于产品的体验与感受

比如最近设计圈的 有赞审美缺失部”事件,也从正面反应了B端设计师对于图标的认识不够清晰,但透过现象看本质,是有赞部门对于图标规范的缺失。因此,B端的图标规范就显得尤为重要


我们再从图标出发,从宏观上讲,图标是一门全球通用的符号语言”,而在每一种语言当中,必定会有它的“语法”以及“单词”,图标中的“语法”与“单词”一般包含有那些呢?


1) 图标中的“语法”

它就是我们常见的图标规范文档。一般需要包含:设计原则、轮廓模版、操作热区、命名规则

?设计原则

在设计原则中,一般是贯穿整个产品的始终,因此需要设计师深入提炼,设计原则能够帮助我们确定产品方向,通过设计原则的落地,有利于我们高效做出决策

在图标的设计原则中,主要通过设计的核心理念进行传达,例如在Antdesign中,确定了图标设计的四条原则

准确:设计造型准确的图标(保持偶数原则,去小数点);选择表意准确的图标,不对用户的认知造成困扰

简单:在表意清晰准确的基础上,尽量保持图形的简洁,不做多余的修饰

节奏:挖掘构图中的秩序之美

愉悦:赋予适度的情感


?轮廓模版

轮廓模版是为了明确图标视觉尺寸。我们通过 Keyline作为形状的基础,去规范我们图标的核心形状,这样能够帮助我们设计出大小统一的图标,在多条产品线之间也能保证统一的视觉重量


?操作热区

这是经常被B端设计师忽略的的细节,一方面操作热区最开始兴起于移动端,不知道大家还记得一句很经典的话吗?“iOS的最小操作热区为44px,安卓则为48px”。另一方面到了桌面端后,因为屏幕分辨率的不同,没有规定最小操作热区。但受到文字落地方式[2]的限制,12px渐渐成为大家公认图标操作热区的最小值

[2]落地方式:因为在Chrome浏览器中,文字受到浏览器大小的限制,最小的字体为12px,而在12px中的文字,与12px的图标搭配最为合适,图标都会与文字进行搭配使用,所以12px为PC端图标最小尺寸


?命名规则

命名规则是属于一项最为基础的技能,一般有经验的设计师都会有他自己的一套命名规则,而在图标规范中,需要明确多项目之间有哪些不同。比如每个产品项目有自己单独的后缀,在公共的基础图标部分又使用相同的命名规则,这样既能够让图标应用到各个产品,同时每个图标之间也能追寻到最终的源头

比如常见的命名规则:组件_类别_功能_状态,但是在B端产品中通常为:组件_类别_状态,这里将大量的组件、类别、状态的英文命名都集合到一起,建议收藏


2) 图标中的“单词”

它是我们常见的图标资源。一般由:图标性格、图标场景两部分组成

?图标性格

在图标的设计中,图标性格尤为重要。我们要根据自身产品特性,选择与特性相匹配的图标性格

我将图标的所有性格罗列出一个坐标轴,通过图标的粗细以及图标圆滑程度的不同,将图标分为四种不同的风格:粗旷、可爱、精致、商务

在B端图标设计中,粗旷与商务是更适合的图标性格。在图标性格的选择中,我们要与产品的设计理念相融合。通过对图标性格的确立,我们也能更好的缩小范围减少设计资源浪费

ps:当然你应该根据自身产品的视觉表现进行相应优化,拒绝生搬硬套

?场景不同含义不同

图标是一门全球通用的“符号语言”,所以也具有多语意的特性,一些语言在不同的场景有着截然不同的意思。图标也一样,我们需要根据不同的场景去表达不同图标的含义,因此就需要对B端图标的场景进行一个系统梳理

先来看一个例子:

在这个例子中,相同的五角星在不同的场景对应着不同的意思,比如在淘宝详情页中星星代表着收藏;在美团点评中代表着每一个评价的评分,这样场景的不同含义也不同也,因此我们需要去梳理B端图标的场景


1. 基础组件场景 - 象形图标

在文章开始“咱们老规矩”中讲到:基础组件业务组件之间的差距,这里就不再赘述两者区别。

B端产品中,基础组件需要涉及很多图标,比如:日期组件中,需要有日期图标作为组件的属性展示;下拉菜单中,需要有一个下拉箭头来代表。而这些基础组件中都使用基础图标,又因为这些图标都采取象形的手法简化而来,因此基础图标大多数为象形图标

象形图标:

象形图标是根据实际生活中物体的提炼所得,比如我们说的编辑,是通过铅笔象形而来,经过大家对于铅笔编辑的不断理解,久而久之形成;筛选是通过漏斗象形而来;在象形图标的设计中,需贴合真实使用场景


2. 运营模块场景 - 表意图标

通常出现在各种插件市场以及运营商城的页面中。也是B端产品盈利的一个关键所在,在行业内常说的一句话:“Saas产品基本不挣钱,就是交个朋友,挣钱全靠后期运营与维护”

因此,在运营模块使用的图标也格外被重视,比如我举几个例子,他们在运营模块中,都采取了“表意图标”进行展示

表意图标:

表意图标是生活中原本不存在的物体,通过不断发展,大家将某类东西约定俗成创造出的一个图标,通常表示某类事物或某类行为比如:砍价、社群等等

要提醒大家的一点,这类图标基本都是约定俗成,所以在设计上不要有过多变动,以免让用户感到疑惑


3. 专业性场景 - 文字图标

在B端图标场景中,还存在一类特别专业性的图标,这类图标在行业中往往没有约定俗成的表达形式,而在设计表达上,也无法去使用简单的图形,因此使用图标存在很大认知成本。比如:拼团、清仓

这时最好的解决办法就是将相应的专业词汇文字化,使用“文字图标“将关键词表示出来。

文字图标:

是使用文字化的图标直接表达含义,在一些垂直专业领域,常用文字的缩写形式进行表达。比如美团外卖中的“打折”作为大众都需要使用的一个图标,很难去使用图形符号去描述,因此使用“折”就能够准确直接的表达,文字图标虽然使用起来过于简单粗暴,但是它的信息传达比其他形式要高,因此在B端环境复杂的图标生态中,是常用的方式。而在现在很火的下沉市场中,也多采取文字图标的形式,这样不会因为用户的认知水平的高低产生立即上的偏差


4. 导航菜单场景 - 组合图标

组合图标在B端场景中经常存在,因业务复杂,常常需要将图标进行公用,同时进行相应的思考,关于组合图标与场景我会在第三章讲到,这里就不细细展开


1) 根据公司不同阶段进行搭建

在团队中建立一整套图标规范通常会有两种模式:开源与自主搭建,我会从效率、品牌、完整度三个方面来进行分析与评价:

开源图标

站在巨人的肩膀上,能够为自身产品建立一套快速的图标规范。通过图标库的引用,减少公司的设计成本,能够有较高的设计质量与效率,但使用开源图标主要针对的是公共业务,对于一些特定业务而言,会有相应的局限性,我会在第四章与大家独家分享一些开源高质量的B端图标库

效率:★★★★★

品牌:★★★☆☆

完整度:★★★☆☆


自主搭建

自主搭建会拥有自己独特的视觉风格与表达形式。但需要耗费一定的设计成本,自主搭建是一个循序渐进、反复打磨的过程,也常会推翻重来,因此需要大量的时间人力成本。对于公司而言独特的符号语言更有利于产品的对外营销。但自助搭建更考验设计师的能力,如果能力欠佳,会得不偿失

效率:★★★☆☆

品牌:★★★★★

完整度:★★★★★

明白了两种搭建方式后,在我们搭建B端图标规范之前,需要明确自身的产品的“定位”,根据产品的不同阶段,我们会采取不同方式进行规范的搭建


在我了解的产品阶段中,一般分为三种:初创期、成长期、成熟期

初创期的产品:

因为处于试探阶段,产品需要经常迭代,所以处于一个变化的节奏中。为了应对这种变化,引用开源图标库便成为一种较好的解决方式

成长期的产品:

成长期的产品会从混乱到逐渐的稳定。设计师也会逐渐意识到产品的整体形态以及后续的规划方向。这时候就需要整体考虑,去优化掉初创期所遗留下的问题,同时提升产品的设计竞争力

成熟期的产品:

成熟期的产品需要构建一套自己的方法论。并且要脱离图标这个单一维度。去多维度多层次的思考,通过自主搭建,形成多条产品线的统一,建立完整成熟的设计系统来满足业务发展的需要


2) 图标资源如何设计

在图标资源设计当中,我把图标分为基础图标与业务图标的分类进行讲解,让大家能够更好理解

?基础图标

在我们的基础图标中,保证图标性格一致的前提下,又牵涉到直角拐角以及图标粗细等设计细节,因此在这里和大家细讲这方面的内容


形大角大、形小角小

在基础图形设计中,圆角是一个经常被忽略的细节,我们要根据图形的面积大小去设计我们圆角的大小,而不是拿到图标就是2x的圆角,这时候就需要讲到图形与圆角之间的关系

当基础图形占的面积过大同时为正方形时,建议使用3x的圆角;当基础图形变小时,比如满高(宽)矩形时,建议使用2x的圆角。当基础图形为较小(小于1/2宽高)矩形时,建议使用1x的圆角

* 这里的3x是指与描边的大小比例

透视正确

在图标的透视中,优先选用正视的图标进行绘制,这样能够保证图标库的风格一致但对于有些图标不能通过正视角度进行表达时,使用立体图标表示,一样符合透视一致性的原理,但需要极力避免



?业务图标:

业务图标因其特殊性,一般都为组合图标,通常组合形式为A+B+C的模式,如果采取单个图标绘制,难以保证图标的一致性,同时产出效率极低,因此业务图标会采取模块化的方式进行设计 业务图标在B端产品的菜单导航最为常见:比如在我接手到的CRM产品中,一共有50多个业务图标,你是单一思考还是全局思考,就显得尤为重要


我将图标模块化的方法分为以下几步:


第一步:拆解整理

当我们拿到需求时,因为图标数量庞大,所以需要寻找到图标中的共性与个性

举个例子:销售简报管理、销售订单管理、销售权限管理、销售公海池管理、业务销售插件、商机销售阶段,他们基本都是头部以销售开头,最后都会跟一个管理进行动作的描述。而中部的描述不同,也会在产品中的其他部分找到与之对应的文案

因此我们就发现了图标当中的一个共性,而在一个庞大的B端图标库中,有这样的共性的地方还有很多,我们通过一点点的拆解整理,整理出一个图标间共性表格,完成拆解整理的工作


第二步:模块分区

通过模块分区,了解到图标的结构,模块分区的思路来源于Ant Design 图标规范2.2 中讲到的图标韵律

在一次偶然的机会,看到Ant Design对于相同类型的图标给出想类似的展现形式,因此想到我们图标对于自身应该采取模块的方式进行分区


通过一周的时间总结,对于市面上大多数B端图标进行的拆解,我将整个模块分为三个区域:一个主分区与两个次分区通过主次分区间的不同组合,能够满足绝大多数B端图标的使用场景主图标:主要表达图标的主要功能,会根据业务不同产生不同的主图标次图标:代表与主图标相对应的功能,比如常见的:管理、权限、规则这样通过主、次图标的组合,就能够将组合图标进行高效的绘制

第三步:分区绘制

使用分区绘制,落地分区的图标形式

在一个图标中,如果让你单一绘制例如销售、审批、数据等图标时,难度比杂糅到一起的组合图标要低,因此分区绘制会时图标的难度降低,可以让团队中其他水平较低的设计师一同参与。在绘制中,我们以24px大小的图标为例:

主图标的大小为:16px

次图标的大小为:8px

按照相对应的大小尺寸,主图标在图形上要设计得更明确,因为外部还要与次图标进行叠加,同时需要在多个图标中出现同样的图形,也因此在造型上不能过于复杂

次图标以简洁为主,因为较小的面积,更多状态的展示,需要它能够简洁易识别,这样才使图标在叠加的过程中,使两者图标更具代表性

第四步:细节调整

因为是多个图标进行重叠形成,所以也会存在许多图标连接间细节毫无规律的情况,因此保留相应的细节,比如图标间的间距、图标未来的扩展性等


1) 图标规范

? Lightning

https://www.lightningdesignsystem.com/guidelines/iconography/

salesforce是一个值得仰望的B端产品,而伴随着salesforce的不断发展,Lightning设计系统也不停地在迭代,Lightning中的图标规范不仅全面,而且落地,同时它也拥有500+个图标资源

关于图标规范,Lightning系统一直做到十分落地,因为Salesforce已经成型多年,设计规范一直十分稳定,关于它规范当中的每一个细节,都值得细细品味,感兴趣还可以去多研究设计系统的迭代更新记录,里面有宝藏~


? ATLASSIAN

https://atlassian.design/foundations/iconography/

ATLASSIAN在我心中一直是B端行业的头部产品,无论是产品还是设计,它旗下的Jira、Confluence、Trello,都有着很高的设计水准,同时作为多个产品的设计系统,它的包容性也值得大家去学习,可以多去实际页面去深入体验,会有很多不一样的收获


? Material Design

https://material.io/design/iconography/system-icons.html#icon-themes

在B端产品中,为什么我不推荐apple又或者其他的设计语言,相比而言,Google的Material Design一直拥有着很高的水平,与实际情况相比,Material Desgin 设计的背景与B端实际情况十分类似,同样拥有着混乱的屏幕分辨率,亟待解决的页面层次,卡片化的设计思路,因为MD设计设计在对这些特殊情况都有深入的考虑


2) 图标库

1.REMIXICON

https://remixicon.com/

Remix Icon是国人设计师章萧醇开源的一款图标库,目前这个图标库里共有2271个图标。图标涵盖建筑、商业、通讯、设计、文档编辑、财务、健康等十多种图标类型,可以直接下载SVG或PNG版本或者复制SVG代码

从图标质量上来看,Remix Icon的质量算是我见过开源图标库中最高,拥有线性和面性两种不同版本,两千多个的图标里,一定有你需要的~


2.Fearher

https://feathericons.com/

https://www.figma.com/file/dyJRSFTIajik4cdkcXN8yA3K/Feather-Component-Librar

Feathericons是一个漂亮和简单的开源图标库,每个图标均以24x24网格设计,它包含282个SVG图标,你可以使用右侧的设置去调整图标的粗细以及图标大小,你还可以通过单击网站右上角的月亮图标来切换明暗模式。

如果你是Figma的用户,作者也提供了Figma插件,在使用上的体验会更加的友好


3.EVA Icons

https://akveo.github.io/eva-icons/#/

Eva Icons是Eva Design System中的图标部分,一共有480个开源图标,分别以SVG和PNG格式展示。在图标类型上,你可以选线性和面形两种风格图标,很有趣的一点,你可以将鼠标Hover图标上去,你可以自己设定图标的动画效果,如:放大、晃动、翻转,这大概就是设计师的情怀吧~


4.heroicons

https://heroicons.dev/

Heroicons是由Tailwind CSS的创建者构建的另一个很棒的开源图标库。它具有超过165个具有填充和轮廓样式的独立图标,但每个元素也提供深色和白色版本。图标的外观非常优质且制作精良

这些图标的入门非常简单,他们还提供了Figma中的库。如果你想包含所有的图标,你可以从公共资源库中下载所有的SVG文件


5.Ikonate

https://ikonate.com/

最后但并非最不重要的是,Ikonate是另一个令人敬畏的开源图标库,它拥有约100个基于平面设计的高级图标。它是根据非常宽松的MIT许可证慷慨授权的

导出之前,你可以轻松配置图标的大小,边框宽度,边框和边角以及颜色


6.IconPark

https://iconpark.bytedance.com/

字节跳动在9月3日开放的图标库,很大多数人都不知道,图标风格有线性、填充、双色、多色可选,图标质量也十分的高,支持批量下载,网站还处于初期,感觉目前还是针对内部人员使用,只是目前将其开源出来,效果还不错


因为篇幅关系,还有几十个图标资源网站放在youthce.com,这里就不做过多展示


2) Iconfont上优质的图标资源


先说一句,由于iconfont的链接放到公众号后老是打不开,因此大家可以通过我提供的作者名称,进行iconfont 用户搜索 找到


1. 阿里云设计中心

先这个是阿里云的账号,很多B端同学做云产品的可以多多参考

2. musongtao

他的OA办公系列图标给我留下了很深刻印象,之前也尝试过临过一些


3. Mokki


4. Hi刘老爷

5. iconfont 官方图标库



1.远古时期-图片与雪碧图

之前,在与一些设计前辈聊天时,谈到过这个话题,那时候的图标还原都采取图片的形式,随着网站页面不断增加,大家就会发现图片十分占据请求资源,一方面网页中每当有一个图标都会去请求一次请求频率十分的高,另一方面图标本身体积很小,这样频繁请求后台服务器会成承受更大的压力,这样显然是不划算的,随后雪碧图就出现了

雪碧图:就是将多个图标合成成为一个图表,然后前端利用 css 的 background-position 定位去显示不同的 icon 图标。虽然解决频繁请求的问题,但还是存在一个巨大的痛点,难以维护


因为当设计师每增加一个图标,都需要修改原始图片,而且通常雪碧图是前端使用工具生成,工具稍稍不对就会影响前面定位好的图片,同时雪碧图的修改直接影响到之前的缓存,长此以往就会变得难以维护



2.发展时期-字体图标

因为使用图片落地图标还是会有种种问题,字体图标便开始问世,第三章刚讲到图标本质也是一种“文字符号”,所以在属性上是极为符合的。在前端CSS开始支持@font-face引入web font中后,字体图标就来到了高速发展的时期,比如Font Awesome就在这时候崛起,这时候国内出现了一个图标托管网站:iconfont


3.成长时期-iconfont的兴起

Iconfont已经陪伴我们7年,它集合了图标托管、共享、管理平台,算是解决了国内大多数设计师图标管理的需求,iconfont是“阿里爸爸”旗下的产品,主要是有很多图标资源提供给大家下载,当然强烈建议iconfont能够拥有排序功能,对于我这种强迫症来说,不能忍受图标类型是混乱的


4.崛起时期-svg

svg源本就是图标的最好归属,一方面svg本身就是拥有伸缩的特性,能够满足图标任意放大缩小的功能,另一方面在众多编辑绘图软件中,都支持svg的任意编辑,非常适合设计师再修改。同时svg可以直接使用,也会避免字体图标那样需要需要通过管理平台进行维护


svg真正的崛起还是在内联svg的出现,在2016年Github全面启用了内联图标,可以将图标直接嵌入到HTML的内容中,是它的文档模型能够被JS/CSS访问操作,前端就可以通过CSS的控制实现图标颜色、样式,满足图标的多种需求


如果大家感兴趣,可以出个番外篇与大家聊聊font icon 与 svg的对比

在图标的设计中,我崇拜过Susan的细腻,能够在如此低的分辨率中做着设计,而对于后续的mac图标的设计中,都有着深远的意义


我也敬佩锤子,将具象的图标刻画的细致到位,以至于很多时候看着图标发呆,细细研究它的技法;

希望B端的图标不要因为门槛而困扰着大家,我曾经深受图标困惑,希望这篇文章你会有所收获,由于篇幅较长,几经修改,有细节不正确的地方,欢迎留言纠正


我是CE青年

一个2 B行业的2B设计师

我们下篇文章再见


如果你觉得文章不错记得 关注点赞

挑战30天在头条写日记#

功能:

颜色插件

Chart.js 品牌颜色的默认调色板可作为内置的省时零配置插件使用。

Tree-shaking

通过仅注册必要的组件,JavaScript 包的大小可以减少数十千字节。

规模堆叠

布局框可以按组堆叠和加权。

字幕插件

辅助标题插件,具有与主标题相同的所有选项。

线段样式

线段可以根据任何用户定义的标准设置样式。

3.0新功能高级动画

每个元素中每个属性的转换都可以单独且独立地配置。

新功能表现!

引入了许多性能增强功能。此示例具有 1M (2x500k) 点,启用了新的抽取插件。

2.0新功能混合图表类型

混合搭配条形图和折线图,以在数据集之间提供清晰的视觉区分。

2.0新功能新的图表轴类型

轻松绘制日期时间、对数甚至完全自定义比例的复杂、稀疏数据集。

2.0新功能动画一切!

更改数据、更新颜色和添加数据集时,开箱即用的令人惊叹的过渡。

使用Demo-创建图表

在此示例中,我们为单个数据集创建条形图并将其呈现在 HTML 页面上。将此代码片段添加到您的页面:

<div>
  <canvas id="myChart"></canvas>
</div>

<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>

<script>
  const ctx=document.getElementById('myChart');

  new Chart(ctx, {
    type: 'bar',
    data: {
      labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
      datasets: [{
        label: '# of Votes',
        data: [12, 19, 3, 5, 2, 3],
        borderWidth: 1
      }]
    },
    options: {
      scales: {
        y: {
          beginAtZero: true
        }
      }
    }
  });
</script>


你应该得到一个像这样的图表:

让我们分解一下这段代码。

首先,我们的页面中需要有一个画布。建议为图表提供自己的容器以提高响应能力。

<div>
  <canvas id="myChart"></canvas>
</div>

现在我们有了画布,我们可以包含来自 CDN 的 Chart.js。

<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>

最后,我们可以创建一个图表。我们添加一个脚本,该脚本获取myChart画布元素并new Chart使用所需的配置进行实例化:bar图表类型、标签、数据点和选项。

<script>
  const ctx=document.getElementById('myChart');

  new Chart(ctx, {
    type: 'bar',
    data: {
      labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
      datasets: [{
        label: '# of Votes',
        data: [12, 19, 3, 5, 2, 3],
        borderWidth: 1
      }]
    },
    options: {
      scales: {
        y: {
          beginAtZero: true
        }
      }
    }
  });
</script>

Chart.js 的所有主要概念:

图表类型和元素、数据集、自定义、插件、组件和 tree-shaking。不要犹豫,点击文本中的链接。

我们将从头开始使用几个图表构建 Chart.js 数据可视化:

使用 Chart.js 构建新应用程序

在新文件夹中,创建package.json包含以下内容的文件:

{
  "name": "chartjs-example",
  "version": "1.0.0",
  "license": "MIT",
  "scripts": {
    "dev": "parcel src/index.html",
    "build": "parcel build src/index.html"
  },
  "devDependencies": {
    "parcel": "^2.6.2"
  },
  "dependencies": {
    "@cubejs-client/core": "^0.31.0",
    "chart.js": "^4.0.0"
  }
}

现代前端应用程序经常使用 JavaScript 模块捆绑器,因此我们选择Parcel 作为一个很好的零配置构建工具。我们还安装了 Chart.js v4 和Cube 的 JavaScript 客户端,这是一个用于数据应用程序的开源 API,我们将使用它来获取真实世界的数据(稍后会详细介绍)。

运行npm installyarn install、 或pnpm install安装依赖项,然后创建src文件夹。在该文件夹中,我们需要一个非常简单的index.html文件:

<!doctype html>
<html lang="en">
  <head>
    <title>Chart.js example</title>
  </head>
  <body>
    <!-- <div style="width: 500px;"><canvas id="dimensions"></canvas></div><br/> -->
    <div style="width: 800px;"><canvas id="acquisitions"></canvas></div>

    <!-- <script type="module" src="dimensions.js"></script> -->
    <script type="module" src="acquisitions.js"></script>
  </body>
</html>

正如您所看到的,Chart.js 需要最少的标记:canvas带有 的标记id,我们稍后将通过它引用图表。默认情况下,Chart.js 图表是响应式的,并占据整个封闭容器。所以,我们设置宽度div来控制图表的宽度。

最后,让我们创建src/acquisitions.js包含以下内容的文件:

import Chart from 'chart.js/auto'

(async function() {
  const data=[
    { year: 2010, count: 10 },
    { year: 2011, count: 20 },
    { year: 2012, count: 15 },
    { year: 2013, count: 25 },
    { year: 2014, count: 22 },
    { year: 2015, count: 30 },
    { year: 2016, count: 28 },
  ];

  new Chart(
    document.getElementById('acquisitions'),
    {
      type: 'bar',
      data: {
        labels: data.map(row=> row.year),
        datasets: [
          {
            label: 'Acquisitions by year',
            data: data.map(row=> row.count)
          }
        ]
      }
    }
  );
})();

让我们看一下这段代码:

  • 我们Chart从特殊路径导入 Chart.js 主类chart.js/auto。它加载所有可用的 Chart.js 组件(这非常方便),但不允许进行树摇动。我们稍后会解决这个问题。
  • 我们实例化一个新Chart实例并提供两个参数:将呈现图表的画布元素和选项对象。
  • 我们只需要提供一个图表类型 ( bar) 并提供data它由labels(通常是数据点的数字或文本描述)和一个数组datasets(Chart.js 支持大多数图表类型的多个数据集)组成。每个数据集都用 a 指定,label并包含一个数据点数组。
  • 目前,我们只有一些虚拟数据条目。因此,我们提取yearcount属性来生成labels唯一数据集中的 和 数据点数组。

是时候使用npm run devyarn dev、 或运行示例并在 Web 浏览器中pnpm dev导航到localhost:1234 了:

只需几行代码,我们就得到了一个具有很多功能的图表:图例、网格线、刻度线和悬停时显示的工具提示。刷新网页几次即可看到图表也是动画的。尝试单击“按年份获取”标签,您会发现您还可以切换数据集可见性(当您有多个数据集时特别有用)。

简单的定制

让我们看看如何自定义 Chart.js 图表。首先,让我们关闭动画,以便立即显示图表。其次,让我们隐藏图例和工具提示,因为我们只有一个数据集和相当琐碎的数据。

将调用new Chart(...);替换src/acquisitions.js为以下代码片段:

  new Chart(
    document.getElementById('acquisitions'),
    {
      type: 'bar',
      options: {
        animation: false,
        plugins: {
          legend: {
            display: false
          },
          tooltip: {
            enabled: false
          }
        }
      },
      data: {
        labels: data.map(row=> row.year),
        datasets: [
          {
            label: 'Acquisitions by year',
            data: data.map(row=> row.count)
          }
        ]
      }
    }
  );

正如您所看到的,我们已将该options属性添加到第二个参数中,这样您就可以为 Chart.js 指定各种自定义选项。通过提供的布尔标志禁用动画animation。大多数图表范围的选项(例如,响应能力或设备像素比)都是这样配置的。

图例和工具提示隐藏在plugins. 请注意,Chart.js 的一些功能被提取到插件中:独立的、独立的代码片段。其中一些插件作为Chart.js 发行版 的一部分提供,其他插件是独立维护的,并且可以位于很棒的 插件、框架集成和其他图表类型列表中。

您应该能够在浏览器中看到更新后的简约图表。

真实世界数据

对于硬编码、有限大小、不切实际的数据,很难展示 Chart.js 的全部潜力。让我们快速连接到数据 API,以使我们的示例应用程序更接近生产用例。

让我们创建src/api.js包含以下内容的文件:

import { CubejsApi } from '@cubejs-client/core';

const apiUrl='https://heavy-lansford.gcp-us-central1.cubecloudapp.dev/cubejs-api/v1';
const cubeToken='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjEwMDAwMDAwMDAsImV4cCI6NTAwMDAwMDAwMH0.OHZOpOBVKr-sCwn8sbZ5UFsqI3uCs6e4omT7P6WVMFw';

const cubeApi=new CubejsApi(cubeToken, { apiUrl });

export async function getAquisitionsByYear() {
  const acquisitionsByYearQuery={
    dimensions: [
      'Artworks.yearAcquired',
    ],
    measures: [
      'Artworks.count'
    ],
    filters: [ {
      member: 'Artworks.yearAcquired',
      operator: 'set'
    } ],
    order: {
      'Artworks.yearAcquired': 'asc'
    }
  };

  const resultSet=await cubeApi.load(acquisitionsByYearQuery);

  return resultSet.tablePivot().map(row=> ({
    year: parseInt(row['Artworks.yearAcquired']),
    count: parseInt(row['Artworks.count'])
  }));
}

export async function getDimensions() {
  const dimensionsQuery={
    dimensions: [
      'Artworks.widthCm',
      'Artworks.heightCm'
    ],
    measures: [
      'Artworks.count'
    ],
    filters: [
      {
        member: 'Artworks.classification',
        operator: 'equals',
        values: [ 'Painting' ]
      },
      {
        member: 'Artworks.widthCm',
        operator: 'set'
      },
      {
        member: 'Artworks.widthCm',
        operator: 'lt',
        values: [ '500' ]
      },
      {
        member: 'Artworks.heightCm',
        operator: 'set'
      },
      {
        member: 'Artworks.heightCm',
        operator: 'lt',
        values: [ '500' ]
      }
    ]
  };

  const resultSet=await cubeApi.load(dimensionsQuery);

  return resultSet.tablePivot().map(row=> ({
    width: parseInt(row['Artworks.widthCm']),
    height: parseInt(row['Artworks.heightCm']),
    count: parseInt(row['Artworks.count'])
  }));
}

让我们看看那里发生了什么:

  • 我们为Cubeimport (数据应用程序的开源 API)提供 JavaScript 客户端库,使用 API URL ( ) 和身份验证令牌 ( ) 配置它,最后实例化客户端 ( )。 apiUrlcubeTokencubeApi
  • Cube API 托管在Cube Cloud 中,并连接到一个数据库,该数据库包含 约 140,000 条记录的公共数据集 ,代表美国纽约现代艺术博物馆 收藏的所有艺术品。当然,这是一个比我们现在拥有的更真实的数据集。
  • 我们定义了几个异步函数来从 API 获取数据:getAquisitionsByYeargetDimensions。第一个返回按购买年份计算的艺术品数量,另一个返回每个宽度-高度对的艺术品数量(我们将在另一个图表中需要它)。
  • 我们来看一下getAquisitionsByYear。首先,我们在变量中创建一个基于 JSON 的声明性查询acquisitionsByYearQuery。正如您所看到的,我们指定了每件yearAcquired我们想要获得count的艺术品;yearAcquired必须设置(即不是未定义);结果集将按yearAcquired升序排序。
  • 其次,我们resultSet通过调用获取并将其映射到具有所需属性cubeApi.load的对象数组。yearcount

现在,让我们将真实世界的数据传递到我们的图表中。请进行一些更改src/acquisitions.js:添加导入并替换data变量的定义。

import { getAquisitionsByYear } from './api'

// ...

const data=await getAquisitionsByYear();

完毕!现在,我们的真实数据图表如下所示。看来1964年、1968年和2008年发生了一些有趣的事情!

我们已经完成了条形图。让我们尝试另一种 Chart.js 图表类型。

进一步定制

Chart.js 支持许多常见的图表类型。

例如,气泡图允许同时显示三个维度的数据:xy轴上的位置代表两个维度,第三个维度由单个气泡的大小表示。

要创建图表,请停止已运行的应用程序,然后转到src/index.html并取消注释以下两行:

<div style="width: 500px;"><canvas id="dimensions"></canvas></div><br/>

<script type="module" src="dimensions.js"></script>

然后,创建src/dimensions.js包含以下内容的文件:

import Chart from 'chart.js/auto'
import { getDimensions } from './api'

(async function() {
  const data=await getDimensions();

  new Chart(
    document.getElementById('dimensions'),
    {
      type: 'bubble',
      data: {
        labels: data.map(x=> x.year),
        datasets: [
          {
            label: 'Dimensions',
            data: data.map(row=> ({
              x: row.width,
              y: row.height,
              r: row.count
            }))
          }
        ]
      }
    }
  );
})();

也许,一切都非常简单:我们从 API 获取数据并渲染一个具有该类型的新图表,将三个维度的数据作为、和(半径)属性bubble传递。xyr

现在,使用 、 或 重置缓存并再次启动rm -rf .parcel-cache应用程序。我们现在可以查看新图表:npm run devyarn devpnpm dev

嗯,看起来不太漂亮。

首先,图表不是正方形的。艺术品的宽度和高度同样重要,因此我们希望图表的宽度也等于其高度。默认情况下,Chart.js 图表的纵横比为 1(对于所有径向图表,例如圆环图)或 2(对于所有其他图表)。让我们修改图表的纵横比:

// ...

	new Chart(
    document.getElementById('dimensions'),
    {
      type: 'bubble',
      options: {
        aspectRatio: 1,
      },

// ...

现在看起来好多了:

然而,这仍然不理想。水平轴的范围从 0 到 500,垂直轴的范围从 0 到 450。默认情况下,Chart.js 会自动将轴的范围(最小值和最大值)调整为数据集中提供的值,因此图表“适合“你的数据。显然,MoMa 收藏中没有高度在 450 至 500 厘米范围内的艺术品。让我们修改图表的轴配置来解决这个问题:

// ...

  new Chart(
    document.getElementById('dimensions'),
    {
      type: 'bubble',
      options: {
        aspectRatio: 1,
        scales: {
          x: {
            max: 500
          },
          y: {
            max: 500
          }
        }
      },

// ...

伟大的!看一下更新后的图表:

然而,还有一个问题:这些数字是多少?单位是厘米不是很明显。让我们对两个轴应用自定义刻度格式以使事情变得清晰。我们将提供一个回调函数,调用该函数来格式化每个刻度值。这是更新后的轴配置:

// ...

  new Chart(
    document.getElementById('dimensions'),
    {
      type: 'bubble',
      options: {
        aspectRatio: 1,
        scales: {
          x: {
            max: 500,
            ticks: {
              callback: value=> `${value / 100} m`
            }
          },
          y: {
            max: 500,
            ticks: {
              callback: value=> `${value / 100} m`
            }
          }
        }
      },

// ...

完美,现在我们在两个轴上都有合适的单位:

多个数据集

Chart.js 独立绘制每个数据集,并允许对它们应用自定义样式。

看一下图表:有一条可见的气泡“线”,其等号xy坐标代表方形艺术品。将这些气泡放入自己的数据集中并以不同的方式绘制它们会很酷。此外,我们可以将“较高”的艺术品与“较宽”的艺术品分开,并以不同的方式绘制它们。

我们可以这样做。将其替换datasets为以下代码:

// ...

        datasets: [
          {
            label: 'width=height',
            data: data
              .filter(row=> row.width===row.height)
              .map(row=> ({
                x: row.width,
                y: row.height,
                r: row.count
              }))
          },
          {
            label: 'width > height',
            data: data
              .filter(row=> row.width > row.height)
              .map(row=> ({
                x: row.width,
                y: row.height,
                r: row.count
              }))
          },
          {
            label: 'width < height',
            data: data
              .filter(row=> row.width < row.height)
              .map(row=> ({
                x: row.width,
                y: row.height,
                r: row.count
              }))
          }
        ]

// ..

如您所见,我们定义了三个具有不同标签的数据集。每个数据集都有自己的使用 提取的数据片段filter。现在,它们在视觉上是不同的,而且正如您所知,您可以独立切换它们的可见性。

这里我们依赖默认的调色板。但是,请记住,每种图表类型都支持许多数据集选项,您可以随意自定义。

插件

另一种非常强大的自定义 Chart.js 图表的方法是使用插件。您可以在插件目录 中找到一些或创建您自己的临时插件。在 Chart.js 生态系统中,这是惯用的,并且期望通过插件来微调图表。例如,您可以自定义画布背景或使用简单的临时插件为其添加边框。让我们尝试一下后者。

插件具有广泛的 API,但简而言之,插件被定义为name具有扩展点中定义的一个或多个回调函数的对象。new Chart(...);在调用之前插入以下代码片段来代替src/dimensions.js

// ...

  const chartAreaBorder={
    id: 'chartAreaBorder',

    beforeDraw(chart, args, options) {
      const { ctx, chartArea: { left, top, width, height } }=chart;

      ctx.save();
      ctx.strokeStyle=options.borderColor;
      ctx.lineWidth=options.borderWidth;
      ctx.setLineDash(options.borderDash || []);
      ctx.lineDashOffset=options.borderDashOffset;
      ctx.strokeRect(left, top, width, height);
      ctx.restore();
    }
  };

  new Chart(
    document.getElementById('dimensions'),
    {
      type: 'bubble',
      plugins: [ chartAreaBorder ],
      options: {
        plugins: {
          chartAreaBorder: {
            borderColor: 'red',
            borderWidth: 2,
            borderDash: [ 5, 5 ],
            borderDashOffset: 2,
          }
        },
        aspectRatio: 1,

// ...

正如您所看到的,在这个chartAreaBorder插件中,我们获取画布上下文,保存其当前状态,应用样式,在图表区域周围绘制矩形,然后恢复画布状态。我们还传递了该插件,plugins因此它仅适用于这个特定的图表。我们还将插件选项传递给options.plugins.chartAreaBorder; 我们当然可以在插件源代码中对它们进行硬编码,但这种方式可重用性更高。

我们的气泡图现在看起来更漂亮了:

摇树

在生产中,我们努力交付尽可能少的代码,以便最终用户可以更快地加载我们的数据应用程序并获得更好的体验。为此,我们需要应用tree-shaking ,这是一个奇特的术语,用于从 JavaScript 包中删除未使用的代码。

Chart.js 的组件设计完全支持 tree-shaking。您可以一次注册所有 Chart.js 组件(这在您进行原型设计时很方便)并将它们与您的应用程序捆绑在一起。或者,您可以仅注册必要的组件并获得最小的捆绑包,其大小要小得多。

让我们检查一下我们的示例应用程序。捆绑包尺寸是多少?您可以停止应用程序并运行npm run build, 或yarn build, 或pnpm build。片刻之后,您将得到如下信息:

% yarn build
yarn run v1.22.17
$ parcel build src/index.html
? Built in 88ms

dist/index.html              381 B   164ms
dist/index.74a47636.js   265.48 KB   1.25s
dist/index.ba0c2e17.js       881 B    63ms
? Done in 0.51s.

我们可以看到 Chart.js 和其他依赖项被捆绑在一个 265 KB 文件中。

src/acquisitions.js为了减小包的大小,我们需要对和进行一些更改src/dimensions.js。首先,我们需要从两个文件中删除以下导入语句:import Chart from 'chart.js/auto'.

相反,我们只加载必要的组件并使用 Chart.js“注册”它们Chart.register(...)。这是我们需要的src/acquisitions.js

import {
  Chart,
  Colors,
  BarController,
  CategoryScale,
  LinearScale,
  BarElement,
  Legend
} from 'chart.js'

Chart.register(
  Colors,
  BarController,
  BarElement,
  CategoryScale,
  LinearScale,
  Legend
);

这是以下代码片段src/dimensions.js

import {
  Chart,
  Colors,
  BubbleController,
  CategoryScale,
  LinearScale,
  PointElement,
  Legend
} from 'chart.js'

Chart.register(
  Colors,
  BubbleController,
  PointElement,
  CategoryScale,
  LinearScale,
  Legend
);

您可以看到,除了Chart类之外,我们还加载图表类型、比例和其他图表元素(例如,条形图或点)的控制器。您可以在文档中查找所有可用的组件。

或者,您可以按照控制台中的 Chart.js 建议进行操作。例如,如果您忘记导入BarController条形图,您将在浏览器控制台中看到以下消息:

Unhandled Promise Rejection: Error: "bar" is not a registered controller.

chart.js/auto请记住在准备生产应用程序时仔细检查进口。只需要一次这样的导入就可以有效地禁用树摇动。

现在,让我们再次检查我们的应用程序。运行yarn build你会得到这样的结果:

% yarn build
yarn run v1.22.17
$ parcel build src/index.html
? Built in 88ms

dist/index.html              381 B   176ms
dist/index.5888047.js    208.66 KB   1.23s
dist/index.dcb2e865.js       932 B    58ms
? Done in 0.51s.

过仅导入和注册选定的组件,我们删除了超过 56 KB 的不必要代码。鉴于其他依赖项在捆绑包中占用约 50 KB,tree-shaking 有助于从我们的示例应用程序的捆绑包中删除约 25% 的 Chart.js 代码。

项目地址:https://github.com/chartjs/Chart.js

除摩天楼风载晃动的减震摆

刘延柱 科学网博客 2021-4-1

晨雾 / 转帖

【晨雾按语】据媒体报道今天(2021年5月18日)中午时分,深圳赛格大厦出现晃动,现场有人员从大厦撤离。记者当日14时10分许从深圳消防获悉,已接警并出警,具体状况需进一步调查。

在此转载一篇关于摩天大楼减震摆的科普文章。感谢文章原作者。


--------------------


赴台旅游过的游客大都去过台北的 101 大楼(图 1),参观过大楼里悬挂的巨大的减震摆(图 2)。这个直径 5.5 米,重达 660 吨的巨大钢球由 4 根粗钢索悬挂在 88 层与 92 层之间,形成一个大单摆。


图1 台北101 大楼


图2 101 大楼的减震摆


2016 年完工的上海中心大厦高度 632 米,远远超过高度 448 米的 101 大楼(图 3)。是已建成的全国第一,世界第二高楼,上海的地标性建筑之一。上海中心的顶部 126 层也悬挂着一个 1000 吨的重量更大的减震摆。这个巨大的减震转置全名是 “ 摆式电涡流调谐质量阻尼器 ” (Pendulum Eddy-current Tuned Mass Damper) [1]。值得一提的是减震摆质量块上方装饰的艺术品(图 4)。这个从《山海经》中 “烛龙之眼” 获得灵感的雕塑作品与 “龙塔” 式的大厦造型相辉映。上方有一圆洞直指苍穹,在透过玻璃的阳光投射下更增添神秘色彩,被昵称为上海中心大厦的 “慧眼” 。


图 3 上海中心大厦


图 4 上海中心大厦的减震摆


楼层太高的摩天楼很容易受到风力的影响产生摇晃,这种晃动属于自激振动。在博文 “瑞利方程和范德波尔方程描述的自激振动” 里,对于输电线、悬索桥、高层建筑等细长物体因风载导致的自激振动有过详细说明。类似的这种现象早在 19 世纪就已引起注意。1878 年捷克物理学家斯特劳哈尔(Strouhal,V.)发现,当微风吹过竖琴的细弦时会使竖琴发出声音,因此对气流通过圆截面柱时产生的振动做了系统的实验研究。结论是振动频率与流速成正比,与圆截面柱的直径成反比。1912 年美籍匈牙利力学家冯?卡门(Von Kármán,T.)(图 5)从理论上证明,当流体绕过非流线形障碍物时,会在物体后方两侧产生反对称等距离排列的,旋转方向相反的成对涡旋,称为卡门涡街 (Kármán Vortex Street)(图 6)。出现涡街的尾流对物体产生周期变化的作用力,频率与流速和物体直径的关系与斯特劳哈尔的实验结果符合一致。如激励频率与物体固有频率接近,可导致激烈的共振。从而解释了风载引起自激振动的产生原因。


图 5 冯?卡门(Von Kármán,T. 1881-1963)



图 6 卡门涡街


摩天楼在风载下的自激振动若不加控制,顶端摆动的加速度可高达 6 cm/sec2 以上而超过允许范围。为减小风载引起的摇晃效应,必须采取各种阻尼方法。上海中心大厦的外形十分独特,是由曲面卷绕形成,每层扭转10 的扭曲几何体。理论研究表明,这种称为“龙塔”式的外形可延缓和削弱卡门涡街的形成。摆式阻尼器将阵风对大楼的激励转移至减震摆,其摆动的动能被电涡流阻尼器耗散,从而实现有效的振动抑制。2019 年 8 月 10 日上海受强台风 “利奇” 的袭击,风速高达每秒 40 米,上海中心大厦的减震摆的振幅高达 50cm,而大厦安然无恙。


摆式阻尼器也称为动力吸振器。其抑制振动的基本原理基于线性系统的受迫振动规律[2]。设质量为 mi (i=1,2) 的两个物体,用两个刚度为 Ki (i=1,2) 的弹簧串联成二自由度振动系统(图 7)。其中的物体 m1 受到频率为 ω 的简谐力 F0sinωt 的激励,列出此系统的受迫振动方程:





图 7 二自由度振动系统


此方程组有以下特解,确定系统的受迫振动规律:


其中函数 Δ(ω2)为


若作用于物体 m1 的激励力频率 ω 恰好等于物体 m2 的固有频率 ω20=(K2/m2)1/2,则 x1(t) 的振幅等于零,表明物体 m1 的振动被完全抑制,激励力的全部能量被转移到物体 m2 。此即动力吸振器的理论依据。考虑阻尼因素影响的理论分析在附录中给出。

摩天楼中悬挂的大单摆就是一具超大型的动力吸振器。吹向大楼的阵风可能有多种频率成分,其中以接近大楼基频的阵风最危险,如不加控制就会使大楼产生强烈晃动。将大单摆的固有频率设计成与大楼的基频相等,则阵风的能量就被转换为单摆摆动的动能。电涡流阻尼器将此动能耗散为热量,大楼的晃动就被大大降低。

动力吸振器的原理是 1928 年由美国的奥蒙德罗伊德 (Ormondroyd,J.) 和邓哈托 (Den Hartog,J.P.) 提出的。要达到消除振动的目的又不消耗能源,动力吸振器是一种理想的消振方案。在实际应用方面,邓哈托在他的机械振动著作里曾举出理发电推子的有趣例子[3] (图10)。另一个重要的应用是在内燃机的曲柄轴上安装一个可绕旋转轴转动的弹簧振子,它的固有频率被调整得与旋转轴的临界转速相等时,可消除旋转轴的扭转振动(图11)。



图 10 带吸振器的理发推子



图 11 旋转轴上的动力吸振器


基于动力吸振器原理的减震摆以其消除晃动的有效性,被许多著名的超高层建筑采用。在上海中心大厦之前的 2008 年,另一座超高层建筑上海环球金融中心就已安装了两台重 150 吨的减震摆。


参考文献

[1] 程穆,汪立军. 阻尼器在上海中心大厦的应用. 上海建设科技,2014, (3): 26-29

[2] 刘延柱,陈立群,陈文良. 振动力学(第二版). 北京, 高等教育出版社,2011: 139~141

[3] 邓哈托. 机械振动学. 北京:科学出版社. 1965 : 95~102


(改写自:刘延柱. 趣味振动力学,8.5 节. 北京: 高等教育出版社,2012)


附录:带阻尼的二自由度系统动力消振器






转载本文请联系原作者获取授权,同时请注明本文来自刘延柱科学网博客。


信息来源:2021-05-14 刘延柱科学网博客

http://blog.sciencenet.cn/blog-3452605-1279666.html


【声明】本文为转发分享,已经注明来源。不代表本平台赞成或反对原作者的观点,文责和版权属于原作者。转载此文是出于传递更多信息之目的,如有侵权请联系删除。