首页

不同场景下【用户提示】的设计原则

涛涛

不同场景下用户提示的设计原则


什么是提示?提示,指给予题型和解释。提示指启示;提起注意。映射到现实生活中,教学楼“请保持安静”、厕所的标示提示、饭店里禁止吸烟的牌子都是提示,是用来提醒人们注意自己的语言、行为


根据不同到使用场合这里梳理了5中提示操作的使用控件:分别是弹框提示、常驻提示、通知、全局提示、徽标提示,这五种提示方式承载的信息量、优先级和用户操作场景各有不同


下面分别介绍这5种提示控件的使用场景:


一、弹框提示Modal


使用场景:

需要用户处理事务,又不希望跳转页面以致打断工作流程时,可以使用在当前页面正中打开一个浮层,承载相应的操作。

另外当需要一个简洁的确认框询问用户时,能够让用户清晰的知道自己的操作,并且进行二次确认



设计原则:

聚焦:使用户集中注意力确保任务得到解决,对话框一旦出现,应当呈现在页面上方的视觉层。

清晰:对话框应直接展示信息,并带有相关或上下文信息响应用户任务或操作。


控件类型:

1、功能对话框:

  • 除标题、纯文本内容和按钮外,还需要承载更多复杂信息时

  • 可配置单选框、复选框、列表、穿梭框、图片、头像、插画、视频等

2、通知对话框:

  • 用于警示、紧急、或简单的二次弹窗确认。

  • 按钮文案需承接上下文表述,并准确引导用户行为,如“确定”、“取消”、“删除”。

  • 简单的消息提醒时或不可返回的操作,只提供一个按钮用于关闭,如“知道了”“刷新”。

3、选项对话框

  • 内容不足以构成单独页面或不希望跳转新页面的对话框,多使用于搜索、设置、内容选择;

  • 需要完成的一系列任务操作,被选择后立即生效,无需进行确定反馈; 



二、常驻提示 Notice


使用场景:

常驻提示是一种非阻碍式的信息展示,它不打断用户的当前操作,一般停留至页面某个位置(优先顶部),非浮层的静态展现形式,始终展现,不会自动消失,用户可以点击关闭。


设计原则:

直接:当前页面需要向用户显示需要关注的信息时,常驻提示显示,要求用户立即注意;

重点:常驻提示引起用户注意,以确保其内容得到解决。


控件类型:

常驻提示属性包括常规提示、成功提示、警示提示、错误提示四种。

普通提示:建议用于展示背景条件、政策信息、规范要求、当前状态等客观内容。

成功提示:建议用于展示已完成操作的成功状态。

警告提示:建议用于展示可能会导致某种后果的警示性文本。

错误提示:建议用于展示一个信息组的报错文本,如表单中同时满足几个条件时触发整体报错,可用此样式。



三、通知Notification


使用场景:

在系统四个角显示通知提醒信息。经常用于以下情况:

  • 较为复杂的通知内容。

  • 带有交互的通知,给出用户下一步的行动点。

  • 系统主动推送。

设计原则:

提示文本内容以及交互方式尽量准确、清晰、简明,保证用户在其消息自动消失前了解提示信息或做出交互。


控件类型:

1、基础样式:分为基础文字通知、基础文字通知(带操作)

2、根据业务需要在区域内填充内容或操作类组件的通知。



四、全局提示toast/ Message


使用场景:

通常出现时显示几秒后自动消失,或者数据正在加载时显示,提醒用户已经完成的动作,或者已经达成的目的,是用户完成动作后或者异常情况下的提示(pc端叫 Message,移动端叫toast实质上都是全局提示是一个控件)


设计原则:

在不跳转页面打断用户工作流程的前提下,提供成功、警告和错误等反馈信息。不打断用户操作


控件类型:

1、刷新页面时,提示更新的条数:

2、收藏或者其他操作,提示用户操作成功:



五、徽标提示 Badge


使用场景:

红点、数字或文字,一般出现在通知图标或头像的右上角,用于显示需要处理的消息条数,通过醒目视觉形式吸引用户处理。


设计原则:

跨平台:可适用于 Windows/macOS/iOS/Android 平台的所有套件产品,为产品提供一致的设计体验,使用户在不同端使用产品时,都可以拥有流畅高效的使用体验。

直观:通过清晰醒目的视觉形式告知用户状态,吸引用户关注和处理。


控件类型

1、点状徽标

当功能模块更新、信息状态为未读、人员在线协同、信息量变化且无需告知具体数量或性质时,使用点状徽标突出状态

2、字符徽标

内容的信息量发生变化,且需要明确告知新增数量时

3、图标徽标

在某些功能场景中,作为特殊状态提示使用

4、角标徽标

通常出现在列表、卡片上,强调和突出其特殊状态,其主要作用是标记,或吸引用户的注意力,提示用户关注该事物或事件



总结

简单的总结,并不是非常全面,还有很多需要继续挖掘的技巧,还有很多需要学习的东西;有一点能够肯定的是,要从实际的用户场景中去考虑问题,用户体验就必须站在用户的角度,不能为了设计上的美感,而让增加用户学习成本,好的体验应该就是用户一眼就能看懂,操作简便。




文章来源:站酷  作者:郭大毛


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



小米商城APP首页设计全面解析!

鹤鹤

前言 



互联网产品首页是与用户进行交流的第一步,首页设计不仅代表着一家企业的形象,还会直接影响公司的业务营收和口碑。


本文将深度解析“小米商城”APP的首页设计,分析B2C模式下的自营电商是如何通过设计打造品牌感,增加用户参与感,从而促进产品的销售转化。



 产品定位 



了解一款APP产品首先要了解它的产品定位,从小米商城的slogan“让每个人都能享受科技的乐趣”不难看出小米的产品定位是性价比高的科技类产品。

 

另一方面,从商业模式来看,小米商城是B2C自营电商,与其他B2C自营电商平台不同的是,小米主打高性价比,以好口碑深入大众,撬动市场,以互联网思维卖产品,把硬件产品当互联网软件产品卖。

 

由此可见,科技、高性价比是小米商城产品定位的两大关键词。



 目标用户 


目标用户是产品模式和功能制定的重要考虑因素,小米商城的目标用户可以分为三类人群:


1、米粉用户


这类用户是小米的忠实粉丝,也或许是雷总的粉丝,他们认同小米文化,喜爱小米产品,热衷购买和传播小米产品,是小米商城最有价值的用户群体。


2、科技发烧友


这类用户本身就是科技爱好者,喜爱探索新鲜前沿的科技产品,热衷购买科技类创新性的产品,对于深度发烧友还会专研参数配置,并会在论坛探讨分享。


3、追求小资用户


这类用户追求品质,喜爱有设计感的产品,如果了解到小米有什么产品好看又好用,他们会为了保证品质和服务,选择从官方购物平台购买。



 全品类商城与自营商城设计差异 


虽然了解了小米商城的定位与目标用户,但还需要从产品的商业模式上去推导设计,比如淘宝与小米商城的首页设计大有不同,原因就是因为商业模式不同,致使产品的设计存在差异。


1、全品类与自营首页设计区别


自营类商品其实是全品类商城的一个分支,全品类商城首页衍生了很多独立平台,所以全品类商城首页设计形式上更注重流量分发,而自营类是垂直领域,所以会更突出商品,并且创造商品卖点,打造爆款。



全品类电商产品因为品类众多,用户长时间使用会形成“逛”的习惯,从运营的角度,首页运营板块就会以千人千面的形式出现各类产品,所以首页在设计上需要放置更多的产品,甚至要不停的变化产品,以覆盖到用户的需求点。 

而自营类电商产品,因为品类较少,用户很难逛起来,也是因为用户使用自营类产品本身就是带有目的性的,这样用户通常会是“找”的行为,所以首页的功能上通常会推荐主题产品和打造爆款。 




2、自营类商城设计上注重品牌


自营类商城运营的是品牌,能发展壮大的自营电商都成功塑造了品牌形象,所以在产品设计上突出品牌,会与用户建立信任感,提高转化,同时也能做到与其他电商的差异化设计。


下图所示,小米商城、小米有品、网易严选三款产品,为了能快速与用户建立品牌认知,导航栏都放了自家的logo。


另外,还可以从色调,板式,服务等等各个纬度突出品牌形象,总之在产品设计上要与品牌形象贴合,让用户处处能感知到品牌。


导航栏设计注重品牌


了解产品定位和目标用户以及平台的商业模式,对我们分析一个产品非常重要,这样更容易从正确的方向理解产品的设计,下面我们带着对产品定位和目标用户的理解,开始对小米商城APP首页设计的全面解析。



 小米商城-首页解析 



B2C模式下的品牌电商,首页设计需要做到可以让任何一款产品成为爆品,也不会让任何一款产品出现库存滞销。 

小米商城首页的设计与运营紧密联系,有带货能力超强的模块,如小米众筹、小米秒杀,也有能快速推广新品的模块,如小米新品、新品发布,这些都是品牌电商重要的组成部分。 


接下里我们从品牌DNA、布局体验设计、金刚区设计、登录前后设计、参与感设计等方面对小米商城首页进行解析。


1、品牌DNA


当前小米公司有着非常强大的品牌势能,给人们留下了性价比高、高端、简约、科技、坚持的好印象,这些都可以看作是小米的品牌DNA,因此在设计小米商城APP时,设计需要贴合小米品牌DNA,让用户使用产品时能感受到小米的品牌力。


打开小米商城APP,处处能感受到小米的品牌元素,橘色的品牌色、小米的产品图标等,都在传递着小米的符号,整体UI的设计秉承了小米硬件产品的一贯风格,如简约的风格、高质感元素等,细节上体现品质。



2、布局体验设计


用户浏览电商产品首页,第一屏流量最高,随着往下走第二屏、第三屏...跳失率会越来越高,根据数据统计通常产品第三屏之后流量会大打折扣。



双十一期间截图 



上图的数据并不能代表所有产品的数据,好的设计形式可以影响数据的变化。


如何减少跳失率,要从用户在当前位置的所思所想出发,做好第二屏到第三屏的功能制定和引导设计非常重要。


小米商城首屏最后的位置可以看到第二屏的内容标题,能够起到引导性作用,并且放的是最有吸引力“小米秒杀”和“新品发布”双十一期间增加了运营模块,虽然这两块在第二屏,但看到的同样是最有吸引力的双11促销信息。


引导用户查看内容


