首页

如何做好电商类App?来看这份对新版淘宝的设计思考!

资深UI设计者


电商类 App 是日常使用频次非常高的应用,它们的每一次更新改版不仅是业务的拓展、用户需求的满足,同时也是消费趋势的引领与跟随。

近期淘宝 App 的许多页面都有了较大的改动,在分析淘宝改版的基础上,通过几个关键页面的分析对比淘宝、京东、苏宁易购三大综合类电商平台的产品设计,希望此篇文章能让大家对电商类 App 的产品设计有更深的认识。

一、淘宝改版

前阵子淘宝进行了改版,这次改版循序渐进,并做了较多的 A/B 测试。

1. 主要改版页面

上图是淘宝几个主要改版页面。从视觉上看,很明显的大圆角卡片、去线条,整体风格统一轻质化。大圆角卡片追随了 iOS11 的风格(App Store 中尤为突出),卡片使信息更加聚焦,模块感更强;圆角卡片本身也比原先的卡片式增加了更多细节;大圆角卡片亲和力高,更加活泼,也符合淘宝人群的定位。

上图为5个 tab 的页面,这次统一了头部的颜色,强调了品牌,统一性方面也得到了提升。

以下是从单个页面的角度进行改版分析。

2. 个人首页

△ 旧版图为除夕的截图,颜色方面先不讨论

新旧版本的对比,可以看出88会员、卡券包优先级提高,会员信息更加集中、突出。这也印证了这两年会员机制的火热,拉新成本和难度都越来越高的情况下,巩固老用户才能带来更多的价值。

新版的卡片式很突出,去掉了大部分的线条,转而用块面来代替线条表达层级关系。

「我的订单」部分 icon 样式发生了变化(7. 7. 2 版),从填充式转变为线条式,突出了 icon 右上角的数字,但这一点在测试版本中又改回来了(后面讨论)。

88会员和物流这两块内容滚动呈现,真正是动效解决问题,从时间轴来解决信息量大而空间局限的问题,同时动态效果增加了用户吸引度。

在测试版中,这个页面主要看到两个点的变化,一个是 icon 改为原来的填充式,一个是动效滚动的节奏。

icon 的问题个人猜想是因为体量与重要性、位置的问题,线条式的体量弱于填充式。在「我的淘宝」页面中,最重要的信息是「我的订单」,因此需要一定的突出。另外在测试版里,「我的订单」的上面固定的广告位放置了旅行青蛙的广告,此位置的突出性导致其弱化了底下的「我的订单」,占用了原先「我的订单」的 C 位,因此测试版考虑到更全的场景(有广告),从而将 icon 的样式换回了体量大的填充式。

动效滚动是上面说的88会员和物流,7. 7. 2版本里两个滚动是同时进行的,而7. 7. 8的测试版中两个滚动是错开的。上下同时滚动会让人有些混乱,会让人认为这两块的信息是相互关联的。

3. 店铺首页

这一块做的 A/B 测试。店铺页面的改动较大,导航做了较大调整。新版将常用操作和重要功能放到了底部固定;二级导航中的内容让商家自定义选择,从而满足不同店铺的需求;新版一级二级导航较旧版层级关系明确了许多。

再来说说这次的 A/B 测试,这次的测试时间比较长(从7. 7. 2到目前的7. 8. 2都在,目测到8. 0应该会给出一个结果)。店铺页在导航上的大改动,会在一定程度上对已经形成习惯的老用户造成冲击,对页面重新适应和学习,有点类似于前摄抑制(在认知心理学上指之前学习过的材料对保持和回忆以后学习的材料的干扰作用)。新版设计的目的一是方便用户初期快速学习,二是中后期快速使用。对于中后期的快速使用就需要一段时间的铺垫来获得数据。该次测试应该是区分各种不同的用户,简单来说测试新用户、老用户分别对于新旧版本的学习,以及他们对新版本熟悉之后的使用。

4. 物流详情

这一块可以说是样式上的大改。用可视化来表现包裹正处的位置以及即将进行的操作,增强用户感知(降低理解难度),进一步提升对商品信息的把控感。比原先仅仅是文字展示而言生动了许多,样式接近外卖等待中的订单页面。可视化固然可以展示更多的信息,但是在用户非训练的情况下信息传递的速度未必比文字要更快,不同的人对图形的理解也会有所偏差。不过介于外卖 App 的页面已经对很多用户进行了教育,相信这种理解上不会有太大难度。但是依然要在后续优化中逐渐突出信息的重点。

物流详情页除了样式的巨大变化,还有一个特点就是场景化细分,不同的场景做出了差异化。例如仅仅是物流详情页,根据不同的场景:发货未揽件 – 已揽件未配送 – 快递员配送中 – 到达菜鸟驿站/其他快递点 – 已签收等,页面突出的信息均有所区别。已揽件时突出快递信息,配送时突出配送员信息等。

从场景细分做差异化,让用户获取当前最需要的信息这件事的出发点无疑是很好的,但是从上图中,仅是快递信息这一类信息,就出现了三种样式(如上图),并且位置也不统一。如果用户是购买了几件不同店家的商品,这时快递员打电话来说我是XX快递的,快递给你放在了某某地方,这时我想知道这是啥商品的时候,于是我就打开了物流详情,来找快递信息,发现快递信息居然不在原来的地图底下了,找了好一会才发现放到了快递员下方。这个例子也就是说在非常见场景下获取某个信息时可能需要付出额外的学习成本。

不过在7. 7. 8的测试版本中,又将快递信息的样式减为两种,算是一种妥协。本人认为,场景细分出发点是好的,但在样式和位置两点中,最好至少有一点是固定不变的,这样才不会过多增加用户的学习成本,也能涵盖一些小概率场景。

5. 动效

这两张图都是店铺页面顶部的动效,当用户向下滑动页面时,顶部的信息会出现变化,也算是细分场景的一种,通过动效的方式完美过渡,过渡的流畅感会让用户对该平台增加些许好感。

