精华内容
下载资源
问答
  • 在做一些推送服务的时候,想在应用图标上添加未读消息,Android桌面角标的适配确实是非常坑爹的需求。原生系统根本就没有这个功能,国内很多厂家效仿ios都自己定义了该功能。现在就为大家介绍部分机型添加角标的代码...

    在做一些推送服务的时候,想在应用图标上添加未读消息,Android桌面角标的适配确实是非常坑爹的需求。原生系统根本就没有这个功能,国内很多厂家效仿ios都自己定义了该功能。

    现在就为大家介绍部分机型添加角标的代码。

    1、华为手机上显示角标:(已通过)

    //添加权限

    添加如下代码:

    String launcherClassName = "com.redfinger.huaweichangebadge.MainActivity";//启动的Activity完整名称

    Bundle localBundle = new Bundle();//需要存储的数据

    localBundle.putString("package",context.getPackageName());//包名

    localBundle.putString("class",launcherClassName);

    localBundle.putInt("badgenumber",99);//未读信息条数

    getContentResolver().call(

    Uri.parse("content://com.huawei.android.launcher.settings/badge/"),

    "change badge",null,localBundle);

    2、小米手机上显示角标:(已通过)

    private void setXiaoMiBadge(Context context,int number){

    try{

    Class miuiNotificationClass = Class.forName("android.app.MiuiNotification");

    Object miuiNotification = miuiNotificationClass.newInstance();

    Field field = miuiNotification.getClass().getDeclaredField("messageCount");

    field.setAccessible(true);

    field.set(miuiNotification,String.valueOf(number==0?"":number));

    }catch (Exception e){

    e.printStackTrace();

    // miui6之前

    Intent localIntent = new Intent("android.intent.action.APPLICATION_MESSAGE_UPDATE");

    localIntent.putExtra("android.intent.extra.update_application_component_name",context.getPackageName()+"/."+"MainActivity");

    localIntent.putExtra("android.intent.extra.update_application_message_text",String.valueOf(number==0?"":number));

    context.sendBroadcast(localIntent);

    }

    }

    3、三星手机添加角标:(已通过)

    String launcherClassName = "com.redfinger.huaweichangebadge.MainActivity";

    Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");

    intent.putExtra("badge_count",99);

    intent.putExtra("badge_count_package_name",getPackageName());

    intent.putExtra("badge_count_class_name",launcherClassName);

    sendBroadcast(intent);

    4、索尼手机添加角标,找不到相关机型:(未测试)

    private final String lancherActivityClassName =MainActivity.class.getName();

    private void sendToSony(Context context,String number) {

    boolean isShow = true;

    if ("0".equals(number)) {

    isShow = false;

    }

    Intent localIntent = new Intent();

    localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", isShow);//是否显示

    localIntent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");

    localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME",lancherActivityClassName );//启动页

    localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", number);//数字

    localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());//包名

    context.sendBroadcast(localIntent);

    }

    展开全文
  • 微软公司产品介绍ppt.pptx,这个报告主要是微软公司的产品介绍ppt,主要是电脑和平板相关的内容介绍。对于行业使用比较受局限。但是可以把微软图标更换一下,也一样比较好用。
  • 这次给大家分享的主题是我们读书会“打书钉”第二期广荣同学为我们分享的《图标与几何构成》,介绍图标形体的设计与几何构成的关系!若有不足之处,望大师指点。  一、产品的灵魂-Logo yixieshi  Logo是每一...

    这次给大家分享的主题是我们读书会“打书钉”第二期广荣同学为我们分享的《图标与几何构成》,介绍图标形体的设计与几何构成的关系!若有不足之处,望大师指点。

      一、产品的灵魂-Logo yixieshi

      Logo是每一个产品的重要标识,它是表明产品特征的记号、商标。它以单纯、显著、易识别的物象、图形或文字符号为直观语言,除表示什么,代替什么之外,还具有表达意义、情感和指令行动等作用。

      视觉传播—静态视觉传播和动态视觉传播 一些事

      文化理念—迅雷LOGO代表着迅雷的特点宗旨,价值观念的体现

      二、一个好的Logo是怎么样?

      一个好的Logo我想它应该具备以下特点:寓意、识别、用色、字体以及造型。 yixieshi

      1.寓意 互联网的一些事

      好的Logo具有能够忽悠别人的设计含义

      2.识别 yixieshi

      指示功能,象征符号的特征。象征符号是某种因自己和对象之间有着一定惯常的或习惯联想的“规则”而作为符号起得作用的东西。 yixieshi

      3.用色

      每个人都有自己用色的习惯,但要注意几点: 互联网的一些事

      a.要清楚颜色对人影响,不同颜色所代表的含义。 一些事

      b.颜色搭配的技巧

      c.同样的颜色在不同的场合与文化氛围具有不同的含义,如:

      红色(red)

      热情,活泼,张扬。容易鼓舞勇气,同时也很容易生气,情绪波动较大,西方以此作为战关象征牺牲之意,东方则代表吉祥、乐观、喜庆之意,红色也有警示的意思。

      橙色(orange)

      时尚,青春,动感,有种让人活力四射的感觉。炽烈之生命,太阳光也是橙色。 yixieshi

      蓝色(blue)

      宁静,自由,清新。欧洲为对国家之忠诚象征。一些护士护士服就是蓝色的。在中国,海军的服装就是海蓝色的。深蓝也可代表孤傲、忧郁、寡言,浅蓝色代表天真、纯洁。同时蓝色也代表沉稳,安定。

      绿色(green )

      清新,健康,希望,是生命的象征。代表安全、平静、舒适之感,在四季分明之地方,如见到春天之树木、有绿色的嫩叶,看了会使人有新生之感。

      4.字体

      字体也是Logo设计的一部分,也有一些Logo就是字体的设计。

      5.造型

      外形、形体、黄金比例(几何构成)

      三、怎么做好一个Logo 互联网的一些事

      1.初出茅庐

      对需求方的了解

      2.发散思维与讨论

      天马行空、灵感。

      引导帮助需求方梳理需求解决问题,指定合理方向。

      3.实打实的功力

      构图、形体、颜色、质感

      四.设计中的几何构成 一些事

      1.实现想法与提现价值的工具(黄金比例)

      2.黄金比例的存在 一些事

      海报、工业产品、建筑、生物。都存在黄金比例。 一些事

      人与自然界的各种黄金比例,早在公元前20C到16C的石柱就记载了关于1::1618比的黄金矩形运用。

      3.黄金分割矩形与根号矩形 互联网的一些事

      黄金分割构成

      a.正方形构成 b.三角形构成 c.螺旋线构成

      根号矩形

      五、总结

      无论你是做图标或者是界面,几何构成的视觉原理是一个设计师不可缺少的,对传统比例体系的理解、如黄金分割、各种矩形以及比率和比例、形体的各种相互关系的理解,才能使自己的作品更具有价值。 yixieshi

    展开全文
  • 多彩配色,矢量卡通元素抽象图表,扁平化商务图标,简约扁平化设计,国外互联网科技公司与产品介绍ppt模板。
  • ❝作者介绍: 顾轶灵,百度商业平台研发部资深研发工程师,主要负责商业产品前端基础建设工作。...在 Web 产品中引入图标,大致经历过如下几个阶段:使用独立的图片来引入图标使用 CSS sprites 技术使用字体图标(f...

    作者介绍: 顾轶灵,百度商业平台研发部资深研发工程师,主要负责商业产品前端基础建设工作。当前主要关注设计、前端研发的协作规范与效能,以及相关流程与技术的落地。

    导语

    在产品中适当使用图标,可以让产品更生动,也更简洁。在前端项目中,处理和引入图标都是必不可少的环节。在 Web 产品中引入图标,大致经历过如下几个阶段:

    • 使用独立的图片来引入图标
    • 使用 CSS sprites 技术
    • 使用字体图标(font icons)
    • 使用 SVG(inline SVG/SVG sprites)
    • 在前端视图层框架中封装组件

    本文将简单梳理一下图标相关的工作流程的演进,以及我们在百度设计语言系统推进过程中相关的一些尝试。

    使用独立图片

    在过去有很长一段时间,前端是通过引入图片来承载图标。在没有 CSS 支持的时代,用 标签引入图标图片是唯一的可能。

    <a href="/contact.html">
      <img src="mail.jpg" alt="email">
    a>

    到了 CSS 支持背景图以后,人们开始使用 background-image 来引入一个个小图片,但本质上没有改变每个图标都使用单独图片的问题。

    显然,这样的方式在有很多图标的网页中将发起很多 HTTP 请求,占用浏览器的并行请求数量,导致整体加载时间缓慢,体验很差。对于有些鼠标悬浮后切换图标的设计,这种方式还会出现第一次切换时需要等待图标加载的问题。(但是令人沮丧的是,直到现在还有网站依然保留着这样的方式。)

    CSS Sprite

    后来在大约本世纪初的头几年,人们找到了一种新的技巧:通过将图片合并技术(image sprite)引入前端,将数量众多的图标图片进行巧妙拼合,并且在样式中通过 background-position 来通过不同位置匹配不同的图标进行显示。例如:

    .toolbtn {
      backgroundurl(icons.png);
      display: inline-block;
      height20px;
      width20px;
    }

    #btn1 {
      background-position: -20px 0px;
    }
    #btn2 {
      background-position: -40px 0px;
    }

    虽然这种方式相较于每个小图标一个图片文件,只会发起一次 HTTP 请求,对性能更加友好,但是依然有着如下问题:

    • 拼合后的图片非常难以维护,需要手动精心调整。虽然也有一些自动生成“雪碧图”的工具,但由于 background-position 这种方式的限制,生成逻辑无法保证灵活适应各种可能的使用场景。

      babb2e44d8be9da80ca4464ebdb551a7.png
      图片来自 https://www.smashingmagazine.com/2012/04/css-sprites-revisited/
    • 当一个项目图标很多时,图片会在整体下载完以后才显示,可能会导致一段较长的时间内所有图标都无法显示。同时由于高昂的维护成本,很难做到按需加载图标,往往整站的图标都会全部合并到同一个“雪碧图”中。

    • 图标颜色是确定的,无法在前端根据内容上下文灵活调整图标的颜色。

    • 图片尺寸是固定的,进行缩放后很难保证图标的显示效果。

    在这个时代,设计师和工程师协作的模式一般来说都是设计师将设计好的图标文件交付给工程师,由工程师来通过图片编辑工具或者一些雪碧图生成器来维护拼合后的图片,效率和可维护性都非常堪忧。

    字体图标的崛起

    由于图标从某种程度上来看可以被视为“象形文字”,所以当 CSS 开始支持 @font-face 引入 web font,人们立刻想到了用它来载入、显示图标。从 2012 年至今,提供大量免费图标的 FontAwesome 就取得了很大的成功(后来开始商业化的 FontAwesome 5 的甚至为他们在 Kickstarter 上筹集到了一百万美金),各种字体图标平台也层出不穷。阿里的 iconfont.cn 平台从多年前开始就已经成为国内最受欢迎的图标托管、共享、管理平台。可以说字体图标时至今日还是最热门的 web 图标方案之一。

    字体图标的原理非常简单,通过占用一些 Unicode 字符编码(通常是私人使用区,U+E000-U+F8FFU+F0000-U+FFFFD 以及 U+100000-U+10FFFD 范围内)并为其绘制字形,同时生成好一堆预定义的图标名 class name,通过 web font 的方式加载资源,通过对应的 class name 来引用图标。由于各个浏览器对 web font 支持的字体格式兼容性有差异,往往需要生成多个格式的字体供浏览器进行选择性加载:

    /* iconfont.cn 生成的样式文件大致如下: */
    @font-face {
      font-family"iconfont";
      srcurl('iconfont.eot'); /* IE9 */
      srcurl('iconfont.eot#iefix'format('embedded-opentype'), /* IE6-IE8 */
      url('iconfont.woff2'format('woff2'),
      url('iconfont.woff'format('woff'),
      url('iconfont.ttf'format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
      url('iconfont.svg#iconfont'format('svg'); /* iOS 4.1- */
    }

    .iconfont {
      font-family"iconfont" !important;
    }

    .icon-flag:before {
      content"\e233";
    }

    在 HTML 中使用:

    <i class="icon-flag">i>

    字体图标虽然也很难维护,但是相比“雪碧图”还是有不少明显的优势:

    • 基于轮廓字体格式的字体图标是通过贝塞尔曲线描述的,可以任意伸缩并且保持显示效果不失真,这在移动端尤为重要。
    • 字体可以轻易地使用 CSS 设置颜色。

    但我们可以看出,这个方案对使用者的工程能力已经有所要求。虽然在这个时代,多数业内前端团队已经都有了初步的工程化能力,开始使用诸如 Grunt/Gulp 甚至 webpack 等工具,基于 Node + npm 去定制各自团队的工程化方案了,但是编排每个图标的 Unicode 编码、生成对应的 CSS 代码就已经有比较大的工作量,更别说生成这么多格式的字体文件,普通工程师根本无从下手。这也是 iconfont.cn 吸引大量用户的重要原因。重度依赖第三方平台,自己建设成本又比较高,使得图标的可维护性依然存在一定的痛点。

    另外,虽然字体图标解决了一些“雪碧图”的体验问题,它也带来了一些新问题:

    • 字体文件加载需要时间,在文件加载完成前,图标是无法显示的,内容就很容易发生闪烁。在某些浏览器下,处于私有使用区的图标在默认字体下甚至会显示为一个方块字符。

      db46513764c903e0294095cba45e45b9.gif
      图片来自https://github.blog/2016-02-22-delivering-octicons-with-svg/

      这一点实际上和“雪碧图”有着很大的共同点。虽然我们可以使用 data URI 来将资源内联,事实上有很长时间我们也的确使用过将图片或者字体通过 data URI 编码后内联到 HTML 的方式来避免这个加载的时间差,但是编码本身会增加内容 1/3 左右的尺寸,实际上只能算是一种取舍和妥协。更别说字体图标需要生成如此多格式的字体,内联到 HTML 网页性能将大打折扣。

    • 可访问性问题:对于患有视力障碍使用读屏器的用户,由于字体图标实际由字符承载,无论字体是否加载完毕,读屏器都无法正常朗读其内容,在默认的状态下甚至会读出“unpronounceable”这样不符合预期的内容,可以想象如果一个网页大量使用字体图标却没有逐个标注 aria-hidden 这样的语义标记,会对读屏器用户产生多大的困惑。

    SVG 图标

    SVG 天生就带有可伸缩(SVG 中的 S)特性,非常适合用来实现图标。同时,SVG 是文本文件,同时诸多支持矢量编辑的设计工具都支持通过 SVG 导出,设计师可以直接交付给工程师使用,也不再需要生成字体文件,大大缓解了可维护性上的痛点。但如果将它当成图片,通过 或 CSS background-image 来引入,仅仅有这些优势还不足以撼动图标字体的地位。

    内联 SVG

    SVG 的真正强大之处在于,当将其内联入 HTML 内容,那么它的文档模型将可以被该页面的 JS/CSS 访问和操作。这为 web 图标开启了新的篇章:

    • 可以通过 CSS 控制图标的颜色甚至具体样式,使得受业务逻辑控制的动画图标成为可能。
    • 在显示效果上,字体图标由于本质上被视为文本,将受到浏览器的文字抗锯齿算法的影响,在特定操作系统、浏览器、字体设置下视觉效果可能会不那么“保真”。而 SVG 被视为图片进行渲染,不会受文字抗锯齿算法影响,渲染效果更加原汁原味。
    • SVG 内联入 HTML 内容并不需要进行编码,重复的 SVG 内容也是对 gzip 友好的,对 HTML 加载速度的性能损耗很小。
    • 不需要发起资源请求,可以随着 HTML 内容进行流式加载和渲染,不会产生任何闪动的体验问题。
    • 图标加载可以做到完全按需,当前页面没有用到的图标都不会输出。
    • SVG 可以通过 元素标记内容,对读屏器友好。

    相比于通过图片资源加载或者图标字体,只有一个劣势:

    • 图标成为 HTML 内容的一部分,不再能在 CSS 中指定需要使用的图标了。当然这一点从我们的实践中来看,并不构成很大的阻碍。

    虽然内联 SVG 有很多优势,但是在这个阶段,在开发时使用它们却不像字体图标那么简单直接(引入一个 CSS,前端就能任意使用),需要对工程有一定侵入性的处理。GitHub 在 2016 年全面启用了内联 SVG 的方案,他们的技术栈是 Ruby 的后端渲染,通过服务端脚本定义的 helper 函数来进行图标字体的调用:

    :symbol => "plus") %>

    输出:

    <svg aria-hidden="true" class="octicon octicon-plus" width="12" height="16" role="img" version="1.1" viewBox="0 0 12 16">
        <path d="M12 9H7v5H5V9H0V7h5V2h2v5h5v2z">path>
    svg>

    SVG Sprite

    由于 SVG 支持一个 元素,可以从内联的 SVG 中选取特定内容出来作为独立的 SVG 进行显示,所以人们受 CSS sprite 的启发,也设计了一个 SVG sprite 方案。引入整个 SVG sprite 的资源仅需要内联一个 元素:

    <svg>
      <defs>
        <symbol id="shape-icon-1">
          
        <symbol>
        <symbol id="shape-icon-2">
          
        <symbol>
        
      defs>
    svg>

    使用时:

    <svg viewBox="0 0 16 16" class="icon">
      <use xlink:href="#shape-icon-1">use>
    svg>

    同时,也有不少基于 Grunt/Gulp/webpack 的构建方案,来快速生成 SVG sprite。

    这种方式主要的问题在于:

    • 不容易按需引入图标。
    • 在各个场景使用时比较繁琐。

    前端组件框架的时代

    终于到了我们现在所处的时代,这是一个 web 端渲染逻辑被移到前端,前端工程方向被组件化框架主导的时代。在使用 React/Vue/Angular/Svelte/…… 等各种框架的过程中,我们已经习惯于将视图逻辑通过组件进行拆解和复用。那么我们很自然地就可以通过设计图标组件来对底层方案进行一层封装,暴露给前端更简单直接的 API 来使用图标。要注意的是,这并没有在根本上改变 web 图标渲染的方式,底层依然是基于前文提到的各种方案。在不使用这些视图层框架的项目中,我们依然仰赖使用上述 low-level 的实现来进行开发。

    当然,从各方面综合比较,封装内联 SVG 应该是当前最佳的选择。上文 GitHub 后端 helper 的方案对应当前前端的技术方案,实际上就是基于内联 SVG 的图标组件。npm 上目前也有很多基于各个组件框架开发的图标组件,包括 FontAwesome 都已经内置了 SVG、React/Vue 组件等更现代化的方案。

    既然体验问题已经由内联 SVG 得到了比较好的解决,那么在这个阶段我们就有更多的精力去更多地考虑研发效能、一致性、开发体验的问题了。从我们在百度内部以往的实践中来看,存在这如下的一些问题:

    • 工作流程缺乏最佳实践,由于长期各个团队有着较为独立的技术演变,使用的 web 图标方案并不统一。
    • 整个大体系下跨团队的设计师并没有很好地共享图标资源,存在一定的重复设计。
    • 有图标组件库,但是图标有限,业务需要新增图标时设计师往往还是将图标线下交付给工程师,前端通过一些类似 svg-icon-loader 的方案将图标引入项目,但方案往往各不相同。一旦引入这样的流程,相当于给图标在特定项目中新增了一个 fork 版本,日后想做设计风格的统一调整就需要业务跟进修改,成本很高。
    • 针对 SVG 图标组件,我们没有一个类似 iconfont.cn 的平台进行流程上的收拢,也没有自动化的代码包导出、发布能力。

    理想情况下,我们希望达成如下目标:

    • 图标设计师维护图标源文件,发布以后没有任何人工干预造成流程分叉,有一个固定的图标库平台提供 single source of truth。
    • 每个团队能根据自身技术栈,选择需要导出的组件实现类型(React/Vue/San/...)。
    • 图标组件库中的图标数据会被自动优化、压缩。
    • 图标组件库应该是可以跟随图标库的数据更新升级的。

    目前我们在推进百度设计语言系统的过程中,和工程效能团队一起,设计了如下整体方案:

    9d1a41f95a3ec84eebe8913a6f030d2d.png
    图标平台整体流程

    图标管理平台

    这个平台可以视为是一个简单的图标 CMS,可以创建/管理图标库,图标设计师负责来在其中添加、管理图标。在完成数据的更新后,可以选择发布当前图标输出到 API。这个 API 返回图标库中图标的图形数据(SVG 源文件)和元数据,在整个流程中主要有两个消费者:给设计团队使用的 Sketch 插件,以及前端的编译/发布服务。我们允许图标库发布时通过 webhook 配置需要通知的编译服务,所以有必要的话,不同的使用方也可以选择自己自定义整套编译发布的流程。

    Sketch 插件

    我们给设计团队提供了联通图标管理平台的 Sketch 插件,设计师可以在插件中快速搜索需要的图标进行使用。通过我们的插件导出在线标注稿后,标注稿上就会自动标注图标在图标平台中的唯一标识符,这也是我们用来生成图标组件时用的标识符,前端工程师通过它就能直接从图标组件包中引入对应的图标组件。

    优化/编译/发布服务

    这个服务在图标库 API 触发更新时主要做了三件事:

    1. 优化。从 API 读取图标数据,并且将源文件通过 SVGO 进行初步优化。由于我们希望图标组件内联到 HTML 以后可以通过 CSS 灵活修改颜色,所以对于常见的单色图标,我们需要去除所有硬编码的颜色,在有必要时设置为 currentColor。在这一步我们通过 svgson 遍历 SVG 元素处理相关逻辑。
    2. 编译。得到了优化过的图标数据,我们需要根据他们来生成我们的图标组件包。在这里我们提供了多个框架的组件包模板,每个模板中都已经提供了对应各自框架的图标组件工厂函数,只需要通过脚本在模板中注入图标数据,即可根据平台数据灵活生成各个业务所需要的组件包。
    3. 发布。根据在 webhook 回调路径中的配置,我们可以指定需要发布的包的名称,描述等信息。版本号的逻辑也比较简单:
    • 删除/改名图标:major + 1
    • 新增图标:minor + 1
    • 修改图标内容:patch + 1

    图标包模板

    编译服务对包模板(boilerplate)仅有的约定是:

    1. 编译服务会在特定目录输出图标数据。
    2. 编译服务会依次调用特定的 npm script。

    模板提供者需要提供图标组件的具体实现,以及将图标数据转换为前端代码的构建脚本。如果没有特殊的需求,直接使用我们提供的 React/Vue 等框架下的组件模板,就可以获得高质量的前端图标组件实现了。

    通过编译服务发布完成以后,前端工程师只需要知道:1. 使用的图标来自哪个 npm 包 2. 这个图标叫什么名字,即可快速在前端项目中引入图标。同时,整个流程保证了设计师产出的设计稿、前端实现的一致,并且可以从图标平台中心化地控制升级。


    总结

    在 Web 产品中引入图标我们前端工程师做过很多探索,也产出过很多相关的辅助工具来完善整个协作流程。在目前组件化开发的大背景下,我们通过分析各个方案的优缺点,建立起一套当下的“最佳实践”,减少了流程中的沟通和容易出错的人工操作,高效地达成了设计和实现的一致性。最后,希望本文的内容能给大家带来收获,谢谢。

    展开全文
  • ❝作者介绍: 顾轶灵,百度商业平台研发部资深研发工程师,主要负责商业产品前端基础建设工作。...在 Web 产品中引入图标,大致经历过如下几个阶段:使用独立的图片来引入图标使用 CSS sprites 技术使用字体图标(f...

    作者介绍: 顾轶灵,百度商业平台研发部资深研发工程师,主要负责商业产品前端基础建设工作。当前主要关注设计、前端研发的协作规范与效能,以及相关流程与技术的落地。

    导语

    在产品中适当使用图标,可以让产品更生动,也更简洁。在前端项目中,处理和引入图标都是必不可少的环节。在 Web 产品中引入图标,大致经历过如下几个阶段:

    • 使用独立的图片来引入图标
    • 使用 CSS sprites 技术
    • 使用字体图标(font icons)
    • 使用 SVG(inline SVG/SVG sprites)
    • 在前端视图层框架中封装组件

    本文将简单梳理一下图标相关的工作流程的演进,以及我们在百度设计语言系统推进过程中相关的一些尝试。

    使用独立图片

    在过去有很长一段时间,前端是通过引入图片来承载图标。在没有 CSS 支持的时代,用 标签引入图标图片是唯一的可能。

    <a href="/contact.html">
      <img src="mail.jpg" alt="email">
    a>

    到了 CSS 支持背景图以后,人们开始使用 background-image 来引入一个个小图片,但本质上没有改变每个图标都使用单独图片的问题。

    显然,这样的方式在有很多图标的网页中将发起很多 HTTP 请求,占用浏览器的并行请求数量,导致整体加载时间缓慢,体验很差。对于有些鼠标悬浮后切换图标的设计,这种方式还会出现第一次切换时需要等待图标加载的问题。(但是令人沮丧的是,直到现在还有网站依然保留着这样的方式。)

    CSS Sprite

    后来在大约本世纪初的头几年,人们找到了一种新的技巧:通过将图片合并技术(image sprite)引入前端,将数量众多的图标图片进行巧妙拼合,并且在样式中通过 background-position 来通过不同位置匹配不同的图标进行显示。例如:

    .toolbtn {
      backgroundurl(icons.png);
      display: inline-block;
      height20px;
      width20px;
    }

    #btn1 {
      background-position: -20px 0px;
    }
    #btn2 {
      background-position: -40px 0px;
    }

    虽然这种方式相较于每个小图标一个图片文件,只会发起一次 HTTP 请求,对性能更加友好,但是依然有着如下问题:

    • 拼合后的图片非常难以维护,需要手动精心调整。虽然也有一些自动生成“雪碧图”的工具,但由于 background-position 这种方式的限制,生成逻辑无法保证灵活适应各种可能的使用场景。

      428e81c4bac216b429fb4c066a366b76.png
      图片来自 https://www.smashingmagazine.com/2012/04/css-sprites-revisited/
    • 当一个项目图标很多时,图片会在整体下载完以后才显示,可能会导致一段较长的时间内所有图标都无法显示。同时由于高昂的维护成本,很难做到按需加载图标,往往整站的图标都会全部合并到同一个“雪碧图”中。

    • 图标颜色是确定的,无法在前端根据内容上下文灵活调整图标的颜色。

    • 图片尺寸是固定的,进行缩放后很难保证图标的显示效果。

    在这个时代,设计师和工程师协作的模式一般来说都是设计师将设计好的图标文件交付给工程师,由工程师来通过图片编辑工具或者一些雪碧图生成器来维护拼合后的图片,效率和可维护性都非常堪忧。

    字体图标的崛起

    由于图标从某种程度上来看可以被视为“象形文字”,所以当 CSS 开始支持 @font-face 引入 web font,人们立刻想到了用它来载入、显示图标。从 2012 年至今,提供大量免费图标的 FontAwesome 就取得了很大的成功(后来开始商业化的 FontAwesome 5 的甚至为他们在 Kickstarter 上筹集到了一百万美金),各种字体图标平台也层出不穷。阿里的 iconfont.cn 平台从多年前开始就已经成为国内最受欢迎的图标托管、共享、管理平台。可以说字体图标时至今日还是最热门的 web 图标方案之一。

    字体图标的原理非常简单,通过占用一些 Unicode 字符编码(通常是私人使用区,U+E000-U+F8FFU+F0000-U+FFFFD 以及 U+100000-U+10FFFD 范围内)并为其绘制字形,同时生成好一堆预定义的图标名 class name,通过 web font 的方式加载资源,通过对应的 class name 来引用图标。由于各个浏览器对 web font 支持的字体格式兼容性有差异,往往需要生成多个格式的字体供浏览器进行选择性加载:

    /* iconfont.cn 生成的样式文件大致如下: */
    @font-face {
      font-family"iconfont";
      srcurl('iconfont.eot'); /* IE9 */
      srcurl('iconfont.eot#iefix'format('embedded-opentype'), /* IE6-IE8 */
      url('iconfont.woff2'format('woff2'),
      url('iconfont.woff'format('woff'),
      url('iconfont.ttf'format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
      url('iconfont.svg#iconfont'format('svg'); /* iOS 4.1- */
    }

    .iconfont {
      font-family"iconfont" !important;
    }

    .icon-flag:before {
      content"\e233";
    }

    在 HTML 中使用:

    <i class="icon-flag">i>

    字体图标虽然也很难维护,但是相比“雪碧图”还是有不少明显的优势:

    • 基于轮廓字体格式的字体图标是通过贝塞尔曲线描述的,可以任意伸缩并且保持显示效果不失真,这在移动端尤为重要。
    • 字体可以轻易地使用 CSS 设置颜色。

    但我们可以看出,这个方案对使用者的工程能力已经有所要求。虽然在这个时代,多数业内前端团队已经都有了初步的工程化能力,开始使用诸如 Grunt/Gulp 甚至 webpack 等工具,基于 Node + npm 去定制各自团队的工程化方案了,但是编排每个图标的 Unicode 编码、生成对应的 CSS 代码就已经有比较大的工作量,更别说生成这么多格式的字体文件,普通工程师根本无从下手。这也是 iconfont.cn 吸引大量用户的重要原因。重度依赖第三方平台,自己建设成本又比较高,使得图标的可维护性依然存在一定的痛点。

    另外,虽然字体图标解决了一些“雪碧图”的体验问题,它也带来了一些新问题:

    • 字体文件加载需要时间,在文件加载完成前,图标是无法显示的,内容就很容易发生闪烁。在某些浏览器下,处于私有使用区的图标在默认字体下甚至会显示为一个方块字符。

      541659ab0575c26527b253d02723bd42.gif
      图片来自https://github.blog/2016-02-22-delivering-octicons-with-svg/

      这一点实际上和“雪碧图”有着很大的共同点。虽然我们可以使用 data URI 来将资源内联,事实上有很长时间我们也的确使用过将图片或者字体通过 data URI 编码后内联到 HTML 的方式来避免这个加载的时间差,但是编码本身会增加内容 1/3 左右的尺寸,实际上只能算是一种取舍和妥协。更别说字体图标需要生成如此多格式的字体,内联到 HTML 网页性能将大打折扣。

    • 可访问性问题:对于患有视力障碍使用读屏器的用户,由于字体图标实际由字符承载,无论字体是否加载完毕,读屏器都无法正常朗读其内容,在默认的状态下甚至会读出“unpronounceable”这样不符合预期的内容,可以想象如果一个网页大量使用字体图标却没有逐个标注 aria-hidden 这样的语义标记,会对读屏器用户产生多大的困惑。

    SVG 图标

    SVG 天生就带有可伸缩(SVG 中的 S)特性,非常适合用来实现图标。同时,SVG 是文本文件,同时诸多支持矢量编辑的设计工具都支持通过 SVG 导出,设计师可以直接交付给工程师使用,也不再需要生成字体文件,大大缓解了可维护性上的痛点。但如果将它当成图片,通过 或 CSS background-image 来引入,仅仅有这些优势还不足以撼动图标字体的地位。

    内联 SVG

    SVG 的真正强大之处在于,当将其内联入 HTML 内容,那么它的文档模型将可以被该页面的 JS/CSS 访问和操作。这为 web 图标开启了新的篇章:

    • 可以通过 CSS 控制图标的颜色甚至具体样式,使得受业务逻辑控制的动画图标成为可能。
    • 在显示效果上,字体图标由于本质上被视为文本,将受到浏览器的文字抗锯齿算法的影响,在特定操作系统、浏览器、字体设置下视觉效果可能会不那么“保真”。而 SVG 被视为图片进行渲染,不会受文字抗锯齿算法影响,渲染效果更加原汁原味。
    • SVG 内联入 HTML 内容并不需要进行编码,重复的 SVG 内容也是对 gzip 友好的,对 HTML 加载速度的性能损耗很小。
    • 不需要发起资源请求,可以随着 HTML 内容进行流式加载和渲染,不会产生任何闪动的体验问题。
    • 图标加载可以做到完全按需,当前页面没有用到的图标都不会输出。
    • SVG 可以通过 元素标记内容,对读屏器友好。

    相比于通过图片资源加载或者图标字体,只有一个劣势:

    • 图标成为 HTML 内容的一部分,不再能在 CSS 中指定需要使用的图标了。当然这一点从我们的实践中来看,并不构成很大的阻碍。

    虽然内联 SVG 有很多优势,但是在这个阶段,在开发时使用它们却不像字体图标那么简单直接(引入一个 CSS,前端就能任意使用),需要对工程有一定侵入性的处理。GitHub 在 2016 年全面启用了内联 SVG 的方案,他们的技术栈是 Ruby 的后端渲染,通过服务端脚本定义的 helper 函数来进行图标字体的调用:

    :symbol => "plus") %>

    输出:

    <svg aria-hidden="true" class="octicon octicon-plus" width="12" height="16" role="img" version="1.1" viewBox="0 0 12 16">
        <path d="M12 9H7v5H5V9H0V7h5V2h2v5h5v2z">path>
    svg>

    SVG Sprite

    由于 SVG 支持一个 元素,可以从内联的 SVG 中选取特定内容出来作为独立的 SVG 进行显示,所以人们受 CSS sprite 的启发,也设计了一个 SVG sprite 方案。引入整个 SVG sprite 的资源仅需要内联一个 元素:

    <svg>
      <defs>
        <symbol id="shape-icon-1">
          
        <symbol>
        <symbol id="shape-icon-2">
          
        <symbol>
        
      defs>
    svg>

    使用时:

    <svg viewBox="0 0 16 16" class="icon">
      <use xlink:href="#shape-icon-1">use>
    svg>

    同时,也有不少基于 Grunt/Gulp/webpack 的构建方案,来快速生成 SVG sprite。

    这种方式主要的问题在于:

    • 不容易按需引入图标。
    • 在各个场景使用时比较繁琐。

    前端组件框架的时代

    终于到了我们现在所处的时代,这是一个 web 端渲染逻辑被移到前端,前端工程方向被组件化框架主导的时代。在使用 React/Vue/Angular/Svelte/…… 等各种框架的过程中,我们已经习惯于将视图逻辑通过组件进行拆解和复用。那么我们很自然地就可以通过设计图标组件来对底层方案进行一层封装,暴露给前端更简单直接的 API 来使用图标。要注意的是,这并没有在根本上改变 web 图标渲染的方式,底层依然是基于前文提到的各种方案。在不使用这些视图层框架的项目中,我们依然仰赖使用上述 low-level 的实现来进行开发。

    当然,从各方面综合比较,封装内联 SVG 应该是当前最佳的选择。上文 GitHub 后端 helper 的方案对应当前前端的技术方案,实际上就是基于内联 SVG 的图标组件。npm 上目前也有很多基于各个组件框架开发的图标组件,包括 FontAwesome 都已经内置了 SVG、React/Vue 组件等更现代化的方案。

    既然体验问题已经由内联 SVG 得到了比较好的解决,那么在这个阶段我们就有更多的精力去更多地考虑研发效能、一致性、开发体验的问题了。从我们在百度内部以往的实践中来看,存在这如下的一些问题:

    • 工作流程缺乏最佳实践,由于长期各个团队有着较为独立的技术演变,使用的 web 图标方案并不统一。
    • 整个大体系下跨团队的设计师并没有很好地共享图标资源,存在一定的重复设计。
    • 有图标组件库,但是图标有限,业务需要新增图标时设计师往往还是将图标线下交付给工程师,前端通过一些类似 svg-icon-loader 的方案将图标引入项目,但方案往往各不相同。一旦引入这样的流程,相当于给图标在特定项目中新增了一个 fork 版本,日后想做设计风格的统一调整就需要业务跟进修改,成本很高。
    • 针对 SVG 图标组件,我们没有一个类似 iconfont.cn 的平台进行流程上的收拢,也没有自动化的代码包导出、发布能力。

    理想情况下,我们希望达成如下目标:

    • 图标设计师维护图标源文件,发布以后没有任何人工干预造成流程分叉,有一个固定的图标库平台提供 single source of truth。
    • 每个团队能根据自身技术栈,选择需要导出的组件实现类型(React/Vue/San/...)。
    • 图标组件库中的图标数据会被自动优化、压缩。
    • 图标组件库应该是可以跟随图标库的数据更新升级的。

    目前我们在推进百度设计语言系统的过程中,和工程效能团队一起,设计了如下整体方案:

    210bd3849a6a92e0696ea1a9d2d0c569.png
    图标平台整体流程

    图标管理平台

    这个平台可以视为是一个简单的图标 CMS,可以创建/管理图标库,图标设计师负责来在其中添加、管理图标。在完成数据的更新后,可以选择发布当前图标输出到 API。这个 API 返回图标库中图标的图形数据(SVG 源文件)和元数据,在整个流程中主要有两个消费者:给设计团队使用的 Sketch 插件,以及前端的编译/发布服务。我们允许图标库发布时通过 webhook 配置需要通知的编译服务,所以有必要的话,不同的使用方也可以选择自己自定义整套编译发布的流程。

    Sketch 插件

    我们给设计团队提供了联通图标管理平台的 Sketch 插件,设计师可以在插件中快速搜索需要的图标进行使用。通过我们的插件导出在线标注稿后,标注稿上就会自动标注图标在图标平台中的唯一标识符,这也是我们用来生成图标组件时用的标识符,前端工程师通过它就能直接从图标组件包中引入对应的图标组件。

    优化/编译/发布服务

    这个服务在图标库 API 触发更新时主要做了三件事:

    1. 优化。从 API 读取图标数据,并且将源文件通过 SVGO 进行初步优化。由于我们希望图标组件内联到 HTML 以后可以通过 CSS 灵活修改颜色,所以对于常见的单色图标,我们需要去除所有硬编码的颜色,在有必要时设置为 currentColor。在这一步我们通过 svgson 遍历 SVG 元素处理相关逻辑。
    2. 编译。得到了优化过的图标数据,我们需要根据他们来生成我们的图标组件包。在这里我们提供了多个框架的组件包模板,每个模板中都已经提供了对应各自框架的图标组件工厂函数,只需要通过脚本在模板中注入图标数据,即可根据平台数据灵活生成各个业务所需要的组件包。
    3. 发布。根据在 webhook 回调路径中的配置,我们可以指定需要发布的包的名称,描述等信息。版本号的逻辑也比较简单:
    • 删除/改名图标:major + 1
    • 新增图标:minor + 1
    • 修改图标内容:patch + 1

    图标包模板

    编译服务对包模板(boilerplate)仅有的约定是:

    1. 编译服务会在特定目录输出图标数据。
    2. 编译服务会依次调用特定的 npm script。

    模板提供者需要提供图标组件的具体实现,以及将图标数据转换为前端代码的构建脚本。如果没有特殊的需求,直接使用我们提供的 React/Vue 等框架下的组件模板,就可以获得高质量的前端图标组件实现了。

    通过编译服务发布完成以后,前端工程师只需要知道:1. 使用的图标来自哪个 npm 包 2. 这个图标叫什么名字,即可快速在前端项目中引入图标。同时,整个流程保证了设计师产出的设计稿、前端实现的一致,并且可以从图标平台中心化地控制升级。


    总结

    在 Web 产品中引入图标我们前端工程师做过很多探索,也产出过很多相关的辅助工具来完善整个协作流程。在目前组件化开发的大背景下,我们通过分析各个方案的优缺点,建立起一套当下的“最佳实践”,减少了流程中的沟通和容易出错的人工操作,高效地达成了设计和实现的一致性。最后,希望本文的内容能给大家带来收获,谢谢。

    展开全文
  • 详细介绍了应用图标的设计原则及分类,全文约6800字,40+张图片,文章较长,各位看官可以收藏起来慢慢观看~应用图标在 UI 设计体系中是最重要的组成部分之一,是应用软件的主要入口,代表着一个产品的视觉形象,是一...
  • 个人介绍,公司介绍,团队介绍,公司大记事时间轴,我们的服务,步骤流程,我们的项目,我们的服务,销售计划,产品展示,附灰色线条简约图标,公司企业彩色扁平化精美通用商业报告ppt模板。
  • 这是喜茶官网的关于原创芝士茗茶的产品介绍,那么怎么做出一个PPT产品介绍页面呢?PPT页面标题采用大文字和副标题结合,有重点突出和阐述说明效果,能够给人非常直观的视觉效果。主要内容部分采用并列文字设计,有理...
  • 编辑导读:图标是我们在制作产品原型的时候使用的比较多的一类素材,在日常绘制原型的时候一般是以插入的形式添加到Axure中。本文作者结合自身经验,介绍了四种Axure中引入图标的方法,希望对大家能有所帮助。在日常...
  • 互联网产品开发中,SVG图标已被广泛应用。各大主流平台组件库也提供了大量默认的SVG图标,供设计师和开发工程师使用。这篇文章将以项目实操经验为例,为大家介绍SVG图标在设计制作的过程中是怎样进行图形与代码的...
  • 4.勾上允许访问文件地址 产品开发流程 售前工程师或者老板: 确定项目 产品经理进行产品设计:出需求文档,原型图 需求评审会 (尽可能避免需求变更) UI根据原型图出设计稿 前端根据设计稿出静态页面 后端写接口,出...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 371
精华内容 148
关键字:

产品介绍图标