另外在不增加运营板块时会发现,小米商城重要板块不会放到第三屏,在第二屏下面已经开始出现精选(猜你喜欢)闲逛区,因为是太多板块用户会感觉首页很乱,不容易对各板块功能形成认知,其次就是随着跳失率的增加,重要板块也会失去好的转化效果。


打造沉浸式体验


多数用户在第三屏时会失去再向下探索的动力,这时系统通过算法给用户推荐用户喜欢的内容,会再次吸引到用户,重塑用户向下探索的好奇心。


用户在“猜你喜欢”版块心态是无目的的闲逛,当用户不想再向下探索时,随时可以侧滑屏幕切换到其他品类,这样也大大减少了用户首页闲逛的跳失率,营造出了一种沉浸式的交互体验。



闲逛区(猜你喜欢)沉浸式体验


同时因为用户在此版块是“逛”的心态,所以设计上采用瀑布流,也可以称为Feed流,这样的设计形式重点突出的是图片,也就是商品本身,参数配置会弱化或不出现,因为用户闲逛时是没有目的的,当一个商品对他吸引后,用户才会主动点击查看详情。


如果用户是有目的搜索某个或某个品类商品时,此时列表流更为合适,因为用户是有目的性的查找商品,他是认识这款或这类产品的,所以必定会开始关注产品的参数配置等,列表流的左右结构,能非常合理的呈现出参数配置等信息。




总结:当用户无目的“逛”时会关注产品本身,所以这时需要重点突出产品图,使用瀑布流更合适;当用户有目的查找商品时,因为已对商品有一定的认识,所以不仅希望看到图片,同时也希望能够直观看到产品的参数配置,这点对科技类产品的展示尤其重要。


3、金刚区设计



小米商城-金刚区


金刚区的图标设计直接用产品来代替,真实的手机、电脑、笔记本等,这样不仅能与众多电商平台的金刚区有差异化,更加能够把入口功能表现的有识别性、直观性,能够使用产品模型作为图标元素,这本身形成了一种优势。


“触碰想象,感受真实”金刚区的图标设计符合小米的设计理念,设计师从图标的设计营造出了贴合目标用户认知的氛围,让用户感受到了归属感。


金刚区图标的布局设计与产品定位和用户特征非常吻合,第一个图标是“小米新品”,对于米粉来说,这应该是最关注的功能入口,关注新品的用户也是最容易购买新品的人群,从产品的角度来讲,新品也是需要大力推广宣传的,所以新品入口放置首位无可厚非。


第二个是“小米众筹”,此功能入口对于追求性价比的用户是最有吸引力的,因为众筹价低于零售价,符合性价比属性,此模式是先付钱再生产,解决了库存、物流成本等。


第一排剩下的是三个手机图标,其中位于中间位置的“至尊新品”是动效展示,也是因为要强调和推广新款手机。


“小米秒杀”放在第二排第一个,是因为此模块也非常重要,是一大流量入口,秒杀功能板块是利用时间的紧迫感来刺激用户转化,走量能力极强,正因如此,在页面的下方有专门的“小米秒杀”板块。剩下的四个图标是小米生态链中四个类别的产品入口,代表了大多数产品。



4、登录前后设计


新人首次打开产品,促进第一单购买


小米商城新用户第一次打开产品时,会直接弹出“新人专享福利”弹窗,点击查看都是性价比极高,且生活中常用的物件,性价比高是为了促进与新用户的第一笔交易,推荐常用物品是为了让用户在生活中看到用到这些常用物品时可以物品的购买渠道,从而提高复购。


新人登录前,首页内容促进第一单购买


如果用户不小心关闭了弹窗,没关系在首页最重要的位置也会看到“新人福利”板块,如果享受新人福利,那在购买前一定要做的是要注册登录的,所以新人福利,不仅可以促成与新人的第一笔订单,而且也有助于引导新人成为注册用户。


新人登录后,继续促进第一单购买


从下载小米商城到登录后,会有三次提示有新人福利,上面介绍了前两次,第三次是当登录后会直接跳转到“新人专享福利”,目的还是促成一单有性价比的交易,给用户留下第一次好的购物体验,最终变成有价值的用户。






不包邮是用户最大的痛点
 

据调查电商购物,用户最大的痛点就是不包邮,同样一件商品,99元包邮比90元+8元快递费组合更容易让人接受。


上图小米商城的新人福利,都在强调包邮,消除用户痛点,让用户的首次购物真正的感受到小米商品的性价比。


个人中心登录前后有意思的设计


小米商城登录前后在个人中心有个地方的设计非常有意思,看下图未登录前的5个图标设计,相信身为设计师的你一眼就能看出“钱包”的图标偏小,这是为什么呢?



登录后才发现,较大的四个图标都会换成数字,数字的大小正好与钱包图标的大小视觉上一致,设计师似乎很淘气。


登录后数字与图标大小视觉上一致



5、参与感设计



小米商城的商品具有低频购买的属性,如手机、家电等,好在商品的种类相对较多,小米也在不断的研发新品,为了促活,小米商城在设计上有很多参与感的设计。 

小米商城有“星球”板块,可以理解为是一个基于产品讨论为导向的社交平台,这样的功能就是让用户有参与感。 

当对比华为商城和OPPO商城后,发现华为与OPPO只是把产品呈现出来,却很少有让用户有参与感的设计,而小米商城处处都在打造参与感设计,如游戏化设计、互动平台等等,当然这些功能的设计与小米主打性价比和粉丝属性的用户有关。 


在小米商城的首页用户可以打开红包雨游戏功能、答题领红包功能、智取盲盒机功能等,这些虽然都是营销策略,但因为趣味性、游戏化的设计也大大提高了用户参与感,从而增加了销售机会。




 最后 



对于负责流量分发的首页,不仅要引导用户浏览和购买商品,给用户创造优秀的产品体验,首页也是体现公司品牌形象的关键点位,品牌形象能够让用户了解你、信任你、感受到价值,从而促成购买转化,这些都可以用设计助力表现。 

以上讲的是UI设计前的探索工作,也是非常有必要的工作,产品设计者只有真正了解了产品的底层架构,才能精准的把控设计,在各方面掌握好平衡。

文章来源:站酷 作者:吴星辰

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

设计师要懂的用户习惯

鹤鹤


前言:


前些天对用户习惯进行了总结,这两天重新优化了一遍。我们在互联网产品的设计过程中,有时会听到一个词:用户习惯。设计师希望尝试更多新颖的交互方式、视觉效果,却常常容易被其他人挑刺指出不符合用户习惯,建立在用户习惯上的创新才是好的体验。


尽管设计师经常将用户习惯挂在嘴边,但是却很难有人说出用户习惯究竟是什么?我们如何判断所做的设计是否符合用户习惯?用户习惯是否始终不能打破?道理我都懂,就是不会做,实际上确实是这样,因为很大程度上取决于设计师对用户习惯的理解深度。


用户习惯本身很难被量化,但是不代表就是一个模糊的概念,你仍然能从用户反馈、操作行为数据对比等分析中一窥究竟,用户习惯是可以随着设计师的学习、经验、眼界等的提升而提升的。



什么是用户习惯?


心理学上认为,习惯是人在一定情境下自动化地去进行某种动作的需要或倾向。或者说,习惯是人在一定情境中所形成的相对稳定的、自动化的一种行为方式。 习惯形成是学习的结果、是条件反射的建立、巩固并臻至自动化的结果。

 

所以,习惯有两大特点:


需要注意的是,“长期”本身是是没有明确时间界限的,更强调多次的重复。这里的习惯,侧重于描述“习得性”,即人们通过经历、学习、刻意练习等方式形成的,所以这种习惯理论上是可以被改变的。


此外,习惯还有一种潜藏特性,区别于上面描述的“习得性”,是天生的、物种特有的行为模式。比如人空腹状态下,闻到香的食物会产生强烈食欲。这种特性习惯是刻在基因里的,几乎无法被改变。



试想,我们在使用 App 时,是否遇到过因为习惯的问题而感觉到不适应的场景?


举个最常见的例子,Windows 与 Mac 系统的软件关闭方式。使用 Windows 的电脑时,我们形成了关闭操作在右上角的自然习惯。后来开始使用 Mac 电脑,关闭方式都在左上角,在一段时间内,每次关闭时都感觉到格外不习惯。而 Mac 的关闭方式没有比 Windows 产生显而易见体验升级,改变操作习惯成本高,部分用户可能会认为 Mac 的关闭操作不好用。


当然,假如最开始接触的是 Mac 电脑,再使用 Windows 电脑,也会自然认为 Windows 不好用,这是先入为主的观念,一旦产生习惯,改变习惯将产生一定的学习成本。

 


用户习惯的产生


设计师需要思考用户行为的本质,而尽量减少主观判断。产品是给人使用的,所以了解人们的行为特征很重要,而只要涉及到对人本身的了解,就是极其复杂的,人类对自身的行为特征了解远远不足,但这不妨碍我们以现有知识去做一些分析和判断。


用户行为习惯的产生,与记忆的特点有很大关联,我们可以把记忆划分为外显记忆和内隐记忆。


外显记忆大家比较习惯和容易感知到,比如我们在学校学习时背诵的课文、公式法则等,可以用语言、文字等显性方式描述出来的记忆。


内隐记忆也叫非陈述性记忆,我们无法用行为描述而又确实存在,比如骑单车,学会之后很难会遗忘。刚开始学习时,会需要意识的介入,经过多次练习,行为会逐渐“自动化”,比如学习开车时,我们会注意力很集中,而习惯开车后,可以一边开车一边聊天。

我们平时说的肌肉记忆、条件反射也和内隐记忆息息相关,而且一旦形成,不太容易改变。需要注意的是,肌肉记忆只是一种简单描述,负责此记忆的是小脑,其实肌肉没有记忆。


所以有时候,我们感觉体验某个 App 时,会习惯性在某页面寻找某功能,或者觉得体验和其他 App 有区别,都可能是内隐记忆的用户习惯引起的。举个例子,某天你刚使用一个没用过的 App ,这时你想要找设置功能,那你大概率会不自觉的点击 App 的最后一个主 Tab (如“我的”),因为大部分 App 的设置功能都在这个场景,用户自然也就形成了习惯。


这里我且采用由心理学家基思·斯坦诺维奇(Keith Stanovich)和理查德·韦斯特(Richard West)率先提出的术语,用以说明大脑中的两套系统,即系统 1 和系统 2。


·系统1的运行是无意识且快速的,不怎么费脑力,没有感觉,完全处于自主控制状态,也叫快系统。

