素材源自网络
这是我们收集UI / UX交互的一周时间,以增强您的用户界面灵感。我们专注于酷炫的动画,布局设计,用户体验思考等等。我们正在从静态,动态甚至是现场原型混合它,这可能是一个伟大的每周系列书签!本周,我们对交互/转换的关注较少。本周我们一直在挖掘一些动画,但我们发现的主要是静态的。我们有各种各样的组合,恰到好处地为您提供创意提升。
作为互联网的用户体验实践者-交互设计师,大大小小经历过很多不同种类不同维度的项目,比如成熟期产品的常规迭代项目(如社交指数、校园问答、空间社交周报、Feeds新增礼物等),这时我是哪里需要就在那里的问题解决者;也会和产品一起探索新的产品方向,经历从0到1的探索型项目(如视界、AR相机、ABCmouse等),此时我是主动探索的问题解决者。近两年都在思考用户体验设计师该如何在互联网团队中发挥设计最大价值,最终达到“解决用户问题,创造美好产品体验”的终极目标。结合自己的用户体验设计从业经历,我尝试给设计做个定义:
设计就是从已知探索未知的过程,是一个不断解决问题的过程。
具体来讲,就是从发现问题/机会点后,通过“How”等各种方法手段去解决问题/机会点的整个过程。
而解决问题/机会点的各种方法手段“How”就至关重要,在寻求“How”的过程中,受到MIT媒体实验室教授Neri Oxman文章《Design and Science - Krebs Cycle of Creativity》一文启发,Neri Oxman在《Design and Science - Krebs Cycle of Creativity》中提出的类似克雷布斯循环的创造力的克氏循环(KCC),创造性的将人类的创造力四种模式-科学、工程、设计和艺术,形成创意循环的地图假设并进行了相应解读,阐释了学科之间不再是割裂离散的孤岛这一命题。感兴趣的小伙伴可以使用传送门:
英文版原文:《Age of Entanglement》https://jods.mitpress.mit.edu/pub/ageofentanglement。
中文翻译版本之【设计读本】媒体实验室教授Neri Oxman文章《纠缠时代》,揭示创意循环在科学、工程、设计与艺术中深层关系》:https://zhuanlan.zhihu.com/p/27951549。
拓展阅读:《Design and Science byJoichi Ito》https://jods.mitpress.mit.edu/pub/designandscience。
区别于“点对点”的解决问题,为了从更高角度更好的解决问题,类比克雷布斯循环和创造力的克氏循环(KCC),将“发现-解决”问题/机会点这一过程整体系统化,尝试提出系统性解决问题之 < 思考-行动 > 模型-Krebs Cycle of Design。
系统性解决问题之 < 思考-行动 > 模型主要包含以下8个阶段:发现问题/机会点- 系统性思考- 判断问题/机会点- 挖掘行动- 挖掘出真正的问题/机会点 - 解决行动 - 构建更好的产品(1小步)- 迭代进化思考 - 重新发现问题/机会点。
前文讲述了系统性解决问题之 < 思考-行动 > 模型-Krebs Cycle of Design,接下来通过具体的项目,说明如何通过“系统性解决问题之 < 思考-行动 > 模型”全局解决问题,这里采用一个从需求引发的未知产品探索,以QQ空间基础Feeds信息流产品为例。
作为腾讯典型社交产品,QQ空间已经12年了,那么对于12年的空间Feeds信息流产品日常需求,整体来讲具有以下3个特点:需求量多(面对多个产品不断快速迭代)、需求类型杂、需求内容小。
基于这样一个前提,为了更好的解决问题,仅仅只做需求是不够的,需要设计师发挥产品主人翁意识,这样首先我的角色定位无形中发生了变化,从单纯的设计师(产品需求转换者)转变为产品设计师(产品需求洞察者)。
角色的变化,进一步带来了解决问题思维模式的变化,从之前为单一用户需求而设计的线性解决问题思维模式转变为从点触发的系统性解决问题思维模式。
总的来讲系统性解决问题之 < 思考-行动 > 模型,以空间基础Feeds信息流产品为例。主要有以下几个阶段,并且每一个阶段都是上一个阶段的自然转化。
1. 提出产品需求/机会点。
2. 基于产品需求/机会点,从点触发,通过系统性思考,全面的思考分析。
3. 基于系统性思考,判断需求在系统中是否有价值。
4. 判断有价值后,继续深入挖掘更多的问题和机会点。
5. 综合判断挖掘真正的问题/机会点。
6. 确定真正的问题/机会点后,针对性的进行解决行动。
7. 阶段性的解决行动后,就向构建一个更好的产品迈出了一小步。
8. 构建更好的产品后,为了产品后续更好发展,进入新一轮的迭代进化思考。
9. 迭代进化思考后,就开始了新一轮的系统性解决问题,构建越来越好的产品和更加美好的体验。
在互联网公司,尤其是互联网产品比较成熟时(如QQ空间Feeds信息流产品),设计师通常扮演者产品需求转换者的角色,在常规迭代项目中面对产品经理一个又一个的小点需求,很多设计师都是基于点对点的需求进行功能细化,有些甚至可以直接开始详细设计;而系统性解决问题思考行动模型则建议“将产品需求直接转换为详细设计”的这一类设计师,在日常常规需求之外,可以跳出点对点的小需求,更加系统的思考需求&探索问题和机会点。
从已知的需求、问题和机会点出发,从点触发设计师全局思考产品。通过系统性思考,了解产品整体系统,该部分思考的维度和方法,通常从商业、产品、项目、用户等多角度思考,如商业工具(理解商业的商业模式画布)、产品工具(了解行业位置的SWOT分析法、发散创意的搜寻领域图和思维导图)、产品工具(理解阶段目标的目标分解图)、用户研究工具(量化理解用户的问卷和访谈、定性用户研究的可用性测试&焦点小组、模拟分析场景的体验地图)。而以QQ空间Feeds信息流产品为例,阐述如何更全局的系统性思考产品。
系统性思考第1步:从日常繁琐的小需求中跳出,从资源输入-内容输出维度,全局的了解空间的整体产品体系,比如核心UGC业务、运营相关业务、分支业务、广告业务等。
系统性思考第2步:基于资源输入-内容输出维度全局了解产品体系后,针对Feeds信息流模块,梳理出资源输入类型和各个类型所包含内容,以及触达用户的内容输出Feeds类型以及包含内容信息,分析输入输出不同对象关系,明确空间Feeds信息流的空间枢纽作用,为下一步判断需求/问题/机会点的价值提供依据。
基于系统性思考,分析判断需求在系统中是否有价值。对于QQ空间Feeds信息流产品,通过产品的系统性思考,会发现Feeds基于空间的枢纽作用,连接空间各个业务内容,并以Feeds产品形态分发给UGC和PGC用户。因此Feeds信息流的产品设计优化对于整个空间而言,都有极大的商业和用户价值。
判断问题/机会点有价值后,继续纵向深入挖掘更多的问题和机会点,该部分思考的维度和方法可从需求挖掘和设计调研/用户研究两个维度,从产品、用户等多角度思考,如现有问题挖掘的日常积累法、数据定量分析法、用户调研访谈等定性研究、头脑风暴等涌现挖掘法、用户核心行为的全链路分析法等。下面以QQ空间Feeds信息流产品,举例如何深入进行挖掘行动。
挖掘行动第1步:从项目团队内部(产品&开发&设计师)收集现有痛点问题,并将问题梳理归类整理,确定内部收集痛点问题重要程度优先级。
挖掘行动第2步:从用户“发表-浏览-互动”的Feeds信息流相关的核心行为路径切入,收集用户/专家反馈,并分析确定用户核心行为路径哪些问题与Feeds相关。
挖掘行动后,就可以从产品内部、用户本身等多维度得到N个问题和机会点,通过对问题和机会点整理判断分析,得出真正的问题和机会点。如针对空间Feeds信息流产品真正的问题点和机会点有2个:Feeds缺失系统化、Feeds关键触点暴露的用户问题。
确定真正的问题/机会点后,针对性的进行解决行动。不同的问题和机会点,可根据需要采用适合的解决行动。下面仅以QQ空间Feeds信息流产品,举例如何进行解决行动。
解决行动第1步:针对有多个问题和机会点的情况,首先需要明确解决问题的优先级,这里可以参考评估优先级的方法-知觉图、C-BOX图表(来自代尔夫特设计指南《设计方法与策略》),定义问题管理四象限,从“重要程度+紧急程度”两个维度分析确定解决问题优先级,其中横坐标轴代表紧急程度,从左到右紧急程度降低;纵坐标代表重要程度,从上到下重要程度降低。正所谓建造房子地基很重要,Feeds缺失系统化代表Feeds信息流的地基不稳,在地基打牢之后我们可以有针对性的解决用户关键触点暴露的问题,分优先级逐步推进解决问题。因此形成了以解决“Feeds缺失系统化”为基础,有节奏的探索解决Feeds关键触点暴露问题的解决策略。
解决行动第2步:解决“Feeds缺失系统化”,即Feeds设计系统化,也就是将整个Feeds产品体系化,进行设计的规范化和组件化,并在设计层面和开发层面统一共享资源,并应用到产品的后续迭代中。而设计系统化的典型代表Material Design,就通过从真实世界观察到数字世界模拟,构建了一个数字世界观,包含设计理念、设计原则、设计元素(如输入框、按钮、文字等控件/组件)、设计模式(如空状态、手势、搜索等)、工具等内容。 关于设计系统化(design system感兴趣的小伙伴可以查看《design systems》一书,购买书籍链接:https://www.smashingmagazine.com/design-systems-book/。
Feeds设计系统化主要有以下3个阶段:明确设计系统化目标 - 明确设计系统化思路 - 设计系统化过程。
首先是明确设计系统化目标,明确预期目标有助于我们在项目后期更好的评估系统化设计的价值和效果,空间Feeds信息流产品主要从3个维度明确目标:规范化(形成Feeds基础设计体系,保障Feeds整体设计统一性)、提升效率(可以快速复用,保质保量的支撑业务需求的快速迭代)、可持续原则(一句话就是跟得上潮流,不断的迭代进化)。
其次是是明确设计系统化思路,明确了目标之后,需要定义如何进行Feeds设计系统化的思路,主要有以下4个阶段:场景类目梳理- 抽象框架- 填充细节内容 - 建立设计规范。
在明确了设计系统化思路后,依据思路,通过以下4个阶段一步一步构建Feeds设计系统化:场景类目梳理- 抽象框架- 填充细节内容 - 建立设计规范。
设计系统化第1步:场景类目梳理,从场景出发归类所有的Feeds类型。
设计系统化第2步:抽象框架,首先将所有Feeds类型每个的结构模块化,其次通过“类比-分析-聚类”归类同类型框架,最后设定Feeds框架应用策略(不同框架的每个模块可采用LEGO自由组合策略)。
设计系统化第3步:填充细节内容,补充A/B框架类型中的填充元素(控件/组件等内容)。
设计系统化第4步:建立Feeds设计规范,提升产品设计效率,为后续设计夯实基础。
Feeds设计系统化项目,在产品设计内部也得到了广泛好评,一定程度上提升了产品设计效率。
解决行动第3步:有节奏的探索解决Feeds关键触点暴露问题,也就是Feeds设计有亮点。设计有亮点的探索聚焦用户的核心使用路径,在关键触点上发现亮点设计机会点。
首先是聚焦用户核心行为路径,从用户触点切入,深挖不同关键触点,收集用户/专家的反馈,并针对用户的关键触点问题探索出相应的解决方案。
其次在有了这么多的亮点解决方案后,先做哪一个再做哪一个,我们需要明确亮点设计功能实践优先级。此时就需要回归产品目标用户群,深度探索目标用户的特性,比如QQ空间的使用用户群体为95后,他们具有“创造、个性、有趣、表达”等特性,他们爱玩的产品有“弹幕、变声语音、斗图、鬼畜视频”,这些产品都具有“DIY、个性互动、满足成就感”等心理因素,因此针对8个Feeds亮点解决方案,优先在互动层面实践快评表情。
接下来就是如何进行快评表情产品设计,首先明确快评表情产品设计思路,主要有以下4个阶段:定义产品需求-明确产品目标-探索用户趣味表达心智模型-定义具体的解决策略
在明确了产品设计思路后,依据思路,通过以下4个阶段逐步推进快评表情亮点化设计:定义产品需求-明确产品目标-探索用户趣味表达心智模型-定义具体的解决策略。
亮点设计第1步:定义产品需求,需要明确正在设计的产品需求到底是什么?该需求要解决什么问题,或者满足了用户哪一方面的诉求;比如在QQ空间快评表情产品设计中,由于快评表情可能存在空间多个用户场景(如Feeds评论、发表Feeds、直播场景等)。为了快速上线快评表情,验证其可促进用户活跃度,首先确定了快评表情的具体产品需求,将其使用场景缩小为优化Feeds评论表情功能。
亮点设计第2步:明确产品设计目标,确定了产品做什么后,为了更好的评估衡量设计效果,我们需要在具体设计前先定义设计预期目标。如快评表情产品需求中,在具体设计之前,明确了产品设计预期目标,如增加评论趣味性、增强用户互动欲望、提升用户活跃度等。
亮点设计第3步:探索用户趣味表达心智模型,明确了产品设计目标后,我们需要更深层次的挖掘用户使用产品心理动机,从而探索用户的一个使用心智模型,心智模型有助于我们在更高更深层面让用户使用产品过程中超出预期。如快评表情设计中,基于目标用户探索用户互动心智模型,发现了以用户互动诉求为基础,满足用户个性化、专属感、控制感的深层心理动机,从而可以让用户达到最终的成就感,建立起用户与产品的情感联系。
亮点设计第4步:定义具体的解决策略,分析了目标用户特性和动机后,可以尝试定义“如何做”的产品设计策略,搭建/聚焦用户使用核心路径,在核心路径上明确用户关键触点,并基于核心路径形成关键页面,并最后给出用户超越预期的产品体验。如快评表情设计中,由于是原有的评论表情优化,因此在定义解决策略时,首先聚焦评论表情的核心路径,基于核心路径寻求机会点,并且根据机会点搭建全新的快评表情使用路径。
定义了具体的设计解决策略后,就进入详细的交互设计阶段,此处仅由于内容篇幅太长,仅做简要的一些核心点说明。主要有3点:
1. 聚焦用户评论核心路径,找到评论表情关键触点,探索设计机会点。
2. 基于评论核心路径机会点,新增用户关键触点,加强用户与产品、用户与用户之间互动反馈。
3. 搭建用户使用新路径,通过主动触发和被动触发机制,强化推荐互动。
阶段性的解决行动后,比如进行了Feeds设计系统化打好根基,探索了快评表情的亮点设计后,已经向构建一个更好的产品迈出了一小步。无论从产品内部评价和上线后数据验证结果来看,均达到当时的一个小小目标。如产品数据验证部分方法感兴趣的,可查看“用户行为数据分析”等方法。
正所谓“潮流是在不断发展变化的”,互联网圈的发展更是日新月异,因此为了后续产品发展的更好,需要进入新一轮的迭代进化思考。如果设计师在横向有一个属于自己的设计中心(或者设计团队),可以定期挖掘讨论创意想法,沉淀为创意资源库,从而更好的发挥设计中心横向优势,合力扩大影响力。如QQ空间内部就有Qzone idea的创意小组,定期输出创意想法,讨论,并向上汇报推动产品侧落地。
总的来讲,系统化解决问题<思考-行动>模型可以你“找对事 & 做对事”,“如何做设计的亮点深挖四部曲”具体化做对事的过程,两者相辅相成,合力打造更美好的产品体验。
各公司开发成功产品的方式已经在根本上发生了变化。智能手机、社交网络或云计算等新技术使苹果、谷歌或亚马孙等科技巨头在大约20年内成为最有价值的公司。
这是我的第一篇系列文章“精益创新——如何在今天开发成功的产品”。这是多年来创新的转变和产品开发的方法论。
所有这些变化的发生是由于人们消费产品的方式发生了转变而造成。为了迎合用户行为和对产品期待的变化,科技公司必须将产品方向转变为更灵活、更敏捷、特别是以用户为中心上,即从瀑布流到敏捷设计再到精益设计。
虽然现在仍然有95%的大型组织在用瀑布模型开发新产品,但行业领头公司已经在率先使用精益设计作为方法了。
瀑布模型是序列顺序的处理方法,进程就像瀑布一样稳定地推向目标。它要求项目产出全面的计划并提前开发。
瀑布过程
由于前期设计和分析花费了大量的时间和精力,设计变更会使成本变得更高,尤其是设计后阶段。每个设计节点都有清晰的目标,达成后将进入下一个阶段。这样防止了客户在最后发布前评论和反馈。即使征求了建议,项目在接受反馈方面也不那么灵活。虽然瀑布模型是一种不那么灵活的方法,但它对需要执行“计划”的团队(在预算范围内)更有益。
随着互联网的兴起,瀑布模型漫长的开发周期已经不再能够提前规划人们的需求。同时,随着电子商务的全球化和新经济模式的到来引发了更多的竞争。公司在开发产品的周期中不得不对市场趋势作出反应,因此,需要一个灵活的产品开发步骤。
“敏捷”指的是由17个软件工程师发布于2001年2月的一份宣言,他们必须就轻量开发方法进行讨论。它基于迭代的方法,而不是像瀑布模型一样在项目之初就进行深入的规划。开发团队为了保证首先完成最重要的任务,他们会不断调整项目的工作范围。
每次迭代的目的是为了实现一个可交付的产品。随着来自终端用户的持续反馈得到鼓励,敏捷开发能对不断变化的需求作出反应,因为随着时间推移它们都是被需要的。因此,在管理和减少需求变化的风险方面,这些方法对项目来说是正确的选择。
我们都知道以人为中心的设计,设计思维作为一个概念已经存在一段时间了,只是名称不同(以用户为中心的设计、服务设计)。设计思维因得益于它解决问题的技巧和科学的方法而成为时尚。设计思维过程和方法的普及与2001年的IDEO有关。
“设计思维是一种以人为本的创新方法,它从设计师工具箱里汲取了灵感,将用户的需求、技术的可能性和商业成功的要求结合起来。”
汤姆布朗,IDEO创始人。
“设计师工具箱”是一个与设计师的方法和过程有关的应用——包括思考创造力、灵活的创意以及对用户行为和需求的清晰理解。设计思维是一个由4个基础阶段组成的结构化流程。
从目标群体的发现阶段开始,所确定的需求和问题将被合成一些主要的见解。这些见解是概念阶段的基础,这个阶段的目标是产出许多想法,而最有希望的想法将被作为原型进行开发。原型测试是最后一个阶段,这个阶段需要确保解决方案满足目标群体的需求。
设计思维之所以产生,是因为大公司缺乏创新能力,无法开发出能满足客户需求和客户问题的创新产品。如今,大多数的公司都使用分析思维来作为运营方式。这种分析思维阻碍了创造性(打破常规)思维的发展,而这种创造性思维是破坏性创新所必需的。
这种创造性,特别是大胆的思考(有些称为“疯狂思考”)与设计概念有关。为了创新,企业必须具备设计能力。为了设计,一个组织需要内部融合设计,以孕育出一种培养创造思维的文化。
设计思维的显著差异在于将用户置于每项活动的中心。此外,以人为本的设计强调体验胜于效率,因为良好的体验是用户与产品互动的动力。
2011年,随着Eric Ries《精益创业》这本书的出版,创新和产品开发实践已经向精益方向发展。精益创业的目标是避免开发那些没人需要的产品或服务。精益过程包含用户反馈和产品早期实验。
精益创新以“失败来了成功还会远吗?”的哲学而闻名。开发者接受这种失败,因为他们获得突破性成功前是要需要不断学习的。
精益方法也常被称为“客户开发”。它的目标是在搭建最终产品前,找出用户想要什么。精益的原则是建立你正在试着测试的假设和设想,而你通过在这些实验的学习,将会取得进步。
数字化和巨大的变革速度不再允许公司在不考虑客户需求的情况下简单地生产产品。在过去,向客户提供错误的产品只会导致项目失败。而今天,持续不能交付客户所需的产品,将导致整个商业模式的失败。诺基亚或柯达只是这里提到的两个最著名的失败案例。
智能手机、云计算和开源等技术使得产品的开发速度更快、成本更低。开发产品或进入市场的的门槛比以往任何时候都要低。这意味今天有更多的全球竞争。公司需要专注于了解用户和他们想要什么。客户可以很容易地转向其它产品。品牌忠诚度对消费者决策的影响逐年下降。
精益和设计思维都是以客户为中心、基于迭代的方法。客户参与和反馈是取得进展的动力。精益创新的关键不同之处在于,它在围绕产品考虑整个商业模式时更进一步。
亚马逊成为电子商务的领导者的原因之一是他们对客户服务的坚定承诺。虽然他们没有靠这个挣过一分钱,但是却帮亚马逊获得了客户的信任和忠诚。如今,成功的公司区别于他们的商业模式,而不是他们的产品供应。
在新世界中,成功的公司将有一个共同点:对用户行为和需求的超常理解。随着行为和需求的快速变化,确保建立客户需求的唯一途径就是让用户持续的参与到项目中来。准确的用户理解是长期商业模式成功的基石。
虽然设计思维,精益设计和敏捷开发可以单独使用,但是最好的结果来自这些方法的结合。设计思维有助于深入了解客户的需求和行为,而敏捷开发则有助于地开发和交付解决方案,精益方法的实践帮助我们在用户参与的假设测试中可以获得更直接的验证和学习。
当持续使用“开发–测试–学习”这个模式循环,就可以逐步接近一个成功的产品和有率的商业模式。
如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里
万聚制作 2018-05-15 13:30:00
素材源自网络
这是我们收集UI / UX交互的一周时间,以增强您的用户界面灵感。我们专注于酷炫的动画,布局设计,用户体验思考等等。我们正在从静态,动态甚至是现场原型混合它,这可能是一个伟大的每周系列书签!本周,我们对交互/转换的关注较少。本周我们一直在挖掘一些动画,但我们发现的主要是静态的。我们有各种各样的组合,恰到好处地为您提供创意提升。
如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里
编者按:距热情似火的618国民年中购物节已经不到两个月时间,去年京东商城最终以累计下单金额高达1199亿元(行业口径)的战绩收官。而记者了解到每年借着“京东618”“双11”这两股全民消费热潮的新零售品牌远远不止淘宝与京东两家,已成为了整个产业链方方面面品牌的推广盛宴。
因此,每年的618购物节参与的企业数量可谓“芸芸之众”,这场一年比一年盛大的狂欢节也对支撑其后的运算资源、网络平台、存储与挖掘大数据提出了更高更严苛的要求。针对各家的技术资源体系、技术运维团队、大数据智能技术水平也成为了企业高管的“第一关注”。
而记者采访了多家新零售企业的CIO,提及如何更好地应对即将到来的今年“618”,他们大多表示:“增加服务器及运算资源、优化技术架构提高冗余、完成即时大数据挖掘分析是今年的三大要务。”的确,在保证全民购物节完美的用户操作体验之外,对自身企业在这场没有硝烟的商战中获得的宝贵数据充分分析并加以利用也成为了CIO们所考量的重点,让精准营销落地同时指导未来的市场规划。
如何更好的挖掘大型项目节点中企业获得的巨量数据?如何将挖掘数据中的信息得以简明有效的呈现,最终迅速指导市场策略?记者在618前夕走访了国内新锐的数据智能解决方案企业——袋鼠云。
袋鼠云这家在去年完成6000万人民币A轮融资的数据智能新锐公司,在今年动作频频,完善提升自身数据智能产品线研发的同时,也在今年大量引入高端人才,全面完善数据智能整体品牌价值。
记者在采访中了解到,袋鼠云致力于打造从企业数据资源规划与获取、数据质量分析与提升、数据整体建模与数据资产管理、数字化标签引擎建立、数字指标体系梳理与计算、数据应用规划与实现、数据可视化大屏呈现等全闭环的企业智能数据解决方案。最终以数据为最可靠的技术基础,通过袋鼠云的数据内容策划团队的有效建模,配以令人印象深刻的专业视觉设计,通过可视化大屏将简明有效且具冲击力的数据内容呈现在领导或者客户面前。
袋鼠云这家在去年完成6000万人民币A轮融资的数据智能新锐公司,在今年动作频频,完善提升自身数据智能产品线研发的同时,也在今年大量引入高端人才,全面完善数据智能整体品牌价值。
记者在采访中了解到,袋鼠云致力于打造从企业数据资源规划与获取、数据质量分析与提升、数据整体建模与数据资产管理、数字化标签引擎建立、数字指标体系梳理与计算、数据应用规划与实现、数据可视化大屏呈现等全闭环的企业智能数据解决方案。最终以数据为最可靠的技术基础,通过袋鼠云的数据内容策划团队的有效建模,配以令人印象深刻的专业视觉设计,通过可视化大屏将简明有效且具冲击力的数据内容呈现在领导或者客户面前。
袋鼠云CEO在采访中向记者介绍了典型客户“中国茅台”可视化大屏项目实施情况,他告诉记者:“世界第一白酒品牌“中国茅台”之所以选择袋鼠云建设数据可视化大屏项目,主要是基于要解决全面打造企业数据中台以及将中国茅台品牌能力直观生动地呈现给领导与参观客户。”
“基于此,袋鼠云为他们从数据管理与应用方式方法上改变思路, 有些甚至是全新的角度与理念,目的也是为了让‘中国茅台’的企业数据价值更好的被利用。”他告诉记者:“因为茅台品牌社会面很广,袋鼠云后期基于数据,提供的诸如舆情分析系统、反黄牛数据系统等富有社会成效的定制功能,获得客户的高度认可。”
数据智能(DI)不仅仅是把数据放在一起,而是要聚集产生化学反应。“中国茅台”这个客户应用就很典型,他继续向记者介绍:“我们给客户的数据分析与决策都是动态的,实时监控大屏即时展现茅台酒的交易总额是多少?哪个地区的茅台酒目前是销量最高的?哪些客户最热衷于他们的产品?这些动态的数据分析结果都能实时呈现在展会现场的可视化大屏幕上。另外茅台做的可视化大屏,也直观地体现了茅台用户群体的年轻化趋势,这和我们之前想象中茅台的消费者较高年龄层的情况不一样。这次可视化大屏解决方案帮助茅台更清晰地了解了自己的终端用户,要知道以前客户数据分散在经销商、渠道商那里,到底谁喝了茅台酒,茅台集团是无法获知的。”
而实时采集数据,实时处理分析数据也是袋鼠云口中的“一大门槛”。记者了解到,类似袋鼠云这样的从数据采集--数据存储--数据应用--数据呈现整体打造闭环的数据智能解决方案服务商在行业里具有很大优势。在中国茅台的典型方案中这一点就展露无遗。他向记者介绍:“中国茅台选择过去传统服务商时,手机端与电脑端的开发商是不同的,因此移动端和PC端后台数据没有打通,形成了非即时的数据孤岛。而采用了袋鼠云“全域”智能数据解决方案后,所有的标准制定都是相同的,数据得以深入而全面的加工。而精准营销、反黄牛、打标签、舆情监测、秒杀系统等等富有成效的模型都是基于企业数据的被统一联结并做出实时分析结果。”
记者谈到实时数据可视化这个部分时,袋鼠云CEO显得自信满满。他告诉记者:“数据的实时性采集非常重要,“袋鼠云”实现了TB级别甚至是PB级别的大数据进行实时处理,实现秒级反馈是最基本的要求。”他继续告诉记者:“这得益于袋鼠云的技术团队多数来自于阿里云,针对业务暴增、恶劣环境等极端情况下的峰值保障应急处理的技术与能力具有相当的经验。”记者还了解到,袋鼠云现在的技术团队都曾经历过“天猫双11”等等大型活动,并协助茅台、百草味、秒钱、申通E等多家公司顺利完成了大促护航等工作。
记者观察:一方面基于人才技术优势打造团队“硬气功”,另一方面深化客户项目落地可视化效果的“软实力”,在袋鼠云眼中一个睥睨新业界的发展蓝图已清晰可见。
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务
如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里
前言:css3的出现使得我们可以通过前端技术,让网页内容变得更丰富,更华丽。今天来玩玩好玩的颜色渐变。
一、背景颜色渐变。
运行效果
二、文字颜色渐变。
运行效果
三、边框颜色渐变。
运行效果
蓝蓝设计( www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 、平面设计服务
以下是 JavaScript 错误 Top 10:
为了便于阅读,我们将每个错误描述都缩短了。接下来,让我们深入到每一个错误,来确定什么会导致它,以及如何避免创建它。
1. Uncaught TypeError: Cannot read property
如果你是一个 JavaScript 开发人员,可能你看到这个错误的次数比你敢承认的要多(LOL…)。当你读取一个未定义的对象的属性或调用其方法时,这个错误会在 Chrome 中出现。 您可以很容易的在 Chrome 开发者控制台中进行测试(尝试)。
发生这种情况的原因很多,但常见的一种是在渲染 UI 组件时对于状态的初始化操作不当。
我们来看一个在真实应用程序中发生的例子:我们选择 React,但该情况也同样适用于 Angular、Vue 或任何其他框架。
Javascript代码
class Quiz extends Component {
componentWillMount() {
axios.get('/thedata').then(res => {
this.setState({items: res.data});
});
}
render() {
return (
<ul>
{this.state.items.map(item =>
<li key={item.id}>{item.name}</li>
)}
</ul>
);
}
} 这里有两件重要的事情要实现:
这很容易解决。最简单的方法:在构造函数中用合理的默认值来初始化 state。
Javascript代码
class Quiz extends Component {
// Added this:
constructor(props) {
super(props);
// Assign state itself, and a default value for items
this.state = {
items: []
};
}
componentWillMount() {
axios.get('/thedata').then(res => {
this.setState({items: res.data});
});
}
render() {
return (
<ul>
{this.state.items.map(item =>
<li key={item.id}>{item.name}</li>
)}
</ul>
);
}
}
在你的应用程序中的具体代码可能是不同的,但我们希望我们已经给你足够的线索,以解决或避免在你的应用程序中出现的这个问题。如果还没有,请继续阅读,因为我们将在下面覆盖更多相关错误的示例。
2. TypeError: ‘undefined’ is not an object
这是在 Safari 中读取属性或调用未定义对象上的方法时发生的错误。您可以在 Safari Developer Console 中轻松测 试。这与 1 中提到的 Chrome 的错误基本相同,但 Safari 使用了不同的错误消息提示语。
3.TypeError: null is not an object
这是在 Safari 中读取属性或调用空对象上的方法时发生的错误。 您可以在 Safari Developer Console 中轻松测试。
有趣的是,在 JavaScript 中,null 和 undefined 是不一样的,这就是为什么我们看到两个不同的错误信息。undefined 通常是一个尚未分配的变量,而 null 表示该值为空。 要验证它们不相等,请尝试使用严格的相等运算符 ===:
在现实世界的例子中,这种错误可能发生的一种场景是:如果在加载元素之前尝试在 JavaScript 中使用元素。 因为 DOM API 对于空白的对象引用返回值为 null。
任何执行和处理 DOM 元素的 JS 代码都应该在创建 DOM 元素之后执行。 JS 代码按照 HTML 中的规定从上到下进行解释。 所以,如果 DOM 元素之前有一个标签,脚本标签内的 JS 代码将在浏览器解析 HTML 页面时执行。 如果在加载脚本之前尚未创建 DOM 元素,则会出现此错误。
在这个例子中,我们可以通过添加一个事件监听器来解决这个问题,这个监听器会在页面准备好的时候通知我们。 一旦 addEventListener被触发,init() 方法就可以使用 DOM 元素。
Html代码
<script>
function init() {
var myButton = document.getElementById("myButton");
var myTextfield = document.getElementById("myTextfield");
myButton.onclick = function() {
var userName = myTextfield.value;
}
}
document.addEventListener('readystatechange', function() {
if (document.readyState === "complete") {
init();
}
});
</script>
<form>
<input type="text" id="myTextfield" placeholder="Type your name" />
<input type="button" id="myButton" value="Go" />
</form>
4. (unknown): Script error
当未捕获的 JavaScript 错误(通过window.onerror处理程序引发的错误,而不是捕获在try-catch中)被浏览器的跨域策略限制时,会产生这类的脚本错误。 例如,如果您将您的 JavaScript 代码托管在 CDN 上,则任何未被捕获的错误将被报告为“脚本错误” 而不是包含有用的堆栈信息。这是一种浏览器安全措施,旨在防止跨域传递数据,否则将不允许进行通信。
要获得真正的错误消息,请执行以下操作:
1. 发送 ‘Access-Control-Allow-Origin’ 头部
将 Access-Control-Allow-Origin 标头设置为 * 表示可以从任何域正确访问资源。 如有必要,您可以将域替换为您的域:例如,Access-Control-Allow-Origin:www.example.com。 但是,处理多个域会变得棘手,如果你使用 CDN,可能由此产生更多的缓存问题会让你感觉到这种努力并不值得。 在这里看到更多。
这里有一些关于如何在各种环境中设置这个头文件的例子:
在 JavaScript 文件所在的文件夹中,使用以下内容创建一个 .htaccess 文件:
代码
Header add Access-Control-Allow-Origin "*"
将 add_header 指令添加到提供 JavaScript 文件的位置块中:
代码
location ~ ^/assets/ { add_header Access-Control-Allow-Origin *; }
将以下内容添加到您为 JavaScript 文件提供资源服务的后端:
代码
rspadd Access-Control-Allow-Origin:\ *
在 <script> 中设置 crossorigin="anonymous"
在您的 HTML 代码中,对于您设置了Access-Control-Allow-Origin header 的每个脚本,在 script 标签上设置crossorigin =“anonymous”。在脚本标记中添加 crossorigin 属性之前,请确保验证上述 header 正确发送。 在Firefox 中,如果存在crossorigin属性,但Access-Control-Allow-Origin头不存在,则脚本将不会执行。
5. TypeError: Object doesn’t support property
这是您在调用未定义的方法时发生在 IE 中的错误。 您可以在 IE 开发者控制台中进行测试。
这相当于 Chrome 中的 “TypeError:”undefined“ is not a function” 错误。 是的,对于相同的逻辑错误,不同的浏览器可能具有不同的错误消息。
对于使用 JavaScript 命名空间的 Web 应用程序,这是一个 IE l浏览器的常见的问题。 在这种情况下,99.9% 的原因是 IE 无法将当前名称空间内的方法绑定到 this 关键字。 例如:如果你 JS 中有一个命名空间 Rollbar 以及方法 isAwesome 。 通常,如果您在 Rollbar 命名空间内,则可以使用以下语法调用isAwesome方法:
Javascript代码
this.isAwesome();
Chrome,Firefox 和 Opera 会欣然接受这个语法。 另一方面 IE,不会。 因此,使用 JS 命名空间时最安全的选择是始终以实际名称空间作为前缀。
6. TypeError: ‘undefined’ is not a function
当您调用未定义的函数时,这是 Chrome 中产生的错误。 您可以在 Chrome 开发人员控制台和 Mozilla Firefox 开发人员控制台中进行测试。
随着 JavaScript 编码技术和设计模式在过去几年中变得越来越复杂,回调和关闭中的自引用范围也相应增加,这是这种/那种混淆的相当常见的来源。
考虑这个代码片段:
Javascript代码
function testFunction() {
this.clearLocalStorage();
this.timer = setTimeout(function() {
this.clearBoard(); // what is "this"?
}, 0);
};
执行上面的代码会导致以下错误:“Uncaught TypeError:undefined is not a function”。 你得到上述错误的原因是,当你调用setTimeout()时,实际上是调用window.setTimeout()。 因此,在窗口对象的上下文中定义了一个传递给setTimeout()的匿名函数,该函数没有clearBoard()方法。
一个传统的,旧浏览器兼容的解决方案是简单地将您的 this 保存在一个变量,然后可以由闭包继承。 例如:
Javascript代码
function testFunction () {
this.clearLocalStorage();
var self = this; // save reference to 'this', while it's still this!
this.timer = setTimeout(function(){
self.clearBoard();
}, 0);
};
或者,在较新的浏览器中,可以使用bind()方法传递适当的引用:
Javascript代码
function testFunction () {
this.clearLocalStorage();
this.timer = setTimeout(this.reset.bind(this), 0); // bind to 'this'
};
function testFunction(){
this.clearBoard(); //back in the context of the right 'this'!
};
7. Uncaught RangeError: Maximum call stack
这是 Chrome 在一些情况下会发生的错误。 一个是当你调用一个不终止的递归函数。您可以在 Chrome 开发者控制台中进行测试。
此外,如果您将值传递给超出范围的函数,也可能会发生这种情况。 许多函数只接受其输入值的特定范围的数字。 例如:Number.toExponential(digits) 和 Number.toFixed(digits) 接受 0 到 20 的数字,Number.toPrecision(digits) 接受 1 到 21 的数字。
Javascript代码
var a = new Array(4294967295); //OK
var b = new Array(-1); //range error
var num = 2.555555;
document.writeln(num.toExponential(4)); //OK
document.writeln(num.toExponential(-2)); //range error!
num = 2.9999;
document.writeln(num.toFixed(2)); //OK
document.writeln(num.toFixed(25)); //range error!
num = 2.3456;
document.writeln(num.toPrecision(1)); //OK
document.writeln(num.toPrecision(22)); //range error!
8. TypeError: Cannot read property ‘length’
这是 Chrome 中发生的错误,因为读取未定义变量的长度属性。 您可以在 Chrome 开发者控制台中进行测试。
您通常会在数组中找到定义的长度,但是如果数组未初始化或者变量名称在另一个上下文中隐藏,则可能会遇到此错误。让我们用下面的例子来理解这个错误。
Javascript代码
var testArray = ["Test"];
function testFunction(testArray) {
for (var i = 0; i < testArray.length; i++) {
console.log(testArray[i]);
}
}
testFunction(); 当你用参数声明一个函数时,这些参数变成了函数作用域内的本地参数。这意味着即使你函数外有名为 testArray 的变量,在一个函数中具有相同名字的参数也会被视为本地参数。
您有两种方法可以解决您的问题:
1. 删除函数声明语句中的参数(事实上你想访问那些声明在函数之外的变量,所以你不需要函数的参数):
var testArray = ["Test"];
/* Precondition: defined testArray outside of a function */
function testFunction(/* No params */) {
for (var i = 0; i < testArray.length; i++) {
console.log(testArray[i]);
}
}
testFunction();
2. 用声明的数组调用该函数:
var testArray = ["Test"];
function testFunction(testArray) {
for (var i = 0; i < testArray.length; i++) {
console.log(testArray[i]);
}
}
testFunction(testArray); 9. Uncaught TypeError: Cannot set property
当我们尝试访问一个未定义的变量时,它总是返回 undefined,我们不能获取或设置任何未定义的属性。 在这种情况下,应用程序将抛出 “Uncaught TypeError: Cannot set property”。
如果测试对象不存在,错误将会抛出 “Uncaught TypeErrorUncaught TypeError: Cannot set property”。
10. ReferenceError: event is not defined
当您尝试访问未定义的变量或超出当前范围的变量时,会引发此错误。
如果在使用事件处理系统时遇到此错误,请确保使用传入的事件对象作为参数。像 IE 这样的旧浏览器提供了一个全局变量事件,但并不是所有浏览器都支持。像 jQuery 这样的库试图规范化这种行为。尽管如此,最好使用传入事件处理函数的函数。
function myFunction(event) {
event = event.which || event.keyCode;
if(event.keyCode===13){
alert(event.keyCode);
}
}
结论
我们希望你学到了新的东西,可以避免将来的错误,或者本指南帮助你解决了头痛的问题。
尽管如此,即使有最佳实践,生产中也会出现意想不到的错误。能够查看影响用户的错误,并拥有快速解决问题的好工具,这一点非常重要。
每天打开手机,各式各样的信息纷至沓来,每个 App 每个页面都有好多话要说。当信息汇集在一起的时候,如何能让用户一打开页面就能轻松理解各个信息元素之间的关系与差异呢?这就要靠我们设计师在设计之初构建合理的视觉层次了。一个页面的信息层级是不是清晰明了,很大程度上影响到用户的信息获取效率和使用体验。
在平面和网页设计中,视觉层次一般分为三层:主层(Primary)、副层(Secondary)和三层(Tertiary)。其中主层一般是指头条标题等核心信息,也是要让用户第一眼就注意到的信息。副层可以是小标题等信息,展示出主要内容与提纲。最后的三层一般由正文或其他额外信息构成,展示全部的内容,可以用较小的字号。
△ 图片来自网络
不过当我们在设计移动端页面的时候,因为屏幕尺寸的限制,有时候需要酌情减少页面的层级,这样才能让信息不会过于繁杂。
一般一个页面会根据功能分为多个模块,下面我们就从「模块内」和「模块之间」两个角度来谈谈如何构建合理的视觉层次。
我们所说的「模块」指的是什么呢?可以是一张卡片里面的内容,也可以是一个信息列表等等,总而言之是一个信息组。当我们拿到需求的时候,应该理解每个信息组里面的每条信息的价值,并且给他们分一个类。
比如有时候,PM 同学跑过来说:「我想加个大按钮」,「不想让用户注意到删除功能,但是一定要有」 ,或者「这次就想试一试,展示了这条信息点击率会不会涨」 ,又或是「这条信息展不展示都行,你设计的时候自己看吧……」 好好好,需求我都懂,那么该如何分类呢?
四象限法则相信大家都听说过,那么我们就改编一下这个法则,给每个信息组中的信息按「重要——不重要」「必要——不必要」来分个类吧。
面对又重要又必要的信息还等什么,一定要大要明显,让用户第一眼看到。
重要却不必要的信息,一般是从产品或流程本身来讲不是一定要有的信息,但是因为某种原因想要突显给用户,比如在信用卡的产品列表中加入每张卡的推荐理由,或者在餐厅列表中展示某某名人去过这家店……这些信息在列表中不是必须有的,但是对于引导用户判断又十分的重要,所以我们可以次一级的来展示,要让用户可以注意到,但也不能抢了风头。
哪种信息是必要但不重要的呢?比如一个活动弹窗的关闭按钮,一个订单的删除功能,一条免责声明等等,我们不希望用户注意到他们,但是这些功能又不得不存在,那么就要弱化展示这些信息。
不必要又不重要的信息,一般情况是要去掉的,除非在设计中信息太少了空荡荡的,为了排版美观才会把这种边缘信息留下占位。
接下来,当我们整理好信息层级之后,要靠什么手段来展示这些层级呢?答案是加大对比。
1. 大小
对比的第一步就是大小的对比,在大家的认知中,大的东西比小的东西更显眼、更重要。用户会自然而然地关注到尺寸较大的文本和尺寸较大的图,比如下图中一张足够大的信用卡卡面图片,一秒吸引目光。再比如页面中的大标题,都是这样的效果。
△ 截图来自查查公积金
在内容列表中,标题名字类的信息一般会使用14-17dp左右,补充说明内容一般使用11-12dp左右,具体的使用情况要根据信息的多少、信息的重要程度、上下对比等情况来进行具体的设计。
△ 图片来自融360、微信
2. 重量
有时候由于空间的限制,字号不能再大了?字号大了也没拉开层次?试试增加字重量吧。iOS&Android 由于字体不同,加粗的效果也不同,请酌情增减。
3. 颜色
颜色对于用户的感知有着巨大的影响。所以在进行视觉层次构建的时候,不同的颜色可以轻松构成层次结构,强烈的颜色比如红色、橙色都很容易引人注意。白色和浅灰通常可以用来作为大面积的背景色,和其他的颜色构成对比。在设计的时候可以运用 App 的主色和辅助色来拉开视觉层次。
△ 图片来自查查公积金、融360视觉规范
4. 对比
我们以上图这个贷款列表举一个综合的例子,四条信息从最突出到最弱化分别标为了1、2、3、4,这几条信息中的字号以至少6px的差值进行递减,并且只有前两条信息进行了加粗处理,同时颜色的选择上也是从强到弱:
大小、重量、颜色的运用,归根结底就是制造对比,这也是创建层次结构依靠的核心。一个元素和另外一个元素构成对比,才能有层次的展示他们之间重要程度上的差异,让用户更加容易获取到信息。
当我们已经合理的排布了一个模块内的视觉层次,接下来要做的就是把多个模块组合起来。
心理学家基于格式塔原理来检测用户对于元素之间关系的视觉感知,发现人们倾向于将视觉关系靠近的元素群视作为有关系的一组。值得说明的是,位置接近的元素,即使色彩形状大小都不一致,但只要他们足够靠近,都会被人们视为一组。
△ 图片来自网络
视觉层次的建立很大程度上是基于格式塔原理,所以我们要关注 UI 元素之间的靠近性。
基于这种认知,即使每个模块之中的内容有对比有强弱,但是只要每个信息组之间的元素的距离较近,并与其他信息组之间的距离拉远,留下足够的留白空间,就可以清晰的将整个页面的层次拉开。留白和元素本身之间构成的疏密对比,会更好的让用户注意到留白包围下的内容。
△ 图片来自网络
现在很多 App 都是通过对比与留白来进行页面中的「无形分割」,减少了很多线和块的运用,让页面更为简洁。基本上原则为:文字与图片对齐,与相关内容的间距要小于其他内容,标题要大。
△ 图片来自 Airbnb
当字体足够大的时候,会比小字符更有「图形感」,更加突出,可以更明确的告诉用户从这里开始是下一段了,字号一般在20-24dp之间,根据内容和整体风格来决定,颜色一般选择比较深的颜色 ,必要的时候可以加粗。当其他内容都是比较小的文字的时候,栏目标题也要控制一下大小。如果图片较多,标题就可以再大一些。
具体多大,就要在页面和谐的基础上多试几次……
△ 图片来自查查公积金
如上图,在查查公积金 App 中,当我们设计信用卡详情页的时候,由于整个页面里图形比较突出,看起来用加粗的「办卡礼」、「专享特权」标题更合适一些。可是在同个 App 的公积金详情页里面,整个页面用色都比较清淡,内容都是一些文字信息,如果内容标题加粗的话会显得比较突兀。所以综合整个 App 的页面风格权衡之后,还是选择了左侧没有加粗字体的设计。
总体来讲,UI 设计是没有公式的,只能有经验之谈和大体上的建议,很多时候都要设计师一次次的去尝试、去对比、去感受,才能给出针对当下页面需求最合理的层次构建与解决方案。
本文中,我们会讨论如何通过优化错误提示信息,来优化UI表单的设计。
在UI界面的设计中,用户的操作失误不可避免,通过错误提示将当前状态传达给用户,这种反馈机制可以帮助用户及时作出调整并找到合理的解决方案。尽管错误信息很常见,却往往不被设计师重视。草草的处理错误信息、制作逻辑混乱的错误信息会使用户感到沮丧,以致最终放弃你的应用。相反,处理得当的错误提示,却可以变失败为惊喜。
一、表单中错误信息的设计方案
用户不喜欢表单,原因之一就是纠正输入错误信息的成本过高。如何让用户通过不同的报错信息提醒,绕过障碍顺利完成表单,是让用户体验流畅顺滑的关键所在。
糟糕的错误信息在很大程度上是源自于用户体验设计流程上的规划失误。为什么这么说呢?在原型设计阶段,用户体验设计师就需要考虑到可能会出现的错误,以及相应的错误反馈,确保用户在报错信息的帮助下,最终能够完成这个阶段的任务,抵达他们的目标。
1、在当前页面及时反馈
用户并不喜欢填完一个长表单并提交之后,才发现哪里填错了。在错误出现之后,界面应该在第一时刻将错误信息呈现出来,用户不必等到点击提交按钮才看到错误,他们能更早改正错误。
在上面两个错误信息呈现的案例当中,第一个页面使用了弹出框来呈现错误信息,告知用户需要填写详细信息才能付款。用户则需要关闭弹出框之后,再重新填写,这增加了额外的步骤。而用户关闭弹出框之后再填写的时候,也有一定的机率会忘记弹出框的具体要求和内容,导致无法正确填写。这种耗时又令人沮丧的用户体验,用户不会喜欢的。
正确的形式是直接在界面中呈现报错信息,并且报错信息紧贴着对应的输入框,以醒目的色彩在输入框下方呈现,用户能收到即时的反馈,也能清晰的标注出所有的要求,便于用户更正。
2、错误信息的最佳位置
在制作表单时,你通常会把错误信息放在哪里呢?如果错误信息没有放在用户期望的位置,那么可能会影响完成表单的效果。
当用户犯错时,他们需要了解这些错误是什么,以便他们能够纠正错误并重新提交表单。如果表单过于复杂填写困难,他们会改变主意。
◎顶部错误提示vs行间错误提示
错误消息的两个最常见的位置位于表单的顶部,和输入框的行间。哪个位置对用户来说更直观呢?
一项研究发现,在表单顶部显示所有错误消息会给用户记忆造成较高的认知负荷。这会强制用户回忆每个错误输入框中的错误消息。
减少用户认知负荷的方法是在输入框行间显示错误信息。行间的错误提示可以帮助当场识别错误而不是靠回忆错误,这让用户可以更快更轻松地纠正错误。
另一项研究发现“错误字段和错误信息之间的距离会影响错误纠正的效率”。在表单的顶部和底部放置错误信息时用户反应更正的时间最长,而行间错误信息可以缩短反应时间。
在表单的顶部和底部放置错误信息,也导致用户错误率最高,完成时间最长,满意度。和顶部、行间错误信息相比,底部错误信息的纠错成功率。
◎用户更偏爱的错误信息位置
该研究证明,将错误信息与错误的字段邻近放置可以获得最佳性能,并且指出了最直观的显示位置。
调研中让用户来选择把错误提示放在上图的哪个位置更满意,更多的用户喜欢输入框右边的错误提示位置。
位于输入框左侧的错误信息位置被评为最差。对话框上面的位置导致了最高的认知负荷,随后是字段之下的错误消息。
◎为什么右侧的位置是最好的
理解为什么用户更偏爱将错误消息放置在字段右侧是很重要的。通过这种方式,设计师可以更好地向其他人介绍在制定设计方案时用户的行为偏好。
西方的阅读习惯是从左到右的。当用户的视线从输入框移动到错误消息时,感觉就像一个自然的过程,需要很少的精力和视觉工作。将他们的眼睛从错误消息移回输入框以进行纠正也遵循重新读取文本的自然流程。
◎为什么左侧的位置是最差的
将错误消息放在输入框的左边,违背了西方的阅读习惯。当出现错误提示时,用户的视线朝着与自然阅读流程相反的方向移动。这种方式很不自然,有悖于用户习惯,并且在用户调研中得到了证实。
这样的排布也与我们的直觉相反,因为用户期望在左侧放置有更高优先级的元素。将错误消息放置在左侧意味着它比要输入的字段更重要。但事实上用户需要专注于纠正他们的输入,因此输入框应该是更重要的元素。
◎上侧的位置为什么会增加用户的认知负荷
用户对输入框上面的错误提示有着更高的认知负荷(例如表格顶部对齐的标签)。这是因为用户会把错误提示和输入框中的提示文案混淆。
这两个文本靠得很近会产生视觉噪音,在用户尝试读取错误消息或输入框的提示标签时分散注意力。他们看到两段文案却很难专注于其中一个,并且可能混淆它们。
◎移动设备上表单的最佳错误信息位置
手机屏幕缺少水平空间来并排显示错误消息和标签文案。这意味着把错误信息放在右侧不是移动表单上的最佳位置。
对于移动设备,更好的方式是请将错误信息放置在输入框下方。这是该研究中用户第二最喜欢的位置。虽然它不符合用户自然的从左到右的阅读流程,但它确实与自然的从上到下的阅读流程相对应。
当用户阅读文本时,他们习惯将视线从页面的左侧移动到右侧。错误信息低于输入框,使它遵循垂直阅读过程。
将错误消息放置得太靠近下面的字段标签时,可能会增加用户阅读文本时的认知负荷。你可以通过将它们隔开足够的间隔来防止这种情况。
◎右边还是下边,哪个是最好的位置?
错误消息的最佳位置在输入框的右侧和下方。但是你应该使用哪个位置?这取决于你有多少时间来实现。
如果你用来实现web端和app端的时间有限,可以选择在下方放置错误信息。在web端实现后,方便在app端进行适配。
如果你有足够的开发时间,在web端请选择输入框的右侧,而移动端考虑放在输入框的下面。这样不仅可以提供比较好的用户浏览体验,还能缩短表单的长度。
3、在视觉上要足够突出
如果出错之后,用户无法迅速注意到报错信息,这不仅仅浪费了时间,也耽误了事情。正如 Jakbo Nielsen 所说:“最糟糕的报错信息是那些对用户而言根本看不到的报错信息。”然而,难点也就在这个地方,加粗字体和弹出框对于用户而言过于具有压迫感,那么你要如何确保信息能被用户注意到又不会显得太过呢?不难,使用正确的色彩来辅助显示。
色彩是用户识别信息的重要途径,它也是设计师向用户传递信息的可靠工具。出于对比的目的,在白色的背景下,使用红色的错误提示信息,会足够醒目,又不会太过喧宾夺主。在某些情况下,红色对用户的压力较大,也可以使用黄色或橙色来作为错误提示。在这两种情况下,请确保错误文本清晰可辨,且与其背景的颜色有显着的对比。
值得注意的是,色彩不应该是报错信息呈现的唯一标准。考虑到网页和移动端应用本身的可用性和可访问性,设计师应该考虑到色盲用户的需求,提供色彩以外的视觉提示,例如错误icon等,确保他们也可以看明白。
二、注意错误信息的文案推敲
从某种程度上,你能把上面几条做好,你的报错信息在美学特征和体验上就没有太多问题了。不过,要想设计最佳体验的错误信息,文案的重要性也是显而易见的,需要在言简意赅的同时友好地帮助用户解决问题。
10条可用性启迪(经典的尼尔森十大可用性原则)中建议,要清晰优雅地表达出错误信息。有效的错误提示应该提供如下信息:
明确表达发生了什么
描述用户应该如何应对
尽可能多地保留用户输入的信息
下面是文案设计的几个小技巧。
1、确保错误信息是可理解的
把你的错误信息视为与用户的对话——让它听起来像是为人类编写的。确保你的错误信息是有礼貌,可理解的,而不是错误代码和数据(诸如出现了错误43这样的信息)。
2、清晰明确的指出错误
一些电子邮件的网站会在所有的错误场景使用同一个错误提示,如下图。你不能只是简单的提示用户“输入有效的电子邮件地址”,而应针对用户的问题明确的指出错误所在,例如“缺少@字符”等。而MailChimp则以另一种方式来判断错误——他们对于每个电子邮件的验证包含3个错误信息:检查输入字段是否为空、是否有“@”字符、是否有“.”字符。针对用户输入的错误方式会提供相应的提示文案。
3、提供解决方案
错误信息应该明确定义问题是什么,为什么会发生,以及如何处理。只写出错误是不够的。应该向用户尽可能简单的展示如何尽快解决问题。
例如,Microsoft描述错误并在错误消息中提供解决方案,以便用户可以立即解决此问题。
正如同Jonathan Colman 所说,正确的报错信息通常使用简明而清晰的文字,而失败的报错信息通常不会提供关于错误发生的具体状况以及解决方案,更丑陋的做法是将错误信息完全隐藏起来。
下面的设计,就是很明显的对比:
4. 错误信息应该礼貌
不要责怪你的用户,即使他们做错了。对用户要有礼貌,让他们感到舒适随和。可以使用你的品牌声音,来添加个性化的错误提示。
5. 如果恰当尽可能地幽默
在你的错误信息中小心使用幽默。首先,错误信息应该是提供信息和帮助。如果适合,在错误消息中添加一些幽默,可以改善用户体验。
三、如何有效的预防错误
设计过app的同学,应该很熟悉各种限制条件。例如网络状况差的情况下,很难填写表单,而且几乎没法同步数据。要考虑到这些限制,设计更易使用的app,将错误减到最少。换句话说,应该提供建议、加上限制、保持灵活,第一时间预防用户犯错。
Twitter因推文的字数限制而出名,他们会在用户达到字数上限之前提出警示。
结语
从不出现的错误信息才是最好的。最佳方式是引导用户向正确方向前进,第一时间预防错误发生。但当错误确实发生时,设计精良的错误处理,不仅能教育用户按你预期的方式使用app,还能防止用户感到茫然。在设计错误信息时应遵循以上的方法,好的体验让用户可以以最小的工作量和最少的思考,快速完成表单,让他们可以有时间来完成他们真正想要做的事情。
如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里
Echarts 标签中文本内容太长的时候怎么办 ?
interval
坐标轴刻度标签的显示间隔(在类目轴中有效哦),默认会采用标签不重叠的方式显示标签(也就是默认会将部分文字显示不全)
一开始我没设置 因为标签文本过长的原因他就自动不显示全部
被遮挡住就让grid 组件离容器向上移动 把grid中的bottom的值调大一些
- 1对文本进行倾斜
在xAxis.axisLabe中修改rotate的值
xAxis: {
data: ["衬衫11111","羊毛二二","雪纺衫111","裤子111","高跟鞋11","袜子111"],//x轴中的数据 name:"123",//坐标轴名称。 nameLocation:'end',//坐标轴名称显示位置。 axisLabel : {//坐标轴刻度标签的相关设置。 interval:0, rotate:"45" }
},
可以设置为0强制显示所有标签,如果设置为1,表示隔一个标签显示一个标签,如果为3,表示隔3个标签显示一个标签,以此类推
grid:{//直角坐标系内绘图网格 show:true,//是否显示直角坐标系网格。[ default: false ] left:"20%",//grid 组件离容器左侧的距离。 right:"30px",
borderColor:"#c45455",//网格的边框颜色 bottom:"20%" // },
- 2.换行显示
在xAxis.axisLabel中 使用formatter回调函数实现换行
axisLabel : {//坐标轴刻度标签的相关设置。 formatter : function(params){ var newParamsName = "";// 最终拼接成的字符串 var paramsNameNumber = params.length;// 实际标签的个数 var provideNumber = 4;// 每行能显示的字的个数 var rowNumber = Math.ceil(paramsNameNumber / provideNumber);// 换行的话,需要显示几行,向上取整 /**
* 判断标签的个数是否大于规定的个数, 如果大于,则进行换行处理 如果不大于,即等于或小于,就返回原标签
*/ // 条件等同于rowNumber>1 if (paramsNameNumber > provideNumber) { /** 循环每一行,p表示行 */ for (var p = 0; p < rowNumber; p++) { var tempStr = "";// 表示每一次截取的字符串 var start = p * provideNumber;// 开始截取的位置 var end = start + provideNumber;// 结束截取的位置 // 此处特殊处理最后一行的索引值 if (p == rowNumber - 1) { // 最后一次不换行 tempStr = params.substring(start, paramsNameNumber);
} else { // 每一次拼接字符串并换行 tempStr = params.substring(start, end) + "\n";
}
newParamsName += tempStr;// 最终拼成的字符串 }
} else { // 将旧标签的值赋给新标签 newParamsName = params;
} //将最终的字符串返回 return newParamsName
}
}
同样和换行一个道理,只是这个是单个文字换行
在xAxis.axisLabel中 使用formatter回调函数实现换行
axisLabel: { interval: 0,
formatter:function(value) {
return value.split("").join("\n"); } }
在xAxis.axisLabel中 使用formatter回调函数实现换行
axisLabel : {//坐标轴刻度标签的相关设置。 clickable:true,//并给图表添加单击事件 根据返回值判断点击的是哪里 interval : 0,
formatter : function(params,index){ if (index % 2 != 0) { return '\n\n' + params;
} else { return params;
}
}
}
蓝蓝设计的小编 http://www.lanlanwork.com