我的淘宝这一页的动效解决问题在上面有说到,右边的有好货页面,当用户在滑动页面时,攻略推荐一栏的图片有依次展现的效果,吸引眼球,小有惊喜。

总结来看,淘宝改版的设计角度可以总结为:设计追随目标,品牌、会员突出,追随设计趋势,细分场景,可视化展现和流畅动效。另外淘宝对设计、测试的态度上来说,设计解决实际问题,设计需要验证,测试要严谨。

二、淘宝与其他竞品

这里只选了京东和苏宁易购两个与淘宝进行了几个关键页面比较,以下主要从视觉的角度谈一下有哪些问题,这里几乎不牵扯业务、页面跳转等问题。

1. 首页

淘宝:整体看起来没有什么硬伤,没有用卡片风格。

京东:这边也是继淘宝改版后不久改版上线。这边首屏的 icon 这一块的卡片式生硬,大有为了卡片而卡片既视感,京东秒杀这块的整齐度不高,也有些左重右轻。「每日逛」这种装饰性较强的风格也与整体卡片式简洁风格不符。「东家小院」楼层次级标题的颜色跳跃,大有喧宾夺主之感。

苏宁易购:目前还没有改版。掌上抢这楼层整齐度不高,和京东类似,同时缺少层次感,部分有渐变部分没有,非常不统一。「逛实惠」楼层视觉不平衡,而且信息层级很有问题。

2. 搜索结果页

风格:淘宝这页用了无框设计,省去了中间的分割线,商品图片尺寸较大;从左到右,图片尺寸越来越小,分割线从无到细到粗,整体效果上淘宝和京东效果比易购的好。

标签:在标签的处理上,易购的标签非常强,在页面上非常突出,喧宾夺主;京东的标签弱化,与淘宝类似,但完全不同类的标签样式相同(秒杀与自营),会让人觉得有些混乱。

图文编排:淘宝和京东都没有硬伤,比较和谐,但易购的图片和文字大小间距比例不和谐,图片与线框无论在视觉效果上还是像素上都没有对齐;易购底部没有适配 iPhone X。

3. 分类页

风格:淘宝用了明显的卡片,去线条;而京东也用了卡片,卡片感微弱,是为了统一性而做;易购仍然是线框区分,整体区分效果不佳。

品牌:淘宝和京东在文字的处理上没有用更多的色彩,而易购的色彩运用得非常多,削弱品牌感,且没有带来任何优势。

4. 商品详情页

此页面我仅从节奏感这一个角度来看,上图已经标出了每个页面的节奏感给我的感受。淘宝整体的节奏感比较好,轻重缓和;京东和易购在节奏感上做的都有些问题,重节奏之间无轻节奏的调和会缺乏呼吸感。

5. 购物车

风格效果:淘宝没有用卡片风格;京东用了卡片,导致大量留白,同时没有带来任何优势,苏宁易购整体稍显拥挤,没有亮点。

图文编排:淘宝整体非常和谐;京东图片均使用了白底,这点很好保持了统一性;京东使用了大量的设计细节,字号、粗细、字体、颜色等等非常丰富,但整体效果并没有很理想,稍显琐碎与凌乱;苏宁易购的文字大小与间距处理不和谐而带来拥挤感。

其他细节:京东标签不同于搜索结果页的弱化,而是非常强化,导致视觉焦点混乱,个别按钮非常小,操作不便;易购标签处理上比京东收敛;易购底部 tab 与其他部分没有区分,浮框像广告,效果不佳,数量修改框的描边太硬,比例不和谐。

6. 个人首页

整体风格:淘宝和京东都是明显的卡片式,苏宁易购是广义上的卡片式。

这里主要说一说易购的问题:首屏出现「我的专场」的大片不平衡色块非常不合适,部分 icon 效果不佳,另外有一些内容上的 bug。

7. 订单

淘宝和京东的订单页个人认为没有什么硬伤,淘宝有个适配的问题。苏宁易购的问题比较多,首先是顶部「常购清单」中没有商品的 bug,然后是图片与购物车等地方的风格不符,商品之间分割线有时有有时无,间距有问题等等。

三、总结

综合上面具体页面的分析可以看出淘宝在 UI 设计上的优势:追随设计趋势、统一性、排版和谐等。

关于统一性这一点,可能有人说京东做的更好,因为它几乎所有页面都用了卡片风,而淘宝没有。个人认为,设计风格是次于设计目标的,如果这种设计风格不能很好满足该页面的设计目标,建议还是以设计目标为重;如果仍然强制使用该风格的话,会得不偿失。淘宝的做法是把卡片这种风格归类为轻质化风格,除了卡片以外,还有去线条、色块等等设计语言,因此并非强调一定要使用卡片形式。

从月薪3000到月薪30000,设计师更该专注什么

博博

从月薪3000到月薪30000,设计师更该专注什么

SODO学堂 2017-09-11 19:17:47

从月薪3000到月薪30000,设计师更该专注什么

又是一篇长文,但有用

花5min读完,你会有收获

我知道很多人看了这个题目可能是冲着“月薪3000到月薪30000”来的,想看看一个人的成功背后的故事。但是今天恐怕要说,一个人的成功有TA自己的机会和运气,而方法论才是更重要的。

让自己成为一个更值钱的人才是要紧事,任何一个职业都一样。

所以,今天就来说说,怎样让自己成为一个“更值钱”的人,以及想要充实自己,你应该抓紧每一个周末甚至平日的时间做点什么。

01

关心收入之前先确保自己有能力

总有人在后台也好,在知乎也好,在各种能私信的地方问我:

“我学的是xx专业,现在在哪里哪里做着一份如何如何的工作,工作了1年多,我怎么才能让自己快速增加更多的收入呢?”