·系统2将注意力转移到需要费脑力的大脑活动上来,例如复杂的运算。系统2的运行通常与行为、选择和专注等主观体验相关联,也叫慢系统。


而这两个系统,是可以互相转化的,慢系统通过刻意练习,把新的习惯注入快系统,而这时快系统就是习惯的表现,这样快系统可以在日常生活中完成大部分工作,这就是我们常听说的熟能生巧,习惯经常能帮我们节省思考的精力,这又让慢系统进一步通过刻意练习,向快系统不断注入更多好习惯。


举个例子,你刚用一个 App 时,可能需要先体验一下你要的功能在 App 的哪个位置,但你用久之后,就会不假思索地找到它。就像你用微信,最常用的功能可能是回复信息、看朋友圈,所以一定会形成习惯。但是假如有人让你找一下微信里面“生活服务”的入口,你可能会先想一下可能出现在什么入口,这就是因为平时比较少用导致的。假如你常用这些入口,也会形成习惯,下次要使用这些功能的时候,就能够快速找到。



避免改变用户习惯


1、挑战用户习惯的风险


既然说到用户习惯的特点是“长期养成”且“不易改变”,那么挑战用户习惯一定会造成不适,甚至引起强烈反感。几年前 Ins 的 logo 改版,将 logo 由拟物化改成了扁平化,颜色也发生了变化。暂且抛开视觉效果不说,从用户视觉记忆上,已经习惯了下图左侧的效果,而右侧新版效果很难与左侧产生记忆上的关联。


许多用户反馈桌面上找不到这个应用、许多用户吐槽很丑甚至不想再使用。所以我们比较容易理解,为什么有时候 App 改版容易反而引起用户的反感,这很大程度上是用户习惯的影响。



2、如何避免挑战用户习惯


产品的用户是谁?


了解产品的用户是谁、用户的行为特点是什么。不同产品由于定位不同,所以用户群体也不相同,用户群体的不同自然代表用户行为特点的不同。如果设计师知道用户群体,但是不清楚具体行为习惯特征,可以尝试让你身边的用户帮你体验。


举个例子,B 站的整体用户画像相对而言更偏年轻化,所以产品设计上,无论是代表形象、UI 风格、交互体验都更显年轻化。而“小年糕”小程序的用户群体主要为中老年人,所以设计上不会显得很年轻,而是以操作明确、字号偏大、去除多余信息为主。


关注竞品的体验


关注主流产品的用户体验很重要,这些竞品的操作往往代表用户的习惯操作(或被培养出来的习惯操作)。大多数情况下,你需要了解竞品能做到什么程度,用户容易将习惯从一个场景带到另外一个相似场景。


比如点外卖,有的用户可能会下载美团和饿了么,尽管平台不同,但是在用户习惯中,操作模式是相似的,所以如果你要让用户的体验不突兀,那就往往遵循相似的操作逻辑。当然这些不是为了让一个产品去抄另外一个产品,而是要追寻更好的使用体验,你的产品比竞品体验更优,就更能吸引用户的青睐。


了解人类的行为/阅读模式


每个人本身都会具有相对稳定的行为、操作、信息阅读习惯,我们能见到的体验好的产品,都是符合用户的基本行为习惯、信息阅读习惯的,要想了解这些习惯,需要了解深层次的交互行为特征。


从操作而言,需要了解用户与界面交互的行为习惯,比如用户的操作(手势操作、信息布局如何才能便于操作),比如尼尔森可用性原则等。


从信息阅读角度而言,需要考虑人们眼睛观察事物的规律,比如格式塔原理:接近性原则、相似性原则、连续性原则、闭合性原则、主体/背景原则、简单对称性原则、共同命运原则。


了解平台设计规范


就移动互联网产品的领域而言,大家都是与手机互动,目前手机系统的两大平台:iOS 和 Android 也都各自有提供关于人机界面设计有清晰的指导,尤其是 Android 的 Material Design ,对于设计师快速了解设计规范、设计原则有很大作用。


iOS 与 Android 的人机界面规范链接:

iOS:https://developer.apple.com/

Android:https://material.io/



培养新的用户习惯


1、何时培养新的用户习惯?


我们提到挑战用户习惯会有风险,但用户习惯并非是永远不可改变的,有时我们需要培养新的用户习惯,也就是大家常说的“教育用户”,否则世界可能一直很难进步。


移动互联网兴起之前,大家都是线下打车,但是滴滴打车颠覆了传统线下打车的用户习惯;以前大家都是现金支付,但是微信支付颠覆了现金支付的用户习惯。


《设计心理学》里面有这么一段话:“如果用新的方式做一件事只比原来好一点,那么最好与以前保持一致。如果必须做出改变,那么每个人都得改变。新旧混杂的系统会让每个人困惑。当新的做事方式明显优于旧的方式,那么因改变而带来的价值会超越改变本身所带来的困难。不能因为某样东西与众不同就认为它不好。如果我们故步自封,我们将永远不会进步。”


改变的价值大于改变的困难


这里的价值包括但不限于用户价值、商业价值(短期价值、长期价值)等,当新习惯会需要用户改变旧习惯时,这个设计带来的价值有多大,值不值得让老用户付出学习成本。有时候,明知改变会引起用户的强烈抵触,仍然改变用户习惯,可能因为改变的价值大于改变的困难。


刚才提到的 ins 的例子中,有的人不知道 ins 为什么要改版,创新咨询公司 IDEO 的沟通设计主管 Remy Jauffret 说:“当品牌、组织超越了最初的商业意图,或扩展业务提供不同的产品,或领导希望吸引新的客户,这些情况都可能需要新的品牌视觉。变化总是大家不舒服,然后又平息,我认为时间才是检验真理的唯一标准。”


改变带来明显的体验升级


我们在设计中,有时候会遇到自己的产品某个功能体验比较差,但是延续了很久,而市面上其他同类产品在相同功能的体验上已经做的很好,我们可以往主流交互体验上改版吗?这时需要权衡改变之后是否能带来明显的体验升级,还是说对于用户来说是不痛不痒的变化,可改可不改?


以安卓为例,在几年前,安卓手机的底部有 3 个实体键,后面手机更新迭代,变成了虚拟三键设计,因此底部存在3个不同功能的热区。而在 Android 4.0 设计规范中,为了避免底部标签栏与已经存在的底部虚拟键产生交互上的冲突,安卓明确说明了不要使用底部标签栏。


但这种规则,在使用体验上、开发者的适配上都发生了问题,用户更接受 iOS 的体验,后面谷歌在 Material Design 中,允许了底部标签栏的存在。这相当于和原来的用户习惯不一致,但却带来了更好的用户体验。



2、如何培养新的用户习惯?


这里结合上瘾模型的触发、行为、多变的酬赏、投入进行阐述,这四个步骤是一个循环,当用户越沉迷于这个循环,说明你的产品对用户的吸引力越强,用户习惯也就越强,这里会侧重于从培养用户习惯的角度进行拆解。



触发:外部触发和内部触发 


外部触发说白了就是加强产品曝光,让用户一下子就能想起你。举个例子,“充电五分钟”下一句是什么?你大概率会想到“通话两小时”,这种经过外部的长期触发,最终已经转变成了内部的习惯,会让你记忆深刻。


外部触发的类型主要有4类,通过将信息渗透进用户生活,吸引他们采取下一步行动:


付费型触发:做广告、搜索引擎推广都是付费型触发,争取新用户;

回馈型触发:公关和媒体等领域的触发,比如对产品做正面报道、推荐等;

人际型触发:熟人之间的口碑传播是一种极其有效的外部触发,可以为产品带来“病毒式增长”;

自主型触发:以驱动用户重复某种行为作为重点,让用户形成习惯,比如新闻订阅、每天早晨的闹钟等。


内部触发是用户心理产生的使用动机,内在情绪驱动自己去使用一款产品。


当某个产品与你的思想、情感或者是原本已有的常规活动发生密切关联的时候,那一定是内部触发在起作用。对于习惯刷朋友圈的人来说,拿起手机就不会自觉打开微信;对于习惯刷微博的人来说,拿起手机就会刷起微博,甚至自己都没有意识到。一再重复这种场景,会用户就会对此形成一种稳定的联系,进而形成习惯。


行动


斯坦福大学福格博士曾提出“福格公式”,福格行为模型可以用公式来呈现,即 B = MAT。B 代表行为,M 代表动机,A 代表能力,T 代表触发。只有动机、能力 、触发三者皆备,才能跨过“行动线”。


触发:即上面所提到的外部触发与内部触发。


动机:动机决定你是否愿意采取行动。福格博士认为,驱使我们采取行动的核心动机主要是三种:追求快乐,逃避痛苦;追求希望,逃避恐惧;追求认同,逃避排斥。


能力:这里要详述的是能力,所谓习惯,是指人们在几乎无意识的情况下做出的举动。一种行为的复杂程度越低,无论是体力上的还是脑力上的,被人们重复的可能性就越大。越简单的操作成本,记忆成本越低,越容易形成用户习惯。


举个例子,刷抖音就是用户行为成本极低的场景,你在刷抖音时,不需要多余的交互行为,切换视频甚至不需要点击,只需要向上滑动。除开抖音算法的精准推荐不说,从交互层面而言,也是足够简单并且形成习惯了。


如果改变会打破认知习惯,要让用户能快速了解新设计的使用方式。最好的方式是能够让用户快速与已其他竞品的操作习惯产生关联。比如采用其他主流应用成熟的交互方式。


如果改版会很大程度上改变用户行为,也可以考虑尝试以下的方式。


· 改版操作指引:这种方式较为常见,但是仍应注意避免繁琐的操作指引,切勿把操作指引当作体验差时的解决方案。


· 兼容多种用户习惯:这种方式可以让不同用户选择适合自己的交互方式,最大程度考虑到所有用户,但同时也可能造成了功能冗杂的情况。比如安卓底部三大金刚键,后面手机全面屏时代,新增了全面屏手势。考虑到安卓老用户的使用习惯,三大金刚键(底部虚拟按键)始终被保留下来;


· 允许切换新旧版本:这种方式一般是改版变化过大,用户一时间不容易接受新的体验方式,常见于网站,如站酷早期的大改版,但是仅适用于过渡期。


当然,除上述方式外,肯定还有一些其他让改变行为习惯更舒服的方式,这里不一一列举。


多变的酬赏


多变酬赏主要表现为:社交酬赏,猎物酬赏,自我酬赏。这几种酬赏会加强用户对产品的使用习惯。