一般说来,本着切合实际的原则,我也会告诉他们:“工作才1年多,最重要的是要先稳定自己的设计水平,持续有高质量的输出,然后积累自己的作品,增加自己的设计能力。然后再关心所谓的赚钱和收入。”

简而言之,先有能力,再谈机会和收入。

从月薪3000到月薪30000,设计师更该专注什么

所以,这么看来,这些人应该优先转化一下自己思考问题的出发点,比如下面这样的问题会更具体、更符合实情:

“我应该报什么样培训班,应该快速获得什么样的专业能力,才能在工作中有赚更多钱的可能?”

“工资1w+的设计师,做出来的东西是什么样?我怎么才能尽快做出同样的设计?”

但其实,这样的问题我也并没有一个一概而论的答案,不同公司的规模不同,大平台和小公司所需要的能力、技能、水平都不同。

举个例子,一般大公司的设计师职位划分可能是非常细致的,每个人就干小范围那一类活儿;小公司就比较杂了,可能设计稿你要做、市场沟通你要做,还要懂一些运营知识等等。

像是1w+这种以薪酬来论能力的情况并没有统一标准的答案,和公司、行业、环境、城市、专业、竞争力等等很多因素都有关系。

这里给大家一个建议,如果你想知道一定收入的设计师达到什么样的水平。可以去招聘搜索网站按照薪资去排查搜索,会出来一批公司的list;然后再相应去找每一家你感兴趣的公司的官网或者电商网站(某宝之类)看具体出来的是什么感觉的设计,这是最简单也直观的方法

所以,下次问类似问题的同学,应该知道怎么办了。

02

不要为了多那一点收入而耗光自己的精力

我发现有很多同学都很迷茫一个事儿。大家似乎都想快点赚到更多收入:“作为设计师是不是可以利用私人或周末时间接点私单?这样还能认识更多的人,有额外收入,还能积累到更丰富的设计经验?”

有这种想法的人应该挺多的,毕竟设计师1-3年内都很少能让自己攒下什么钱,社会加注给每个人的经济压力都很大,也无可厚非。

但是,我个人的看法是,如果你想要“吃更大的蛋糕、做更大的事情”,那么不要为了多那一点点收入,而在这个阶段因为接私单而耗费掉自己太多的额外精力。

从月薪3000到月薪30000,设计师更该专注什么

为什么这么说?

一般有这种想法的人,基本上都处在设计水平中等偏下的位置,也有一点设计项目的经验了,也有那么些稿子了,但是每一个项目做的不算出彩。知识不够扎实、资源不够丰富、人脉半上不下,又一心想要赚多点钱,所以才想着跑去接私单。一般,还只能接廉价的私单。

但是基本上都会面临被私单逼疯的境地,具体表现为:

1. 因为廉价私单单主逼格不高,所以瞎指挥的情况较多,改稿无数是常态

2. 改稿会经过反复沟通协调,又耗费掉大量时间,沟通不善的情况也较多

3. 廉价私单越多,品味会越来越差,陷入丧失信心还没时间充电的焦虑中

总之,如果你想保持个人精进,最好还是抽出时间来充电和充实自己,不要想着眼皮子底下那一点点收入。心态的差异与专注执行在哪儿,是造成月薪3000→4000还是月薪3000→30000的本质原因。

03

让自己更专注在这些事情上

既然坚持走在设计的道路上,那么真正保持让自己有核心竞争力、让自己可以持续创造更多财富的做法,大家可以参考并尝试以下几个方面:

观察优秀人群,学习并模仿

如果你和我们一样不是天生自带尚方宝剑含着金汤匙出生的人,就不要在起跑线上幻想自己可以很快靠做图成为“设计界的马云”。最好还是踏踏实实稳中求进,这样比较不会带来那么多消极情绪。

正常说来,在一个人的社交圈中,周围总有人的水准是高于自己,也有低于自己的。而你要关注的就是设计水平和能力高于自己的人,用心观察和留心他们的习惯,感受自己究竟还有哪里可以进步,学到这些人的长处并且活用。

不要光是说想学习然后只是放嘴炮,要踏实地付出行动。一般说来,值得被学习的方面有:

执行力强多于嘴炮

期待并拥抱改变

自我驱动力做事

积极乐观热爱光做

关注设计行业信息

说到这个,又想起来周末有个同学私信我问什么是“时尚管理”,是不是从国外学习这个专业毕业之后就能进品大公司,在品牌强大的背书下挥斥方遒。

我记得我跟她说:“有人觉得自己在圣马丁服装设计专业一毕业就能成为约翰·加利亚诺,怎么会如此天真?

后来我真诚地建议她“多去看一些行业信息,比如BOF,这样你至少能对这一行究竟是哪一行、做什么事儿、市场行情啥样有最基本的了解和判断。”

不知道不可怕,可怕的是单纯地活在自己幻想的世界里不肯去了解真相。

选择一个方向,坚持越久越幸运

很多同学觉得学设计也不一定非得只做高级设计师,听说学设计还有很多其他的出路,比如做设计培训行业的老师、注册账号做设计类自媒体、自己设计自创品牌、做freelancer到处走穴等等等等。也不知道到底哪个算是真正滴适合自己,于是每一个为期半年,都试一试,不成功就换下一个。

不过试的越多越发现,似乎都没成功,哪个试到一半都觉得就那样,总是会有各种各样的问题和自己最理想中的状态有区别。

在这个跳槽说跳就跳的年代,脚踏实地去慢慢积累的人正在越来越少。

但没有100%理想状态的工作的,培训参差不齐容易入坑、自媒体竞争惨烈千篇一律、自创品牌需要人脉财力持续支持、自由职业者要面对强大的自控力和专注力考验……不论选哪个都会有自己赚钱的方式也会遇到自己的问题

你需要做的,只是选定一个方向。愿意多点点耐心在一个方向上积累和沉淀自己,别把精力分得太散,先做好手头上的事儿再说。

知道自己哪里最强、哪里