社交酬赏:人们从产品中通过与他人的互动而获取的人际奖励,比如被认同、重视、喜爱等。比如人们喜欢发朋友圈、微博等,期望得到回馈,某种程度上都是为了获得社交酬赏。

猎物酬赏:人们从产品中获得的具体资源或信息。比如浏览信息流,丰富的信息流内容为用户提供了资讯,比如刷抖音,人们追求视频的新鲜感、追求内容的丰富性都是属于猎物酬赏。

自我酬赏:人们从产品中体验到的操控感、成就感和终结感。在目标驱动下,我们会去克服障碍,即便仅仅是因为这个过程能带来满足感。就像你玩游戏,希望赢过对面,或者期待将游戏玩通关,本质上属于自我酬赏。


投入


如果希望继续培养用户习惯,与产品产生更紧密的联系,就需要鼓励用户进行一些投入,以增加他们使用产品的可能性。行动只是用户使用的第一步,促使用户对产品的投入,才会真正增强用户与产品之间的联系,形成更强的用户习惯。但是如果用户自身没有投入,即替换成本低,那么随时都可能有被其他产品取代。


举个例子,移动互联网时期,微信早早入局,人们的关系链都在微信里面沉淀,即人们越使用微信,关系链沉淀越多,就越难以更换其他产品,所以两年前想要挑战微信的多闪、马桶 MT 和聊天宝这三款社交 App 不可避免的失败了。


用户越愿意投入,就证明用户粘性越高,在此过程中,用户习惯也会不断加强。



结语:


现阶段,人人大谈用户习惯,但是用户习惯不以自身为标准,而是需要考虑产品用户的行为特征,以及人们在使用产品时更加深层的、甚至用户本身都没有发现的习惯,这就需要设计师对习惯的产生、习惯的判断、习惯的培养有深入的认识。


一般情况下,产品不适合贸然改变用户习惯,但是在有特殊需要的情况下,还是不可避免的改变产品的用户使用习惯,当然我们需要如何让用户更加容易接受。大多数产品,都希望用户能够形成对自己产品的习惯,所以需要了解用户如何对产品产生习惯、加强习惯,使产品拥有更强的吸引力,但是良好、正向的用户习惯一定是基于用户体验的。


文章来源:站酷 作者:热风_

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



JavaScript控制语句与异常处理

前端达人


一、if 控制语句

  1. 简单if语句
 if(条件表达式){ 表达式成立时执行的代码段 } 
  • 1
  • 2
  • 3

注意 : 除零值以外,其他值都为真

特殊写法 : { }可以省略,一旦省略,if语句只控制其后的第一行代码