设计师应该都听说过要保持自己的核心竞争力,要让自己的活儿做得原来越精良,越来越好。但是只有这一点我觉得还不够,你应该在明确自己的核心竞争力之外,还知道自己的的差异化竞争力在哪儿。

比如,同样是UI设计师,你的UI界面做得好是你的核心竞争力,此外,你有产品设计学习基础同时又超级会做总结,写文案你也不在话下,那么,你的差异化竞争力就包括了“ID设计基础、会做总结、会写文案”3项加分点。

当你明白了这一点,你也知道原来做好设计本身之外还有好多可以精进可以学。

总之,多去想想该如何提升自己的设计能力,保持的优势,同时尽可能深耕下去走得久一点,做到这些,你的收入自然如水到渠成般地增值翻翻。

UI设计方向大抉择:是游戏UI还是应用UI?

蓝蓝设计的小编

学习UI设计培训的人很多,但是方向基本都是应用UI和游戏UI。下面我们分别来谈谈两者的区别

由‘==’和‘===’引出的js的隐式转换问题

周周

‘==’和‘===’都是Javascript中的比较运算符,都是比较运算符两边是否相等。对于‘==’和‘===’的区别,大家也都知道:

  ‘==’仅仅是比较运算符两边的数值是否相等,如果数值相等则返回true;‘===’不仅会判断运算符两边的数值是否相等,并且还会判断两边的类型是否相等,只有数值和类型都相等才会返回true。虽然知道以上的判断依据已经能解决绝大数此类问题,但是如果往其中深究来说,会有同学问:在比较的时候‘===’先判断类型,如果类型不同就直接返回false,这个没什么问题。但是如果是‘==’比较两个不同类型的数据时,具体是怎么进行计算判断的呢?

 既然是不同类型进行比较,肯定最终参与比较的结果必须是同一个类型的,因此JS会存在一个隐式转换的问题,并且很多JS的隐式转换很难通过console.log()等方法直观的观察到,因此很多初学者会对JS的隐式转换感到疑惑。

 首先让我们回忆一下,咱们的JS中一共有哪些数据类型?

       六大数据类型
       基本数据类型(简单数据类型)
       number 数值型(NaN)
       string 字符串
       boolean 布尔型
       undefined 未定义
       null 空引用
       引用数据类型(复杂数据类型)
       object

       JS基础中,我们学习到咱们的JS中一共有六种数据类型,分为基本数据类型(简单数据类型)和引用数据类型(复杂数据类型),不同类型的值进行比较的时候,存在隐式转换的问题,咱们通过‘==’来验证一下JS隐式转换的情况。

       1.我们首先来看看下列的语句计算结果:

console.log(NaN==true);//false
console.log(NaN==false);//false
console.log(NaN==0);//false
console.log(NaN==1);//false
console.log(NaN==NaN);//false

       由上面的例子可以看出,NaN属于Number数据类型中一个特殊情况,如果‘==’两边同为Number数据类型的数字,很直观的可以看出值是否相同一眼就可以看出结果,但是作为Number类型的特殊情况,NaN在进行比较的时候,也会有特殊的结果:如果 x 或 y 中有一个为 NaN,则返回 false;

       2.我们继续看看下列的语句计算结果:

console.log(null == undefined); //true(特殊情况)---------------------------------
console.log(null == ''); //false
console.log(undefined == ''); //false

      在上述例子中,引出了一个null,null是一个简单数据类型,它的意义就是一个空应用,但是你如果通过console.log(typeof null) 来打印结果的时候却发现,结果竟然是object?此时你可能会怀疑人生,然后疯狂的翻阅之前学习的资料,因为object明明是一个复杂数据类型,怎么会在判断null这个简单数据类型的类型时打印出来呢?其实,这个问题属于一个历史问题。咱们学习的JS在发展过程中是通过ECMAScript来确定规范的,每年都会有新的规定和规范提出,在JS的发展过程中,null一开始的作用就是用来指向一个空地址,让开发者在创建数据的时候,先用null赋值给还未给值的对象用于标准初始化。但是其实咱们开发过程中很少用到,但是这个仍作为规范留了下来。又因为typeof是根据数据的前几位判断数据类型的,null相当于空指针,前几位是地址的格式,所以判断结果就为object。又因为undefined值是派生自null值的,因此ECMA-262规定对他们的相等测试要返回true。所以这一情况判断的条件为:如果 x 与 y 皆为 null 或 undefined 中的一种类型,则返回 true(null == undefined // true);否则返回 false(null == 0 // false);

       3.请看下列例子:

console.log(true == '123'); //false
console.log(true == '1'); //true
console.log(false == '0'); //true
 
console.log(true == !0); //true
 
console.log([] == []); //false
console.log([] == ![]); //true 比较地址 ------------------------------------------------
var a = c = [];
var b = [];
console.log(a == b); //false
console.log(a == !b); //true
console.log(a == c); //true
 
console.log(Boolean([]) == true); //true
console.log(Number([]) == 0); //true
console.log(Number(false) == 0); //true

       其实比较的逻辑为:如果 x,y 类型不一致,且 x,y 为 String、Number、Boolean 中的某一类型,则将 x,y 使用 Number 函数转化为 Number 类型再进行比较;

      使用Number函数可以将其他的数据类型转变为Number类型,这一同为Number类型的数据,对比起来就会变得十分简单。值得注意的是在上述的例子中,两个空数组进行比较,结果返回的结果仍然为false,这个是怎么回事呢?其实这个很好理解,因为数组也是对象的一种,是复杂数据类型,所以用变量储存对象时储存的其实是地址。对象的内容相同,但是储存在堆区的位置不同,所以地址也是不同的,所以在判断的时候返回的是false。

      其实在JS中还有很多的隐式转换情况,以上只是针对于‘==’的隐式转换情况,对于这些问题,在实际开发过程中,需要作为开发者不断的学习和积累,这也是咱们作为开发者的一个要求之一。

遵循这7个原则,能让你的网页用户体验更优秀

资深UI设计者

作为用户,在很多时候会很容易判断出一个网站的用户体验是否优秀,因为主观感受是很难被欺骗的。但是作为网站的设计者和开发者,角色转换之后,所需要面对问题就复杂得多。身为构建者,要让体验尽善尽美需要花费大量的时间精力来完善整个体验的闭环。今天为你所整理的这7个 UX设计的原则,能够帮你更好地进行网站的 UX设计,并且尽可能地将整体的用户体验提升到一定高度。

1. 围绕用户体验来进行整体设计

想要创造难忘的用户体验,自然要围绕着用户体验本身来进行设计。甚至在某种意义上来说,数据和内容也应该是服务于体验的, 它们应该以什么样的体验来呈现出来,这是设计者需要反复思考和琢磨的问题。

图形、布局、文本和交互元素之间的协同工作才能创造体验,任何一个维度缺一不可,单纯的信息展示是不够的。

想让你的网页能在互联网上大量的信息中脱颖而出,体验是至关重要的。现代网页中大量的视觉和交互内容存在,是为了能通过体验直击人心,这样才能在激烈的竞争中存活。

2. 网站内容应当一目了然

如果你认为网站内容是用来读的,那就错了。现代用户的注意力集中的时间非常短,绝大多数用户在浏览信息的时候,都是快速扫视,而非逐字逐句地仔细阅读,信息的展现一定要直观、清晰,确保能够一瞥就能看明白。借助信息图表和视觉,更快地传达信息和数据。

你需要让你的内容更加吸引用户,绝大多数用户会为触动它们的信息和内容而驻足,当他们想要了解更多的时候,才会点击,了解更多。

3. 用户想要简单而清晰的内容

用户只需要半秒就能判断出网站设计和内容,你需要尽量让网站的交互和指引足够清晰,显而易见。不要让按钮难以被用户发现,在首页上放上一大堆的按钮和链接,不如通过视觉上的引导,让用户注意到最关键的那个 CTA按钮。

通过迭代和测试,不断地优化和提升网站的易用性。有的设计对于绝大多数的用户都非常有用,凸显最重要的选项,允许隐藏额外的功能,并且为用户提供显示全部的选项。

除了清晰的设计,整体的一致性也很重要。统一的配色、交互和图形能够让用户对于后续的操作有更清晰的预期,减少用户在后续操作过程中探索的力度,这是通过统一性设计提升产品易用性的一种方式。

4. 通用设计元素 vs 创造性

当某个设计元素在其他地方很常见的时候,它就已经形成了特定的 UI 模式,尽量不要去修改它,哪怕是很富有创意的方式。当你将这种约定俗成的元素修改成其他样子的时候,用户需要花费比平时更长的时间来判断它究竟是什么。这种认知负荷将会影响整个网站的使用效率和转化率。比如汉堡图标,比如网站登录入口的位置(右上角)。没有必要在这种地方重新「标准化」。

对于链接、导航、布局这样基本的元素,应该始终优先考虑其可用性,在此基础上再发挥创意。

虽然非传统的设计很酷,但是它的可用性问题同样很大。创造性的设计同样是需要控制其程度和平衡,如果非要打破常规,尽量控制好程度,并且一次最多打破一条规则,不能更多。

5. 了解你的用户

在开始创建网站和 APP 之前,你应该对于你的目标客户群体有足够清晰的了解,这样才能更好地为他们来设计界面。

一旦你清楚地了解了你的用户,就能了解他们的需求和愿望,并且设计出符合他们预期的界面和体验。这个时候,你的竞争对手能够为你提供灵感和想法。注意对方的色彩,布局,风格和功能。

尽可能使用你的受众已经熟悉的 UI 模式和 UI 元素,能够更快让他们上手。在此基础上,适当地进行差异化的设计,这样效率更高。

当你确定了受众之后,记得尽量把他们的反馈纳入到你的设计当中。

6. 视觉层次很重要

当界面中优先放置最重要的元素,通过视觉层次来凸显它们,确保用户能够更快注意到它们。在设计中,有很多方法能够凸显内容,但是最有效的方法始终是让它们更大更醒目。

视觉层次的构建能够让网站内容更加清晰,也更加富有功能性。

7. 控制用户体验的质量

Peter Moville 在 usability.gov 这个网站上列举出了用户体验设计的关键因素,它的核心价值在于通过不同的维度更好地掌控用户体验的质量:

  • 有用:内容应该是原创的且满足需求。
  • 可用:网站的内容应该很容易被找到。
  • 可取:设计元素应该贴合情感且具备可欣赏性。
  • 可发现:内容容易被定位,被找到,并且可导航。
  • 无障碍:设计要为有障碍的用户进行定制。
  • 可信:网站内容应该有权威性,且值得被相信。

除了上面的维度之外,还有一些值得参考的 UX设计的质量衡量标准:

  • 符合上下文:有明确的路径,符合上下文逻辑。
  • 人性化:值得信赖,平易近人,透明,并不机械。
  • 可发现性:用户在第一次访问的时候就能够顺畅的完成任务。
  • 可学习性:确保交互足够简单,并且能够无缝地相应移动端界面,确保用户在随后的访问过程中达成目标。
  • :确保用户能够快速轻松地完成各种任务。
  • 令人愉悦:确保产品能够满足用户需求,还能够和用户产生情感联系。
  • 表现良好:当用户与之交互的时候表现良好。

结语

用户体验设计的目标不仅仅是让产品本身更优秀,更重要的是从情感层面上和用户产生关联。有界面而没有体验,这样的产品在今天的竞争中是活不下去的。

筛选功能设计总结

资深UI设计者

从用户的操作流程上来说,如果用户想使用一个功能,必然首先要发现它。如果连功能入口都找不到,后续的用户体验也无从谈起。而筛选功能可以帮助用户对功能信息进行快速的定位,缩短用户的查找时间,这篇文章我就来跟大家聊一下筛选功能。


 三种常见基本样式


首先要明确一个概念,筛选功能并不是普通的单一功能项,它和导航一样是一个体系。既然是体系,必然有最基本的组成部分。筛选功能(体系)常见的样式有以下三种:tab类,(下拉)列表类,标签类。这三种样式是筛选功能最基本的组成元素,不管你产品的筛选功能做的有多么复杂,都可以看成是这三种基本元素的不同组合形式。


Tab


Tab是最常见的筛选样式,一个tab项代表一个筛选维度,直接平铺的展示出来,用户很容易感知到。

Image title


根据方向我们可以将tab分为横向栏tab侧向栏tab。横向栏tab可展示2-5个选项,如果超过了5个,那么就需要用户滑动才能看到。所以当筛选维度过多的时候,我们可以考虑使用侧向栏tab,京东商品分类这里用的就是典型的侧向栏tab,我数了一下总共40个选项,这里如果使用横向栏tab用户可能要侧向滑动8屏,操作成本过高。

Image title


当然当选项过多的时候,我们还有一个法子,就是使用弹框,用户点击后可以看到全部的选项。

Image title



列表式


列表式也可称之为list,其特点就是占用空间小。因为它可以将选项隐藏起来,用户需要点击才能看到所有的选项,因此在有限的空间里可以展示更多的筛选维度。碍于手机屏幕尺寸的限制,列表式筛选现在应用的越来越普遍。

Image title

列表式筛选的样式其实有很多。可以做成popover类,actionsheet类,activityview类。这些样式很难去说谁好谁坏,这里我就只是列举出来,具体用哪种样式,大家自己来判断。


标签式


对于标签式,很难进行准确的定义,我更倾向于将单选按钮,多选按钮,switch等统称为标签式,标签式只能针对单一条件进行筛选,这点和tab很类似。标签式很少单独出现,多数情况下都是与tab和列表式结伴而行。

Image title


在淘宝里用户可以点击视图icon来切换视图模式,这就是典型的标签式筛选。

 

当然以上三种只是最常见的筛选元素,其余的还有输入框,滑块,地区/日期选择器等主要用于信息录入的组件。 


常见的筛选体系 


了解了最基本的元素,接下来看一些比较复杂的筛选样式。上面我也提到了任何产品的筛选体系都可以看成是这三种基本元素的不同组合形式。为了让大家更好的理解,我一一举例来说明:


tab+tab:


tab之所以受到青睐,是因为其较低的学习成本。每一个tab代表一个类别,而且是直接展示给用户看的,所以很多产品的筛选功能都会优先考虑使用tab。即使功能结构复杂到无法用一层tab来完成筛选任务,设计师也会考虑使用双层tab样式(tab+tab)的样式。(PS.当然下图应该算是segment control+tab)

Image title



tab+列表式:


当产品不断的发展,功能结构愈发的复杂,过于扁平的tab已经无法满足筛选的需求。以看电影这个场景为例,用户的需求是找到合适的影片和电影院。对于用户来说,衡量一家电影院会从地址、票价、品牌和特色服务(支持改签、IMAX厅等)这四个角度入手。这些筛选需求很难通过tab来完成,我们需要列表式的协助。

Image title



tab+列表式+标签:


当产品的功能结构进一步复杂,这也给筛选功能增加了新的难题。以boss直聘来说,这里的筛选项主要分为四个:排序方式(推荐/)、工作地点、公司规模、岗位要求。其中后三个筛选项包含大量的条件,特别工作地点,需要进一步定位到街道或地铁站。对于这种多维度,深层级的筛选需求我们可以使用tab+列表式+标签的样式。

Image title


这里我选择boss直聘的另一个原因在于它的tab数用户是可以自己增减的,每一个tab代表一条求职意向,最多可以添加3条求职意向。

Image title



筛选体系的容器


筛选体系是由众多筛选项组成的,这些筛选项需要一个“容器”来承载。上面说的boss直聘用的是下拉列表,这种样式其实还比较简单的,我们可以看一些功能更加复杂一点的产品,比如各大电商平台。这里使用的是抽屉式筛选框,说它是抽屉式,因为它跟抽屉一样,用的时候可以拉出来,不用的时候可以关起来,节省了空间。从某个角度来说,我们可以把抽屉式看成列表式的一个放大版。抽屉式筛选框可以容纳更多的筛选条件,像我在上面提到的输入框,多选按钮都可以在这里使用。

Image title


从底部弹出的动作栏也比较常见,这里使用了滑块和单选按钮。

Image title


Airbnb的筛选功能以浮层为载体,还使用比较少见的switch和stepper。

Image title


当然Airbnb筛选功能最大的亮点在于可以向用户即时反馈筛选结果的数目,用户不太可能会进入搜索结果为0的空页面,避免无效操作。


以上说的筛选体系都比较传统,大部分都是基于对现有结果进行筛选,其实我们可以对筛选功能进行前置。例如,我们可以在用户进行搜索之前就对结果进行筛选。

Image title


甚至在新用户第一次使用产品的时候,可以让用户填写一些个人信息以便进行个性化推送。

Image title


筛选功能的存在意义在于帮助用户对功能信息进行快速的定位,对筛选功能进行适度的前置可以简化用户的操作流程,同样可以达到节省用户时间的目的。

【UI设计】透明UI界面设计

蓝蓝设计的小编

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

在这里向跟着大神学CAD 致敬,咿CAD,好吧也算设计,设计的包容性很高啊

【UI设计】透明UI界面设计

【UI设计】透明UI界面设计

【UI设计】透明UI界面设计

【UI设计】透明UI界面设计

【UI设计】透明UI界面设计

【UI设计】透明UI界面设计

【UI设计】透明UI界面设计

【UI设计】透明UI界面设计

【UI设计】透明UI界面设计

【UI设计】透明UI界面设计

【UI设计】透明UI界面设计

【UI设计】透明UI界面设计

【UI设计】透明UI界面设计

【UI设计】透明UI界面设计

【UI设计】透明UI界面设计

【UI设计】透明UI界面设计

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务


根据json文件生成动态菜单

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

[plain] view plain copy
  1. <span style="font-family:SimSun;font-size:16px;">admin.json</span>  
[plain] view plain copy
  1. <span style="font-family:SimSun;font-size:16px;">[  
  2.     {  
  3.         "image": "glyphicon glyphicon-home",//菜单前的图标  
  4.         "name": "设备管理",  
  5.         "submenu": [  
  6.             {  
  7.                 "image": "glyphicon glyphicon-cloud",  
  8.                 "name": "设备分类",  
  9.                 "submenu": [  
  10.                     {  
  11.                         "image": "glyphicon glyphicon-off",  
  12.                         "name": "电源管理",  
  13.                         "url": "html/Node/creditCardPower.html"  
  14.                     },  
  15.                     {  
  16.                             "image": "glyphicon glyphicon-lock",  
  17.                         "name": "门禁管理",  
  18.                         "url": "html/Guard/guardList.html"  
  19.                     },  
  20.                     {  
  21.                         "image": "glyphicon glyphicon-folder-open",  
  22.                         "name": "物品管理",  
  23.                         "url": "html/goods/goodsList.html"  
  24.                     },  
  25.                     {  
  26.                         "image": "glyphicon glyphicon-facetime-video",  
  27.                         "name": "视频管理",  
  28.                         "url": "html/monitor/monitorList.html"  
  29.                     }  
  30.                 ]  
  31.             }  
  32.         ]  
  33.     },  
  34.     {  
  35.         "image": "glyphicon glyphicon-cog",  
  36.         "name": "系统设置",  
  37.         "submenu": [  
  38.             {  
  39.                 "image": "glyphicon glyphicon-heart",  
  40.                 "name": "用户管理",  
  41.                 "submenu": [  
  42.                     {  
  43.                         "image": "glyphicon glyphicon-align-justify",  
  44.                         "name": "用户列表",  
  45.                         "url": "html/User/userList.html"  
  46.                     },  
  47.                     {  
  48.                         "image": "glyphicon glyphicon-random",  
  49.                         "name": "组织机构",  
  50.                         "url": "html/dept/framework.html"  
  51.                     }  
  52.                 ]  
  53.             },  
  54.             {  
  55.                 "image": "glyphicon glyphicon-wrench",  
  56.                 "name": "设备管理",  
  57.                 "submenu": [  
  58.                     {  
  59.                         "image": "glyphicon glyphicon-edit",  
  60.                         "name": "设备参数",  
  61.                         "url": "html/Device/DeviceList.html"  
  62.                     },  
  63.                     {  
  64.                         "image": "glyphicon glyphicon-edit",  
  65.                         "name": "物品库",  
  66.                         "url": "html/equgoods/equGoodsList.html"  
  67.                     }  
  68.                 ]  
  69.             }  
  70.         ]  
  71.     },  
  72.     {  
  73.         "image": "glyphicon glyphicon-list",  
  74.         "name": "日志管理",  
  75.         "submenu": [  
  76.             {  
  77.                 "image": "glyphicon glyphicon-list-alt",  
  78.                 "name": "登入日志",  
  79.                 "url": "html/Log/loginlog.html"  
  80.             },  
  81.             {  
  82.                 "image": "glyphicon glyphicon-tag",  
  83.                 "name": "设备日志",  
  84.                 "url": "html/Log/hardwarelog.html"  
  85.             }  
  86.         ]  
  87.     },  
  88.     {  
  89.         "image":"glyphicon glyphicon-list",  
  90.         "name":"设备管理",  
  91.         "submenu":[  
  92.             {  
  93.             "image":"glyphicon glyphicon-list-alt",  
  94.             "name":"设备管理",  
  95.             "url":"html/mechanism/mechanism.html"  
  96.             }  
  97.         ]  
  98.     }  
  99. ]</span>  

2、读取json文件的service层实现

[java] view plain copy
  1. <span style="font-size:16px;">package com.dskj.service.impl;  
  2.   
  3. import java.io.File;  
  4. import java.util.Scanner;  
  5. import org.springframework.beans.factory.annotation.Value;  
  6. import org.springframework.core.io.Resource;  
  7. import org.springframework.stereotype.Service;  
  8.   
  9. import com.dskj.common.util.StringUtil;  
  10. import com.dskj.service.ReadJsonService;  
  11.   
  12. @Service  
  13. public class ReadJsonServiceImpl implements ReadJsonService{  
  14.     <span style="color:#ff0000;">@Value(value="classpath:json/admin.json")</span>  
  15.     private Resource dataAdmin;      
  16.     <span style="color:#ff0000;">@Value(value="classpath:json/user.json")</span>  
  17.     private Resource dataUser;    
  18.       
  19.     public String getData(String fileName){       
  20.         if(StringUtil.isEmpty(fileName)){  
  21.             throw new NullPointerException();  
  22.         }  
  23.           
  24.         String jsonData = null;  
  25.           
  26.         try {  
  27.             File file = null;     if(fileName.equals("admin.json")){  
  28.                 file = dataAdmin.getFile();  
  29.             }else{  
  30.                 file = dataUser.getFile();  
  31.             }  
  32.               
  33.             jsonData = this.jsonRead(file);  
  34.               
  35.         } catch (Exception e) {  
  36.            e.printStackTrace();  
  37.         }    
  38.         return jsonData;         
  39.     }  
  40.     /** 
  41.      * 读取文件类容为字符串 
  42.      * @param file 
  43.      * @return 
  44.      */  
  45.       private String jsonRead(File file){  
  46.             Scanner scanner = null;  
  47.             StringBuilder buffer = new StringBuilder();  
  48.             try {  
  49.                 scanner = new Scanner(file, "utf-8");  
  50.                 while (scanner.hasNextLine()) {  
  51.                     buffer.append(scanner.nextLine());  
  52.                 }  
  53.             } catch (Exception e) {  
  54.                   
  55.             } finally {  
  56.                 if (scanner != null) {  
  57.                     scanner.close();  
  58.                 }  
  59.             }  
  60.             return buffer.toString();  
  61.         }  
  62. }</span>  

3、controller对应的代码片段

[java] view plain copy
  1. <span style="font-size:16px;">@RequestMapping("")  
  2.     public ModelAndView main() {  
  3.         ModelAndView model = null;  
  4.         String jsonFileName = null;  
  5.           
  6.         SysUser currentUser = (SysUser) ContextUtil.getSession().getAttribute("currentUser");  
  7.         if ("admin".equals(currentUser.getUsername())) {  
  8.             model = new ModelAndView("header1");  
  9.             jsonFileName = "<span style="color:#ff0000;">admin.json</span>";//根据文件名判断读取具体json文件  
  10.         } else {  
  11.             model = new ModelAndView("headerUser");  
  12.             jsonFileName = "<span style="color:#ff0000;">user.json</span>";</span>/<span style="font-size:16px;">/根据文件名判断读取具体json文件  
  13.   
  14.         }  
  15.           
  16.         String menue = <span style="color:#3333ff;">readJsonServiceImpl.getData</span>(jsonFileName);  
  17.           
  18.         model.addObject("menue", menue);  
  19.         return model;  
  20.   
  21.     }</span>  

4、html页面 将jsonarray转换成js对象

[javascript] view plain copy
  1. <span style="font-size:16px;">$(function() {  
  2.     var menue = JSON.parse('<span style="color:#ff0000;"><%=request.getAttribute("menue")%></span>');  
  3.     console.info(menue);  
  4.     createMenu(menue);//调用下边的方法生成动态菜单</span>  

5、对js对象遍历 $.append动态添加到对应页面

[javascript] view plain copy
  1. <span style="font-size:16px;">function createMenu(menue){  
  2.             /* 一级菜单 */  
  3.             $.each(menue,function(i,v){  
  4.                 var menu1 = '<li class="active"><a href="javaScript:;">';  
  5.                 /* menu1 += '<span class="glyphicon glyphicon-home"></span>'; */  
  6.                 menu1 += '<span class=' + '\'' + v.image + '\'' + '>' + '</span>';  
  7.                 menu1 += '<span style="margin-left: 10px;">' + v.name + '</span><span class="fa arrow"></span>';  
  8.                 menu1 += '</a>';  
  9.                 menu1 += '<ul class="nav nav-second-level nps collapse in">';  
  10.                   
  11.                  /* 二级菜单  */  
  12.                     $.each(v.submenu,function(j,vJ){                      
  13.                         var menu2 = '<li class="active">';  
  14.                         menu2 +=        '<a href="javaScript:;" class="">';  
  15.                         /* menu2 +=         '<span class="glyphicon glyphicon-cloud" style="margin-right: 10px;"></span>'; */  
  16.                         menu2 +=            '<span class=' + '\'' + vJ.image + '\'' + 'style=' + '\'' + 'margin-right: 10px;' + '\'' + '>' + '</span>';  
  17.                         menu2 +=             vJ.name + '<span class="fa arrow "></span>';  
  18.                         menu2 +=        '</a>';  
  19.                         menu2 +=                '<ul class="nav nav-third-level nps collapse in">';                             
  20.                               
  21.                         /* 三级菜单 */  
  22.                         if(vJ.submenu){  
  23.                             $.each(vJ.submenu,function(k,vk){  
  24.                                 var menu3 = '<li>';  
  25.                                 menu3 +=        '<a href="javascript:openUrl(\'' + vk.url + '\')">';  
  26.                                 /* menu3 +=             '<span style="margin-right: 10px;" class="glyphicon glyphicon-off">'; */  
  27.                                 menu3 +=            '<span stype=' + '\'' + 'margin-right: 10px;' + '\'' + 'class=' + '\'' + vk.image + '\'' + '';  
  28.                                 menu3 +=            '</span>'+vk.name;  
  29.                                 menu3 +=        '</a>';  
  30.                                 menu3 +=    '</li>';  
  31.                                   
  32.                                 menu2 += menu3;  
  33.                                       
  34.                             });  
  35.                         }else{  
  36.                             $.each(v.submenu,function(j,vJ){  
  37.                                 var menu4 = '<li>';  
  38.                                 menu4 +=        '<a href="javascript:openUrl(\'' + vJ.url + '\')">';  
  39.                                 /* menu3 +=             '<span style="margin-right: 10px;" class="glyphicon glyphicon-off">'; */  
  40.                                 menu4 +=            '<span stype=' + '\'' + 'margin-right: 10px;' + '\'' + 'class=' + '\'' + vJ.image + '\'' + '';  
  41.                                 menu4 +=            '</span>'+vJ.name;  
  42.                                 menu4 +=        '</a>';  
  43.                                 menu4 +=    '</li>';  
  44.                                       
  45.                                  menu2 = menu4;   
  46.                             });  
  47.                         }  
  48.                             menu1 += menu2;  
  49.                     });  
  50.                       
  51.                     $("#side-menu").append(menu1);  
  52.                 });  
  53.                   
  54.             }</span>  

6、效果如下图

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

看看老外的社交APP UI界面设计,不知道你能有启发不?

蓝蓝设计的小编

社交软件已然成为现今人们沟通交流的主要媒介,那什么样的对话页面更大家受欢迎呢?对话页面的ui要怎么设计呢?下面列举12个国外社交app ui设计案例供设计师盆友们参考。

日历

链接

个人资料

蓝蓝设计的小编 http://www.lanlanwork.com

存档