var a = 10; if(a<5){ console.log('成立'); //如果if不成立则不运行 } if(a<5)console.log('成立'); //如果if不成立则不运行 console.log('测试'); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. if - else结构
if(条件表达式){ //条件成立时执行 }else{ //条件不成立时选择执行 
  • 1
  • 2
  • 3
  • 4
  1. 多重分支结构
if(条件1){ //条件1成立时执行 }else if(条件2){ //条件2成立时执行 }else if(条件3){ //条件3成立时执行 }...else{ //条件不成立时执行 } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

示例:

var bmi=23.5; if(bmi>23.5){ console.log('肥胖') }else if(bmi>=18.5){ console.log('正常') }else{ console.log('偏瘦') } //正常 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

二、switch 选择控制语句

语法:

switch(value){ case1 : //value与值1匹配全等时,执行的代码段 break; //结束匹配 case2 : //value与值2匹配全等时,执行的代码段 break; case3 : //value与值3匹配全等时,执行的代码段 break; default: //所有case匹配失败后默认执行的语句 break; } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

使用 :

  1. switch语句用于值的匹配,case用于列出所有可能的值;只有switch()表达式的值与case的值匹配全等时,才会执行case对应的代码段

  2. break用于结束匹配,不再向后执行;可以省略,break一旦省略,会从当前匹配到的case开始,向后执行所有的代码语句,直至结束或碰到break跳出

  3. default用来表示所有case都匹配失败的情况,一般写在末尾,做默认操作

  4. 多个case共用代码段

    case 值1:

    case 值2:

    case 值3:

    以上任意一个值匹配全等都会执行的代码段

注:case表示一个条件,满足这个条件就会进入该内部,遇到break则会跳出,若未写break则直到遇到下一个break才会停止。

var gameScore = 'better'; switch(gameScore){ //case表示一个条件 满足这个条件就会走进来 遇到break跳出。如果某个条件中不写 break,那么直到该程序遇到下一个break停止 case 'good': console.log('玩的很好') //break表示退出 break; case 'better': console.log('玩的老牛逼了') break; case 'best': console.log('恭喜你 吃鸡成功') break; default: console.log('很遗憾') } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

三、while 循环控制语句

语法:

定义循环变量; while(循环条件){ 条件满足时执行的代码段
   更新循环变量; } 
  • 1
  • 2
  • 3
  • 4
  • 5

示例:

//循环变量 var i = 1; var sum=0; while(i<101){ //循环体 console.log(i); sum+=i; //更新循环变量 i++; } console.log(sum); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

四、do-while 循环

语法:

do{ 循环体; 更新循环变量 }while(循环条件); 
  • 1
  • 2
  • 3
  • 4

示例:

//循环输出一百次 var i = 101; do{ console.log('python'); //更新循环变量 i++; }while(i<101); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

do-while与while循环的区别:

  • while循环先判断循环条件,条件成立才执行循环体
  • do-while循环不管条件是否成立,先执行一次循环体

五、for 循环控制语句

语法:

for(定义循环变量;循环条件;更新循环变量){ 循环体; } 
  • 1
  • 2
  • 3

循环控制 :

  1. break 强制结束循环
  2. continue 结束当次循环,开始下一次循环

循环嵌套 : 在循环中嵌套添加其他循环

示例:

/*控制循环体的执行:break/continue*/ for(var i=1;i<10;i++){ console.log(i); if(i==5){ console.log('--------') //一旦执行break,循环体中后面的代码都不执行 break; } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

注:循环的是获取的每一个DOM元素值,for...in...是用来循环对象的所有属性,DOM元素包括了输出的属性,因此不推荐使用for...in...


六、三元运算符

var a = 1 var b =2 var c = a>b ? a:b //如果a>b成立返回a,否则返回b console.log(c) 
  • 1
  • 2
  • 3
  • 4

七、异常处理

语法:

try{ 这段代码从上至下运行,其中任何一个语句抛出异常该代码块即结束运行。 }catch(e){ 如果try代码块中抛出异常,catch代码块中代码就会被执行;
    e为一个局部变量,用来指向Error对象或者其他抛出的对象。 }finally{ 无论try中代码是否有异常抛出(甚至是try代码块中有return语句)finally代码块中始终会被执行。 } 


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

注:主动抛出异常:throw Error("xxx")


转自:csdn 论坛 作者:PPPsych


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



我劝你学一下TypeScript(TypeScipt有这篇就够了)

前端达人

TypeScript

一 概述

1.1 基本介绍

  • 以JavaSrcipt为基础构建的语言
  • 一个JavaSrcipt的超集
  • 可以再任何支持JavaSrcipt的平台运行
  • TypeScript扩展了JavaSrcipt,并添加了变量类型
  • TS不能被JS解析器中直接执行,需要通过编译转换为JS

1.2 安装TS编译器

  • 安装
npm i -g typescript 
  • 1
  • 验证
tsc 
  • 1

在这里插入图片描述

  • 测试

    • 先建hello.ts
    console.log("你好啊,TS") 
            
    • 1
    • 编译
    tsc hello.ts 
            
    • 1

在这里插入图片描述

二 基本语法

2.1 总体介绍

JavaScript 的类型分为两种:原始数据类型(Primitive data types)和对象类型(Object types)。

原始数据类型包括:布尔值、数值、字符串、nullundefined 以及 ES6 中的新类型 Symbol 和 BigInt。4

  • 类型声明

    • 类型声明是TS非常重要的一个特点;

    • 通过类型声明可以指定TS中变量(参数、形参)的类型;

    • 指定类型后,当为变量赋值时,TS编译器会自动检查值是否符合类型声明,符合则赋值,否则报错;

    • 简而言之,类型声明给变量设置了类型,使得变量只能存储某种类型的值;

    • 语法:

      • let 变量: 类型;
        
        let 变量: 类型 = 值;
        
        function fn(参数: 类型, 参数: 类型): 类型{
            ...
        } 
                                
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
  • 变量:

//申明一个变量 let 变量名:类型
// number
let a:number;
a=1;
// string
let b:string;
b="哈哈";
// boolean
let c:boolean=false; 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 函数:
// 函数 function 函数名(变量:类型,变量:类型):返回值类型 {
//     return a+b;
// }
function sum(a:number,b:number):number {
    return a+b;
}
sum(1,3) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 自动类型判断
    • TS拥有自动的类型判断机制
    • 当对变量的声明和赋值是同时进行的,TS编译器会自动判断变量的类型
    • 所以如果你的变量的声明和赋值时同时进行的,可以省略掉类型声明

2.2 基本数据类型

类型 例子 描述
number 1, -33, 2.5 任意数字
string ‘hi’, “hi”, hi 任意字符串
boolean true、false 布尔值true或false
字面量 其本身 限制变量的值就是该字面量的值
any * 任意类型
unknown * 类型安全的any
void 空值(undefined) 没有值(或undefined)
never 没有值 不能是任何值
object {name:‘孙悟空’} 任意的JS对象
array [1,2,3] 任意JS数组
tuple [4,5] 元素,TS新增类型,固定长度数组
enum enum{A, B} 枚举,TS中新增类型
  • number
// number let a:number; a=1; 
  • 1
  • 2
  • 3
  • string
// string
let b:string;
b="哈哈"; 
  • 1
  • 2
  • 3
  • boolean
// boolean
let c:boolean=false; 
  • 1
  • 2
  • 字面量
// 字面量 |:或 &:与
let d:'man'|'woman';
d="man";
d="woman";
let e:number|boolean;
e=1
e=false; 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • any
//any 一切类型变量与js没啥区别
let f:any;
f=1
f=false; 
  • 1
  • 2
  • 3
  • 4
  • unknown
// unknown 不知道什么类型,实际上是一种安全的any
let a:unknown;
a=1;
a=false;
a="哈哈哈"; 
  • 1
  • 2
  • 3
  • 4
  • 5
  • void
// 函数返回值,默认返回值any,空值
function add(a,b) {
return a+b;
}
// 没有返回值,空值
function adds():void {
return null;
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • never
// never:永远没有返回值
function hh():never {
throw new Error("错误了");
} 
  • 1
  • 2
  • 3
  • 4
  • object
// object 对象 常用:{属性:属性值}
let  b:{name:string,age:string,sex:boolean};
b={name:"小米",age:"12",sex:false}
// ?可选属性
let c:{name:string,age?:string,sex?:boolean}
c={name:"雷军"}
// 任意类型的属性 [propName:string]:any
let d:{name:string,[propName:string]:any}
d={name:"哈哈",a:1,b:2}
// 限制函数结构 语法:(形参:类型......)=>返回值
let e:(a:number,b:number)=>number;
e=function (n1,n2):number {
return n1+n2;
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • array
// 数组,同一类型的数组 类型[], array<类型>
let a:string[];
a=['h','b','c','d']
let b: Array<string>;
b=['h','b','c','d'] 
  • 1
  • 2
  • 3
  • 4
  • 5
  • tuple
// 元组:固定长度的数组
let c:[string,string,number]
c=["哈哈","哈哈",1] 
  • 1
  • 2
  • 3
  • enum
// 枚举
//性别枚举类
enum sex {
    male,
    female
}
let d:{name:string,sex:sex}
d={
    name:"李磊",
    sex:sex.male
}
alert(d.sex===sex.male) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 别名
//别名
type mytype=string;
let  e:mytype; 
  • 1
  • 2
  • 3

三 编译选项

3.1 自动编译文件

  • 如果直接使用tsc指令,则可以自动将当前项目下的所有ts文件编译为js文件。
  • 但是能直接使用tsc命令的前提时,要先在项目根目录下创建一个ts的配置文件 tsconfig.json
  • tsconfig.json是一个JSON文件,添加配置文件后,只需只需 tsc 命令即可完成对整个项目的编译

3.2 具体配置

{ //指定需要TS编译的文件路径 /**:任意路径 /*:任意文件 "include": ["./编译选项/src/**/*"], //指定不需要TS编译的文件路径  /**:任意路径 /*:任意文件 ,默认路径: "exclude": ["./编译选项/test/**/*","./基本数据类型/**/*"], //继承:配置文件的重复引用 // "extends": "", //具体需要编译的文件 //"files": [], //编译器选项 "compilerOptions": { // target 指定被TS编译的ES版本 "target": "ES3", // module 模块化 "module": "system", // 指定项目需要的库 "lib": ["dom"], // 编译完后的js文件路径 "outDir": "./编译选项/js", // 将代码合并为一个文件 "outFile": "./代码/1.js", // 是否对js文件进行编译 "allowJs": true, // 检查js是否符合规范 "checkJs": false, // 是否移除注释 "removeComments": true, // 不生成编译后的文件 "noEmit": false, // 当有错误时不生编译文件 "noEmitOnError": true, // 是否是严格模式 "alwaysStrict": true, // 是否允许出现隐式的any "noImplicitAny": false, // 是否允许出现隐式的this "noImplicitThis": false, // 严格使用空值 "strictNullChecks": false } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 其他配置:https://www.w3cschool.cn/typescript/typescript-compiler-options.html

四 打包选项

通常情况下,实际开发中我们都需要使用构建工具对代码进行打包;TS同样也可以结合构建工具一起使用,下边以webpack为例介绍一下如何结合构建工具使用TS;

4.1 初始化项目

进入项目根目录,执行命令 npm init -y,创建package.json文件

4.2 下载构建工具

命令如下:

npm i -D webpack webpack-cli webpack-dev-server typescript ts-loader clean-webpack-plugin 
  • 1

共安装了7个包:

  • webpack:构建工具webpack
  • webpack-cli:webpack的命令行工具
  • webpack-dev-server:webpack的开发服务器
  • typescript:ts编译器
  • ts-loader:ts加载器,用于在webpack中编译ts文件
  • html-webpack-plugin:webpack中html插件,用来自动创建html文件
  • clean-webpack-plugin:webpack中的清除插件,每次构建都会先清除目录

4.3 配置TS编译选项

根目录下创建tsconfig.json,配置可以根据自己需要

{ "compilerOptions": { "target": "ES2015", "module": "ES2015", "strict": true } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.4 修改package.json配置

修改package.json添加如下配置

{ ... "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "webpack", "start": "webpack serve --open chrome.exe" }, ... } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4.5 项目使用

在src下创建ts文件,并在并命令行执行npm run build对代码进行编译;

或者执行npm start来启动开发服务器;

4.6 Babel

除了webpack,开发中还经常需要结合babel来对代码进行转换;

以使其可以兼容到更多的浏览器,在上述步骤的基础上,通过以下步骤再将babel引入到项目中;

虽然TS在编译时也支持代码转换,但是只支持简单的代码转换;

对于例如:Promise等ES6特性,TS无法直接转换,这时还要用到babel来做转换;

安装依赖包:

npm i -D @babel/core @babel/preset-env babel-loader core-js 
  • 1

共安装了4个包,分别是:

  • @babel/core:babel的核心工具
  • @babel/preset-env:babel的预定义环境
  • @babel-loader:babel在webpack中的加载器
  • core-js:core-js用来使老版本的浏览器支持新版ES语法

修改webpack.config.js配置文件

...
module: {
    rules: [
        {
            test: /\.ts$/,
            use: [
                {
                    loader: "babel-loader",
                    options:{
                        presets: [
                            [
                                "@babel/preset-env",
                                {
                                    "targets":{
                                        "chrome": "58",
                                        "ie": "11"
                                    },
                                    "corejs":"3",
                                    "useBuiltIns": "usage"
                                }
                            ]
                        ]
                    }
                },
                {
                    loader: "ts-loader",

                }
            ],
            exclude: /node_modules/
        }
    ]
}
... 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

如此一来,使用ts编译后的文件将会再次被babel处理;使得代码可以在大部分浏览器中直接使用;同时可以在配置选项的targets中指定要兼容的浏览器版本;

  • 总结
// 导入包 const path = require("path"); // 导入HTML插件 const HtmlWebpackPlugin = require("html-webpack-plugin"); // 导入清除插件 const { CleanWebpackPlugin } = require("clean-webpack-plugin"); //webpack打包配置文件 module.exports={ // 关闭代码压缩,可选 optimization:{ minimize: false }, //入口 entry: './src/index.ts', //指定打包文件所在目录 output: { //打包文件所在目录 path: path.resolve(__dirname,'dist'), //打包文件名 filename: "bundle.js", // 关闭webpack的箭头函数,可选 environment: { arrowFunction: false // 关闭webpack的箭头函数,可选 } }, //指定打包需要的模块 module: { //规则 rules: [ { // 指定规则生效的文件 test: /\.ts$/, // 要使用的loader加载器 use: [ // 加载器一 { loader: "babel-loader", // 选项 options:{ //预设 presets: [ [ //指定环境插件 "@babel/preset-env", { // 兼容的浏览器信息 "targets":{ "chrome": "58", "ie": "11" }, //  指定corejs版本 "corejs":"3", // 使用core的方法 usage:按需加载 "useBuiltIns": "usage" } ] ] } }, // 加载器二 { loader: "ts-loader", } ] , // 排除的模块 exclude: /node_modules/ } ] }, //配置Html插件 plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ //标题 //title: "小米" // 模板 template: "./src/index.html" }) ], // 用来设置引用模块 resolve: { // 以 js ts 结尾 extensions: ['.js','.ts'] } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90

五 OOP

要想面向对象,操作对象,首先便要拥有对象;

要创建对象,必须要先定义类,所谓的类可以理解为对象的模型;

程序中可以根据类创建指定类型的对象;

举例来说:

可以通过Person类来创建人的对象,通过Dog类创建狗的对象,不同的类可以用来创建不同的对象;

5.1 定义类

class 类名 {
    属性名: 类型;

    constructor(参数: 类型){
        this.属性名 = 参数;
    }

    方法名(){
        ....
    }

} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

示例:

 class Person{
        name: string;
        age: number;

        constructor(name: string, age: number){
            this.name = name;
            this.age = age;
        }

        sayHello(){
            console.log(`大家好,我是${this.name}`);
        }
    } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

使用类:

const p = new Person('孙悟空', 18);
p.sayHello(); 
  • 1
  • 2

5.2 构造函数

可以使用constructor定义一个构造器方法;

注1:在TS中只能有一个构造器方法!

例如:

class C{
    name: string;
    age: number

    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

同时也可以直接将属性定义在构造函数中:

class C {
    constructor(public name: string, public age: number) {
    }
} 
  • 1
  • 2
  • 3
  • 4

上面两种定义方法是完全相同的!

注2:子类继承父类时,必须调用父类的构造方法(如果子类中也定义了构造方法)!

例如:

class A {
    protected num: number;
    constructor(num: number) {
        this.num = num;
    }
}

class X extends A {
    protected name: string;
    constructor(num: number, name: string) {
        super(num);
        this.name = name;
    }
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

如果在X类中不调用super将会报错!

5.3 封装

对象实质上就是属性和方法的容器,它的主要作用就是存储属性和方法,这就是所谓的封装

默认情况下,对象的属性是可以任意的修改的,为了确保数据的安全性,在TS中可以对属性的权限进行设置

  • 静态属性(static):
    • 声明为static的属性或方法不再属于实例,而是属于类的属性;
  • 只读属性(readonly):
    • 如果在声明属性时添加一个readonly,则属性便成了只读属性无法修改
  • TS中属性具有三种修饰符:
    • public(默认值),可以在类、子类和对象中修改
    • protected ,可以在类、子类中修改
    • private ,可以在类中修改

示例:

public:

class Person{
    public name: string; // 写或什么都不写都是public
    public age: number;

    constructor(name: string, age: number){
        this.name = name; // 可以在类中修改
        this.age = age;
    }

    sayHello(){
        console.log(`大家好,我是${this.name}`);
    }
}

class Employee extends Person{
    constructor(name: string, age: number){
        super(name, age);
        this.name = name; //子类中可以修改
    }
}

const p = new Person('孙悟空', 18);
p.name = '猪八戒';// 可以通过对象修改 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

protected:

class Person{ protected name: string; protected age: number; constructor(name: string, age: number){ this.name = name; // 可以修改 this.age = age; } sayHello(){ console.log(`大家好,我是${this.name}`); } } class Employee extends Person{ constructor(name: string, age: number){ super(name, age); this.name = name; //子类中可以修改 } } const p = new Person('孙悟空', 18); p.name = '猪八戒';// 不能修改 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

private:

class Person{ private name: string; private age: number; constructor(name: string, age: number){ this.name = name; // 可以修改 this.age = age; } sayHello(){ console.log(`大家好,我是${this.name}`); } } class Employee extends Person{ constructor(name: string, age: number){ super(name, age); this.name = name; //子类中不能修改 } } const p = new Person('孙悟空', 18); p.name = '猪八戒';// 不能修改 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

5.4 属性存取器

对于一些不希望被任意修改的属性,可以将其设置为private

直接将其设置为private将导致无法再通过对象修改其中的属性

我们可以在类中定义一组读取、设置属性的方法,这种对属性读取或设置的属性被称为属性的存取器

读取属性的方法叫做setter方法,设置属性的方法叫做getter方法

示例:

class Person{ private _name: string; constructor(name: string){ this._name = name; } get name(){ return this._name; } set name(name: string){ this._name = name; } } const p1 = new Person('孙悟空'); // 实际通过调用getter方法读取name属性 console.log(p1.name); // 实际通过调用setter方法修改name属性  p1.name = '猪八戒'; 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

5.5 静态属性

静态属性(方法),也称为类属性。使用静态属性无需创建实例,通过类即可直接使用

静态属性(方法)使用static开头

示例:

class Tools{ static PI = 3.1415926; static sum(num1: number, num2: number){ return num1 + num2 } } console.log(Tools.PI); console.log(Tools.sum(123, 456)); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5.6 this

在类中,使用this表示当前对象

5.7 继承

继承时面向对象中的又一个特性

通过继承可以将其他类中的属性和方法引入到当前类中

示例:

class Animal{ name: string; age: number; constructor(name: string, age: number){ this.name = name; this.age = age; } } class Dog extends Animal{ bark(){ console.log(`${this.name}在汪汪叫!`); } } const dog = new Dog('旺财', 4); dog.bark(); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

通过继承可以在不修改类的情况下完成对类的扩展

5.8 重写

发生继承时,如果子类中的方法会替换掉父类中的同名方法,这就称为方法的重写

示例:

class Animal{ name: string; age: number; constructor(name: string, age: number){ this.name = name; this.age = age; } run(){ console.log(`父类中的run方法!`); } } class Dog extends Animal{ bark(){ console.log(`${this.name}在汪汪叫!`); } run(){ console.log(`子类中的run方法,会重写父类中的run方法!`); } } const dog = new Dog('旺财', 4); dog.bark(); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

在子类中可以使用super来完成对父类的引用

5.9抽象类(abstract class)

抽象类是专门用来被其他类所继承的类,它只能被其他类所继承不能用来创建实例

abstract class Animal{ abstract run(): void; bark(){ console.log('动物在叫~'); } } class Dog extends Animals{ run(){ console.log('狗在跑~'); } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

使用abstract开头的方法叫做抽象方法,抽象方法没有方法体只能定义在抽象类中,继承抽象类时抽象方法必须要实现;

5.10 接口

接口的作用类似于抽象类,不同点在于:接口中的所有方法和属性都是没有实值的,换句话说接口中的所有方法都是抽象方法;

接口主要负责定义一个类的结构,接口可以去限制一个对象的接口:对象只有包含接口中定义的所有属性和方法时才能匹配接口;

同时,可以让一个类去实现接口,实现接口时类中要保护接口中的所有属性;

示例(检查对象类型):

interface Person{ name: string; sayHello():void; } function fn(per: Person){ per.sayHello(); } fn({name:'孙悟空', sayHello() {console.log(`Hello, 我是 ${this.name}`)}}); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

示例(实现):

interface Person{ name: string; sayHello():void; } class Student implements Person{ constructor(public name: string) { } sayHello() { console.log('大家好,我是'+this.name); } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

5.11泛型

定义一个函数或类时,有些情况下无法确定其中要使用的具体类型(返回值、参数、属性的类型不能确定);

此时泛型便能够发挥作用;

举个例子:

function test(arg: any): any{
    return arg;
} 
  • 1
  • 2
  • 3

上例中,test函数有一个参数类型不确定,但是能确定的时其返回值的类型和参数的类型是相同的;

由于类型不确定所以参数和返回值均使用了any,但是很明显这样做是不合适的:

首先使用any会关闭TS的类型检查,其次这样设置也不能体现出参数和返回值是相同的类型;

5.12 泛型函数

5.12.1 创建泛型函数

function test<T>(arg: T): T{
    return arg;
} 
  • 1
  • 2
  • 3

这里的``就是泛型;

T是我们给这个类型起的名字(不一定非叫T),设置泛型后即可在函数中使用T来表示该类型;

所以泛型其实很好理解,就表示某个类型;

那么如何使用上边的函数呢?

5.12.2 使用泛型函数

5.12.3 方式一(直接使用):
test(10) 
  • 1

使用时可以直接传递参数使用,类型会由TS自动推断出来,但有时编译器无法自动推断时还需要使用下面的方式

5.12.4 方式二(指定类型):
test<number>(10) 
  • 1

也可以在函数后手动指定泛型;

5.12.5 函数中声明多个泛型

可以同时指定多个泛型,泛型间使用逗号隔开:

function test<T, K>(a: T, b: K): K{
  return b;
}

test<number, string>(10, "hello"); 
  • 1
  • 2
  • 3
  • 4
  • 5

使用泛型时,完全可以将泛型当成是一个普通的类去使用;

2.12.6 泛型类

类中同样可以使用泛型:

class MyClass<T>{
  prop: T;

  constructor(prop: T){
      this.prop = prop;
  }
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.12.7 泛型继承

除此之外,也可以对泛型的范围进行约束

interface MyInter{
  length: number;
}

function test<T extends MyInter>(arg: T): number{
  return arg.length;
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

使用T extends MyInter表示泛型T必须是MyInter的子类,不一定非要使用接口类和抽象类同样适用;


转自:csdn 论坛 作者:Eason~IT


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


如何通过推广增加网站流量

seo达人

 

  做SEO的朋友都知道网站流量尤为重要,所以对于网站的推广也是非常重要的,网站推广可以增加网站流量是任何seo优化人员都应该考虑的问题,如何推广网站,让流量快速上升?下面就带大家来看一看。

如何通过推广增加网站流量

  1、推广QQ群

  QQ群是聚集大量行业相关员工的最佳场所,其成员比其他社区论坛活跃得多,你只需要成为群的一员,最好是成为群的管理员或一名群主,只有你有权发布你的内容。因此,QQ群推广应该知道如何处理人与人之间的关系,以及如何建立这样的关系。

  可以通过定期交流行业知识或帮助团队成员回答问题来建立权威。

  (1)QQ空间推广。首先你必须有大量的朋友,然后在空间里不断更新行业的技术文章或用户需求,然后你可以在这些文章中推荐你的网站。

  (2)QQ邮件推广,发送的邮件必须是用户感兴趣和需要的内容,标题要有吸引力,内容要简洁,最终的结果是引导用户进入网站。

  2、软文广告

  你需要知道一些写作技巧,结合行业知识和营销知识,让用户在阅读你的文章时输入你的营销理念,引导用户浏览你的网站。

  (1)购买软文,联系管理员在不同行业的网站上购买软文,购买的软文可以由他人书写,也可以自己书写,便于排名。

  (2)A5、CHINAZ等网站的进行投稿,这样会有更多的人会看到并转载文章。

  3、分类信息平台发布

  到目前为止,大部分五金、办公、住宅、机械产品的购买者仍在到分类信息平台寻找销售商,更多的生产商和贸易商也在到分类信息平台发布产品信息。长尾字排名作为公司站长尾字排名很大程度上取决于上面的说法,这样的一方也能给主站带来一些流量和权重。

  4、微博微信推广

  微博和微信是粉丝的生态,所以推广微博和微信的前提是增加大量的朋友和行业相关人士,他们是为了好玩而分享,如果你的内容不是很搞笑,广告效果就不是很好。

  美图、服装、旅游、食品、化妆品、互联网等行业适合在微博推广,机械、化工等行业则不适合。

 

作者:曦曦SEO来源:成都seo

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

 

 

如何优化软文本链的发布?

seo达人

 

 

要想快速提高网站的流量和优化效果,需要多方面的合作,其中外部环节不可忽视。外链分为多种形式,哪一种比较好,那么如何释放软文本的外链呢?现在让我们来看看。

1、 软文外链释放技巧

所谓优化网站进行软文链发布,必须发布一些内容和网站本身比较大,关键词匹配的主题链接URL,搜索引擎近对用户体验度的要求越来越高,所以要注意网站内容与网站本身的相关性。

发布软链接要根据关键词写原创文章,这样的链接更有利于百度抓取,只有软链接地址收录网站本身带来的好处更多,所以本文包含的直接方法,就是发布原文。

在软文连锁发布中,要注意软文外链平台。如果我们要找的平台是垃圾链,不仅不能给网站带来流量,更有可能受到搜索引擎的惩罚,那么我们必须选择一个正规的平台。

2、 软件链发布过程

通过一定的渠道找到合适的软发布平台,大致可以分为以下几种类型:软件论坛、站长论坛、贴吧、博客和高质软文本发布平台。要针对不同类型的网站选择不同的软件发布平台进行文章发布。

外链软文,必须写外链软文,那么外链软文标题应该写哪个方面比较好?我们可以根据长尾关键词来确定软文标题,SEO优化写这篇文章有点难度,当然,我们也可以从百度下拉框、相关竞争对手的网站、追逐工具中寻找用户需求,比如长尾词、时间、文章结构、编辑写用户需求自由度等,推广我们的网络品牌,用户需求自由。

当我们发布软文本链接时,首先要确保发布的外部链接的内容是搜索引擎的,并且文字要恰当。我们发布软文链是为了让搜索引擎快速收录,做给网站自身带来更快的好处。一般来说,一篇好文章就是副标题。字数由频道的性质决定。排字很好。在文章的前面加上你网站的品牌词,在文章底部加上一个链接。

文章来源:优帮云SEO 

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

如何快速增加百度收录量,跟我学!

seo达人

 

增加百度收录可以说是SEO从业人员最为关注的一个问题,甚至很多公司把百度收录作为业绩指标,所以如何增加百度收录就成了SEO最热门的话题。

如何增加百度收录

随着今年百度搜索机制的改进完善,尤其是近两年接连发布算法,很多网站的收录量几乎停滞不前,那么到底如何增加百度收录量呢,刘少庆今天跟大家聊聊这个话题。

刘少庆从新网站和老网站的角度进行分析,两者之前可能存在一些相同之处,鉴于大家各取所需,所以该罗嗦的地方小编还是会罗嗦。

一、新网站

周所周助,新网站在百度存在着一个考察期(虽无正式文件说明,但已是共识),通常情况下,新网站的首页会在一周内被百度收录,快点的当天或隔天。但是对于内容则需要较长的时间才能放出,已经抓取但是没有放出,从最表面上看,可以理解为没有被收录。

那么新网站如何增加百度收录呢?小编认为对于新网站来说,内容是关键,前期应该尽可能的创造原创内容,目的是给百度留下好印象,这能够缩短考察期。

另外,可以使用百度官方提供的一些工具,比如说百度熊掌号。关于全新网站如何增加百度收录小编建议大家详细阅读这两篇文章:新网站如何加快页面收录,百度熊掌号是否能提升收录,里面解说得比较详细。

本站上线时间为4月15号,正是开放robots是20号,目前共计收录40篇。截止昨天本站总文章数为60篇,已经被收录40篇。由于其他原因无法提交到百度熊掌号,所以没有享受到优先抓取待遇。当然,因为原创难度相对较大,本站每天产生的内容少,所以从整站的收录量看,百度收录得并不多。

有人会说,百度的工具都是做样子的,提交了也不一定会收录!小编这里要说两点:一是不要听别人说,自己去试试才能知道真假;二是把内容做好,不要想着蒙混过关。

总之,新网站要增加百度收录也不是不可能的,关键是怎么操作。

二、老网站

老网站因为有了一定的内容基础,所以要增加百度收录的方式也就多一些,下面从几个方面来具体说说老网站如何增加百度收录。

① 创造新内容增加百度收录

这点对于新网站还是老网站都是可行的。如果可能,尽量生产原创内容,最起码也得经过整合加工处理。

② 处理没有收录过的页面

对于老网站而言,总有些页面是没有被百度收录的,我们可以对这些页面采取措施,让他们尽可能多的被收录。

如何做呢,方法包括且不限于提交链接、增加内链、增加外链等。

③ 设置tag聚合页,生产更多内容

这原本可以归在第一点里,但为了让大家看的更清晰,所以单独列出来。

对于已经有内容基础的网站来说,设置tag页无疑是增加页面收录最好的方式之一,因为tag页面本身就是高质量页面,容易被收录,同时还能带动标签下的文章,增加文章页的收录量。

④ 提升权重

高权重的网站所产生的内容更容易被百度收录,这是不争的事实,所以,想要增加百度收录,提升权重便是手段之一。

那么如何提高权重以达到增加收录的目的呢,事实上前面提到的各种操作对网站权重的提升都有帮助,除此之外,还可以通过交换友情链接来提升。

⑤ 内链

内链对应新网站和老网站同样适用,但因为老网站本身有了内容基础,所以如果能妥善操作的话,作用更明显。

为什么说内链建设能增加百度收录呢,原因有三:一是内链可以提高目标页面的权重;二是能够为目标页面提供链接入口;三是合理的内链能够提高整站权重。

如何操作内链,在网站内链怎么做一文中有详细解说,大家不妨移步看看。

⑥ 利用百度工具

比如提交sitemap,提交熊掌号等,这里不过多罗嗦。

最后,以上就是如何快速增加百度收录量的解决方法,从新网站和老网站两个大的方面说了说如何增加百度收录,其实很多方面都是相通的,都可以使用。

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

网站如何才能被百度收录

seo达人

 

百度的搜索排名是有一定规律的,排名的高低和网站质量,知名度,用户体验等诸多方面有关系,这些技术百度是不会公布出来的,但是要获取好的排名,首先要解决的是网站如何被百度收录,更多的页被百度收录,一个新的网站想被百度收录,可以通过提交到百度即可。

一、新网站如何提交到百度呢?

百度有一个新站点提交地址:https://ziyuan.baidu.com/linksubmit/url ,直接在这里输入的你域名提交即可,一般来说只要网站合法基本都会在一定时间内收录。

如果想加快这个收录时间,可以和一些已经被百度收录的同行交换一下友情链接。

二、被收录后通过网站名称一般就可以搜索到网站,但是一个关键词基本没有排名,所以要继续按下面的工作来做才能保证有一个很好的排名。

1.jpg

1、持续的发布网站外链

1.1、在发帖的时候需要找一些权重比较高的论坛或者是贴吧,不要直接发布广告,也不要在帖子里面有太多关键词锚文本,只需要在最后出现链接地址或者是锚文本就差不多了。

1.2、问答需要找和百度有合作的问答网站,例如天涯、百度问答等等,然后寻找和网站主题类似的问题进行回答,一定要认真仔细的回答,回答完之后在最后留下链接就可以了。

1.3、软文是非常好的提升网站收录信息以及快照的办法,软文必须要原创,并且需要是技术类的文章,软文内容要确保真实性,不要瞎编乱造就可以了。

1.4、友情链接交互平台也能够让搜索引擎蜘蛛来爬行,因此可以找权重比较高的友情链接交换平台提交网站的关键词以及网址。

2、保持网站持续更新

2.1、网站的内容一定要有非常高的原创性,并且尽可能进行手动更新,一个字一个字的打上去。建议不要使用伪原创工具,因为现在百度对此非常的敏感,能够按照语句的顺序来判断你是不是用了伪原创工具。与此同时,不要存在侥幸的心里,就算伪原创被百度收录了,百度还是会根据它的判断原则来评判内容的原创性,然后给出一定的权重,不是说被收录了就等于认可你的内容是原创。

2.2、在内容当中不能有非法信息和字符,禁词就更加不能有了。通常这些非法信息都会被搜索引擎过滤掉,但是如果百度发现你的网站里面有会发信息,那么就会影响到对你整个网站的判断,也就是要面临降权,而且这些犯错记录都会被记录下来,超过最高极限之后就会被k。

2.3、内容当中不能有大量的关键词或者是链接地址,但是适当的加入关键词或者是链接地址却是搜索引擎比较喜欢的。因为这样不但能够提升网络战的权重,而且还会加快搜索引擎抓取页面的速度,建议一篇内容出现3-5个关键词就可以了。

所以,想要让网站内容快速被收录的话,以上的这些事项一定要做好,这样坚持下去,才能达到好的效果。

文章来源:pageadmin

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

 

图标设计落地全方位指南

之晨

如期而至,这是标签栏控件总结的第二期。这一期真是掏空职业经验,希望对你的工作有所帮助。

掏空家底!图标设计落地全方位指南

这一期我们来聊一聊标签栏中的关键元素——图标。

图标其实存在于界面中的许多地方,但因为这一期主要分析标签栏,所以我会借标签栏中较主流的图标样式,总结一套图标制作与落地方法。这些方法在图标制作过程中都是相通的,大家可以举一反三。

掏空家底!图标设计落地全方位指南

标签栏图标规范

1. 图标样式

图标具体样式风格的定义是非常主观的,网络上也流传着许多的教程教大家如何设计五花八门的图标,所以在这里我就不再赘述了。我主要来总结一下基础的标签栏图标一般有哪些样式变化。

我调研了诸多的应用程序,发现主流的 APP 标签栏样式变化,大致分为以下五种。其中占比最多的是「由线型转面型」。

掏空家底!图标设计落地全方位指南

调研的应用程序中,所有使用到线性图标的应用程序,都将描边粗细限制在 1pt-2pt 之间。

掏空家底!图标设计落地全方位指南

2. 图标视觉大小

上一期我们讲到,iOS 定义了一套标签栏图标的尺寸规范。

掏空家底!图标设计落地全方位指南

iOS 在这里所定义的尺寸并不是图标文件最后输出的尺寸,而是给设计师作图时,针对不同图标形状的参考尺寸,目的是为了让图标的视觉大小看上去一致。

那么为什么 iOS 会根据不同的图标形状给出不同的图标尺寸呢?因为 50px×50px 的正方形比 50px×50px 的圆形面积更大,所以正方形的视觉大小也会大于圆形。为了统一图标的视觉大小,正方形要做适当的面积收缩处理。(矩形同理)

掏空家底!图标设计落地全方位指南

于是我们看到许多平台都推出了图标辅助网格规范 ¹。其实如果遵从「面积相等」原理,理论上所有的图标网格都应该由下面这一套推理公式得出(以Material Design 标准图标网格为例):

掏空家底!图标设计落地全方位指南

但实际情况是,不同平台的图标辅助网格规范建议尺寸都有一定的差异。原因就在于,虽然有时候我们参考「面积相等」原则对图标视觉尺寸进行了规范,但项目落地后发现视觉上可能还是有一些不协调,所以最终设计师还是会凭借自己的主观判断再进行微调。

记住:好的设计作品是理性的设计理论与设计师本身感性的碰撞结果,二者缺一不可。

3. 图标输出尺寸

iOS 规定标签栏图标的输出尺寸统一为 31pt×28pt;Material Design 规定标签栏图标的输出尺寸统一为 24dp×24dp。

但我们发现,在借助了图标网格解决了图标视觉大小的问题之后,每一个不同形状的图标,尺寸其实是不同的。为了方便前端落地,我们在输出切图文件时,要保持每一个图标文件的输出尺寸是相同的。该怎么办呢?

于是我们将一组图标都放置在一个比图标本身略大的相同尺寸容器中。而图标与这个容器之间的空白像素,正好也帮助我们规避了图标落地后,切图边缘像素可能被截断的现象发生,所以我们称这个区域为「安全边距」。

掏空家底!图标设计落地全方位指南

对于安全边距的规定:Material Design 全平台规定图标的安全间距统一 2dp;iOS 则根据不同的图标使用场景给出的不同的图标网格和图标安全间距 2。

静态图标

标签栏的图标一般分为静态图标和动态图标两种。

静态图标的实现方法相对容易,可以与前端沟通确定本次项目交付的标签栏图标文件是采用位图还是矢量图。如果是位图建议交付 .png 格式文件;如果是矢量图建议交付 .svg 格式文件。

1. 位图图标

使用位图时请注意以下两点:

不同项目环境输出的切图套数不同

  • 交付 iOS 原生的标签栏图标切图需要 @1x/@2x/@3x 三种倍率的切图文件;
  • 交付 Android 原生的标签栏图标切图需要 @1.5x/@2x/@3x/@4x 四种倍率的切图文件(@0.75x 和 @1x 切图层分别用于 ldpi 和 mdpi 分辨率设备,但这些设备现在几乎已退出市场,所以可不考虑,但最终视项目真实需求确定。);
  • 交付 web 项目的切图需要试情况而定,一般常用 @2x 切图,因为 @2x 向下适配 @1x、向上适配 @3x,都不会产生太大的图片失真。但有时候前端小哥会要求用到其他倍率切图,所以最终以具体需求而定。

请注意:这里我所提到的倍率全都是「绝对倍率」,这个概念非常关键。

「绝对倍率」指的是:以上所有的倍率都是针对 @1x 设计稿下的输出倍率尺寸。而当你使用 @2x 作图时,为了保证「绝对倍率」不变,你的切图输出倍率就应该设置为 @0.5x/@1x/@1.5x 。

如果你在 @2x下作图,却依然保持输出 @1x/@2x/@3x 的切图,那你输出的文件尺寸最终其实是 @2x/@4x/@6x。

有一点绕的话,我们以 Sketch 导出位图切图为例:

掏空家底!图标设计落地全方位指南

所以如果你日常使用的是 Sketch,也是用 Sketch 原生导出工具,那你的切图预设应该根据你的作图尺寸而定,见下表:

掏空家底!图标设计落地全方位指南

如果你日常使用的是 PS,用 Cutterman 切图,那么 Cutterman 会自动识别你当前的画板,然后根据它的宽(横屏情况下是高)来设定它的基准分辨率。那么你在任何情况下输出 @1x/@2x/@3x 的切图,其实都是「绝对倍率」,不用像 Sketch 当中一样换算。前提是「设置当前画布为:Auto(自动识别)」。

掏空家底!图标设计落地全方位指南

假设你在 @2x 下作图,执意不管不顾「绝对倍率」,又忘了交代前端人员手动处理切图尺寸的话,那你所有的切图尺寸实际都是设计稿所需图标尺寸的2倍。就算前端小哥帮你手动处理了切图尺寸,每一张切图所包含的像素信息,都比项目真实所需的要多很多,完全就是在徒增所需切图文件的大小。

注意切图文件大小

切记,公司的线上项目中,用户从服务器下载的每一单位的流量都是要公司花钱的,所以许多项目管理者都是很在意控制线上文件大小的。于是压缩切图是 UI 必备的技能之一。

虽然图标的文件大小一般只有几 KB,但是项目大了难免积少成多,所以在真实项目中,不管任何切图我都会手动压缩一次。

这里推荐一个压缩 .png 文件大小,但几乎不会产生失真的免费网站 tinypng³(是我曾经深爱的一位前端小哥推荐给我的,在此表示感谢)。

掏空家底!图标设计落地全方位指南

2. 矢量图

位图切图会面临交付的倍率图过多、容易失真、文件大小难控制等问题,但对于矢量图,这些问题都得到了解决。目前.svg矢量图落地也在项目中越来越流行了。UI 可以在 Sketch 或 Ai 中制作。

一般与前端人员对接有在线图标库对接与本地文件对接两种。

在线矢量图标库有很多,国内比较流行的是阿里巴巴矢量图标库-iconfont⁴;本地对接就是直接将文件发送给前端人员,他们会自行进行项目文件的管理与调用。

如果 .svg 切图输出后,与设计稿中样式不符,请注意排查以下三点:

svg 不支持渐变颜色填充;

  • svg 不支持描边,请将所有的描边轮廓化。Sketch 中可通过「图层-轮廓化」;AI 中可通过「对象-路径-轮廓化描边」;
  • 要确保一组图标的文件尺寸一致,需在图标下方增加一个透明方形,和图标一同导出。

掏空家底!图标设计落地全方位指南

动态图标

为了提升用户体验和产品趣味性,动效微交互的标签栏图标也越来越流行了。

掏空家底!图标设计落地全方位指南

动效在前端落地的方法其实有很多:

  • 前端代码直接实现:代码是很强大的,但通常用代码直接写复杂动效会很浪费项目时间。简单维度的动效如位移、透明度、大小变化等可以借助代码,但复杂动效就不要去打扰前端小哥了;
  • 直接刚 gif:这已经是老旧技术时代的动画解决方案了,文件大且请求文件也需要时间,有时候无法给用户及时的触控反馈。再者它是位图的原因,在高分辨率屏幕上缩放容易失真。
  • png 序列帧:我们知道,动画是一张一张的静态图交替变化形成的。如果将每一帧动画都拆分成一张图片,就有了 png 序列帧。所以一套动画的 png 序列帧往往非常多,文件大小自然就变大了。所以后来也有团队引进了雪碧图的方式,但文件大小依然不乐观。并且同样是位图的原因,高分辨率屏幕容易失真。
  • Facebook Pop/Rebound/Keyframes/Facebook Pop/Rebound 是 Facebook 给 iOS 和 Android 提供的常用动画预设,是较早将动效代码化的开源技术方案,但动画效果预设只有弹簧/衰减等一些简单样式。后来 Facebook 又推出了 Keyframes,允许设计师自己在 Ae 中自定义动画并导出,然后交付给前端人员。
  • Lottie 动画:和 Facebook Keyframes 相同,都是结合 Ae 输出动画代码。但是 Lottie 更厉害的地方在于,它比起 Facebook Keyframes 来支持的 Ae 样式更多,例如蒙版、遮罩、修剪路径等等。

所以综上所述,落地标签栏动态图标,目前最高效可行的还是 Lottie 动画。

1. Lottie的背景

Lottie 是 Airbnb 开源的一个跨平台动画库。表现层面它是一张图片,但实现的方式是通过代码,所以它是矢量的。很花式的动画也可以把文件大小做到非常小。

UI 与前端对接是通过交付一个 json 代码文件。

如果这是你第一次接触 Lottie,再好不过的体验方法就是玩一玩阿里提供的一站式动画平台:犸良动画 5。它最底层采用的技术就是 Lottie,只是被阿里二次封装了许多预设的动画效果,你可以自定义其中的元素与参数,然后试着导出你的第一个 json 文件。

2. Lottie如何上手

接下来是简单粗暴的 UI 与前端对接实现 Lottie 动画落地的全步骤参考。在此之前,想要全方位了解 Lottie 的相关信息,请参阅 Lottie 官方说明文档 6。

步骤一:安装 Ae 和 bodymovin

制作 Lottie 动画,首先你必需两个工具:Ae 和 bodymovin 插件。

Ae 最低版本要求为 Ae CC2014。又因为据很多设计师反馈,目前 bodymovin 在汉化后的 Ae 中使用会出现诸多问题,所以后面的教程都是基于 Ae 英文版。如果你汉化了Ae,最好在需要制作 Lottie 动画时取消汉化。

然后获取 bodymovin7。bodymovin 插件更新至今,版本已非常多,并不一定最新版就适用于你当前的项目,因为前端使用的 bodymovin 解析包可能无法解析你用最新版 bodymovin 插件输出的 json 文件。

掏空家底!图标设计落地全方位指南

一旦确定使用 Lottie,前端人员会在 GitHub 查询 Lottie 相关文档的,所以 UI 只需要配合前端确定一下合适的 bodymovin 插件版本就可以了。最终走查时,一定要确保当前 bodymovin 输出的动画在项目所需要运行的所有环境中可运行,才说明 UI 使用的 bodymovin 插件和前端使用的 bodymovin 解析包版本是兼容的。

获取了 bodymovin 后,将 bodymovin 拖入到 ZXP Installer8 中,ZXP Installer 会自动识别插件安装到 Ae。

掏空家底!图标设计落地全方位指南

安装完成后,就可以在 AE 的「窗口-扩展」中看到 bodymovin 啦。

掏空家底!图标设计落地全方位指南

步骤二:将 Sketch 或 Ai 中的文件导入 Ae

如果你技术娴熟,当然也可以直接在 Ae 中绘制图案动画。但如果你还是习惯先在其他软件中绘制好基础图案,再到 Ae 中制作动画,那你需要了解如何将图案导入 Ae。

Ai 和 Ae 都是 Adobe 旗下的工具,所以 Ae 是可以完美解析 .ai 文件的,如果你是使用 Ai 作图,可直接存储为 .ai 文件,再在 Ae 中打开。

掏空家底!图标设计落地全方位指南

如果你使用的是 Sketch,可以先导出为 .svg,再用 Ai 打开该 .svg 文件,转换存储格式为 .ai,最后到 Ae 中打开。

当然,Sketch 还有直接和 Ae 对接的插件,AEUX(前身 Sketch2AE)9。需要在 Sketch 和 Ae 中同时安装 AEUX 插件,Sketch 负责传送,Ae 负责接收。具体的使用方法可以在官网教程中查看,我就不再赘述了。

掏空家底!图标设计落地全方位指南

步骤三:制作动效并输出

和静态图标同理,为了保证落地时图标视觉大小一致,一组动效图标输出的文件尺寸应该是相同的。所以在你制作动画之前需要确定合成文件的尺寸。Lottie 官方建议:因为 Lottie 输出的是矢量动画,所以建议以 @1x 输出动效,前端人员在任何屏幕上放大并不会失真。

掏空家底!图标设计落地全方位指南

在制作之前请务必详细阅读 Lottie 所支持的 Ae 参数文档10,以免辛苦做出的动效,前端无法解析。特别提醒:原生环境中 bodymovin 是不支持解析 Ae 表达式的。

完成制作动效后,就可以通过 bodymovin 导出动效了。

掏空家底!图标设计落地全方位指南

步骤四:预览与交付

导出完成后在你的目的地文件夹中将存在一个 .json 文档,如果你的动效中还使用了位图,系统还会自动生成一个 images 文件夹。这些都是你需要交付给与你对接的前端开发人员的文件。

掏空家底!图标设计落地全方位指南

.json 文件中记录的动效代码 UI 不需要过多关心,但是其中两个信息你是一定要了解的。它们是你与前端对接沟通和获悉文件信息的一些关键参数。

掏空家底!图标设计落地全方位指南

UI 自检动效或其他相关人员需要预览动效的时候,可以用 LottieFiles11,拖入 .json 文件即可预览。iOS 和 Android 还可以下载 LottieFiles APP,扫描预览页中的二维码即可在移动端预览。

掏空家底!图标设计落地全方位指南

总结

整个制作图标的流程我已经全部整理出来了。首先要注意图标的规范,然后制作位图、矢量、动效图标时的注意点,我几乎把我在真实项目中踩过的坑都告诉大家了。剩下的创造性的环节就交给你了。


文章来源:优设网     作者:UCD耍家


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


日历

链接

个人资料

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

存档