首页

设计师要懂的用户习惯

鹤鹤


前言:


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


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


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



什么是用户习惯?


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

 

所以,习惯有两大特点:


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


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



试想,我们在使用 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界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务


信息图形中的颜色探讨—面向色盲人士友好的设计解决方案

涛涛

颜色可以用来区分信息图形上的数据类别和维度,是数据可视化中最常用的视觉变量之一。然而,世界上有超过8%的男性和0.4%的女性都被色觉障碍的问题困扰——他们在识别部分或者全部颜色时有困难。我们通常笼统的称这类人群为“色盲(Color Blindness)”(也称为道尔顿症、色觉缺失、色觉辨认障碍、色弱等)。面对如此庞大的特殊受众,设计师理应关注他们的需求。信息图形设计本是以向用户传递精准数据为目标,也不能忽视了这部分群体。

一. 了解色盲
“色盲能看到颜色吗?”“他们只能看到黑、白吗?”——人们常误以为色盲视觉所见的景象只有灰阶分布,其实不是的。色盲并不意味着色觉的完全丧失,而是指部分色觉受损,因此无法正确感知和分辨某些区域的颜色。色盲可以分为:红色盲(P)、绿色盲(D)、蓝色盲(T)和全色盲。其中红色盲和绿色盲最为普遍,合称为红绿色盲。全球大约2亿人都患有色盲,它的普遍程度甚至高于AB血型的人群。下面我们感性的看看色盲人眼中的世界:
 

从上面模拟色盲色觉的图片来看,我们可以感受到色盲人士能够辨识的色相较为有限。红色盲和绿色盲的色觉较为近似。由于红绿色盲人数占到了色盲总数的99%,我们需要更多地理解他们能看到的颜色。以下列举了红绿色盲容易混淆的颜色,以及色觉上的一些规律:

   1 ) 红绿色盲难以分辨两种差别只在红色或绿色元素的颜色。如红色和绿色;蓝色和紫色(蓝+红);绿色和棕色;红色和棕色等。

2 ) 红绿色盲人士对蓝色更为敏感。举例来说,他们会把红色和绿色、或黄色和黄绿色混淆,但却能清楚的分辨绿色和蓝绿色(翠绿色)。

3 ) 红绿色盲眼中的红色并不是一种明亮醒目的颜色。相反红色对他们来说显得非常深,而暗红色则几乎接近黑色。因此色盲人士很难分辨出文章内的深红色强调字

4 ) 虽然色盲人士对色相的辨识能力较弱,但却对明度、饱和度非常敏感。

5 ) 相比高饱和度的颜色,低饱和度的颜色更难辨认。如天蓝色和粉红色。

 

也许以上的分析还是太抽象,为了更直观的看到色盲人士眼中的颜色,下面介绍几种模拟色盲色觉的工具,方便设计师们设计和检验:

Adobe自带的校样设置

Photoshop CS4和Illustrator CS4及以上版本提供了模拟红色盲和绿色盲的校样设置,对于每天都在Photoshop/Illustrator中拼搏的视觉设计师来说,这是最简便的一种方法了。选择“视图—校样设置—红色盲型/绿色盲型”

 Color Oracle:http://colororacle.org/

 网站Color Blind Web Page Filter:http://colorfilter.wickline.org/

 

二.设计解决方案

设计面向色盲人士友好的信息图形,并不意味着要设计师要放弃使用色彩这种“利器”。即便是对色觉障碍的人士来说,颜色依然是区分不同类数据的一种简单快速的表现形式。要提高信息图形的识别性和易读性,我们可以遵循这样几个思路寻找解决方案:(1)不完全依赖颜色来区分信息,同时使用多种视觉变量来编码信息;(2)选择安全的配色方案;(3)使用文字注解。

1.冗余编码

避免仅使用颜色来编码信息,应尽量同时使用多种视觉变量(如形状+颜色、尺寸+颜色、注释+颜色)来对信息编码。其中,形状包括了这样一些可使用的元素:圆形、三角形、矩形等;实线、虚线、点线等;字母、数字符号等。这里需遵循的一个原则是:使用尽可能少的颜色——结合使用不同形状符号和少量鲜艳的颜色,效果远好于只使用一种形状和多种颜色。

 

 
2.选择适当的配色
针对色盲人士的颜色识别能力,需要精心选择配色,才能避免选择容易混淆的色区。然而,要使配色能覆盖到各种色觉辨认能力的人(包括色盲、色弱和色觉正常的人群)并不是一件容易的事,尤其同一界面需要出现多种颜色时,让设计师非常头疼。日本有研究得出一组无障碍配色建议,在此分享,供大家参考。这组颜色针对色盲和非色盲人士都是易辨识的(例如它选择了朱红色代替红色,蓝绿色代替绿色,紫红色代替紫色,以减少色盲人士的困扰),它对屏显和印刷都适用,并且所有颜色的名称也容易定义。

 

需要注意的是,从以上配色组中选取颜色时:A. 请交替使用暖色和冷色;B. 当使用多个暖色和多个冷色时,在明度和饱和度上做出区别; C. 避免同时使用低饱和度和低明度的组合。
另外分享两个配色工具,它们都提供了针对色盲人士配色的选项,可以辅助大家进行配色:
网站CONTRAST-A-WEB V2.0 http://www.dasplankton.de/ContrastA/(打开“show color deficiency simulation”面板)
地图配色工具COLOR BREWER 2.0 http://colorbrewer2.org/(勾选“colorblind safe”选项)

 

三、举例

下面以几种常用信息图形为例,来说明如何为色盲用户优化信息图:

1)点状图

 

优化采用了这样一些手段:A.调整配色,将色盲人士容易混淆的红、绿、橙色换为红、蓝、黄色。B.调整明度,使图中几个颜色在明度上差异更明显。C.为不同元素赋予不同形状。所有使用点元素的信息图,都可以参考这种解决方式。

2)折线图

 

优化采用了这样一些手段:A.采用更粗的线条,使颜色更明显。(色块越小,颜色越难分辨。对有色觉障碍的人来说,带颜色的细线、小图标、细体文字尤其难区分。)B.换用不同形状的线条(实线、虚线、点线)。C.文字直接注释在线的周围。D.颜色微调。这样对每一类数据使用多重可视化变量进行编码后,即便颜色信息完全丢失,也能够完整的传递信息。所有使用线元素的信息图,都可以参考这种解决方式。

3)柱状图

 

通过增加底纹,直接标注文字注释的方式优化了柱状图。所有使用面的图形(如饼图),都可以参考这种解决方式。

 

四.写在最后

在实际设计过程中,我们不一定会同时使用到以上所有手段,需要在美观和友好之间进行权衡。我们也可以采用一些交互手段,避免同一界面中元素太多太过杂乱的问题。如highcharts这个趋势图非常优秀,它采用了易辨识的颜色,每个节点处都使用了不同形状的符号,然而仅当鼠标hover到具体节点时,会出现该条线对应的信息(“New York”)。

 

另外除了鼠标hover的交互方式以外,我们甚至也可以为色盲人士提供单独的色盲模式切换,这样也可以兼顾视觉上的美观,避免了太多信息的干扰。这种形式在游戏和软件中也有先例。例如iChat,一般情况下仅有不同颜色来区别用户的在线状态,但同时,它也提供了“User shapes to indicate status”选项,可以将“空闲”状态换成橙黄色三角形符号,将“忙”状态换成红色方形符号表示。

 



文章来源:腾讯CDC  作者:pearlfu


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


产业互联网下的B端市场再认识

涛涛

编辑导语:新基建的支持,持续利好的政策,再加上互联网红利正在逐渐向供给侧转移……诸多因素都在推动着产业互联网的发展。B端市场俨然已经成为产业互联网的代名词,尽管如此,B端市场仍然需要深度改造,我们要认清其独特性,把握B端时代的发展规律,赢得发展红利。


毋庸置疑的是,产业互联网绝对是当前的热点。无论是头部的互联网巨头,还是新入局的玩家,几乎都想要通过加持产业互联网的概念来投身到全新的风口里。

的确,在C端流量的争夺已然成为红海的大背景下,将目光转移到B端市场,我们将会发现一片充满了机会的蓝海。于是,习惯了跟随风口的人们,开始将目光投向B端市场,并且开始用自身的实践来寻找着挖掘风口的全新方式和方法。

在很多时候,B端市场,俨然成为产业互联网的代名词。

尽管B端市场的确有着非常庞大的市场潜能,并且B端市场确实需要被深度改造,但是,同仅仅只是以搭建平台和中心为代表经典互联网模式不同,B端市场或许需要投入更大的精力,或许需要建构新的商业模式,才能真正见到效果。

纵然是那些处于头部的互联网巨头,依然需要投入很多,才能在赋能和改造B端的命题上有所建树。简单来讲,B端时代是一个比C端时代的险滩暗流更多的时代。这是B端时代虽然成为一种趋势,但却一直都无法获得突破性发展的根本原因。

说到底,B端市场是一个与C端完全不一样的市场。

简单地套用C端市场的打法并不能够奏效,甚至还会失去绝佳的窗口期。找到真正适合B端时代的商业模式,并且真正能够用这套商业模式解决互联网时代无法解决的痛点和难题,或许才是B端时代的玩家们真正应该思考的关键问题。

我们都知道,在C端时代,互联网平台通常是用烧钱和补贴的方式来改变C端用户的习惯,而后再对C端用户进行收割。在这个过程当中,玩家们仅仅只是需要将平台尽可能做大即可,等到C端用户的行为和习惯改变之后,他们就可以发挥业已形成的规模效应,实现盈利。

同C端时代的商业模式不同,B端时代是一次全新的旅程,我们只有认清了它的独特性,才能真正把握B端时代的发展规律,最终赢得发展红利。

一、B端时代不一定要做大,但一定要做深

相对于C端时代动辄千万级别,甚至亿级的用户量不同,在B端时代,用户的量级会大大减少。纵然是头部的平台,它们所服务的用户都无法达到C端时代的量级。

因此,仅仅只是将目光聚焦在用户的量级上,试图通过规模效益来实现自身的发展,很显然是不对的。这是B端时代来临之后,人们简单地套用C端时代的发展模式,却一直都无法奏效的根本原因。

同C端时代一定要做大不同,在B端时代,更加考验玩家的是,是否能够做深,是否能够对一个B端玩家从头到尾进行方方面面的赋能,彻彻底底的改造。

如果一个玩家可以对一个B端用户从始至终都进行深入而又全面地改造,并且真正可以给B端用户带来本质性的变化。那么,这个玩家或许才算是真正掌握了B端时代发展的精髓。

这就需要B端时代的玩家拥有较为庞大的综合实力。他们不仅要能上九天揽月,还要能够下五洋捉鳖。由此可见,在B端时代,仅仅只是依靠概念和营销是难以实现持续发展的,只有真正成为一个多面手,真正能够给B端用户带来真正的改变,才能让B端用户买单。

如何扎根到某一个行业当中,把某个行业的内在流程和环节摸清弄透,做B端用户的“万金油”,才是确保一个B端时代的玩家可以长久发展的关键所在。所以,在B端时代,不一定要做到像C端时代那样的量级,但是,一定要比C端时代做得更深,更透才行。

二、B端时代不一定要做平台,但一定要做中台

互联网思维的深度影响让玩家们简单地认为,在B端时代,只需要搭建一个平台,再把B端用户聚拢在这个平台上,就可以自然而然地进入到B端时代。事实证明,在B端时代,我们真正缺少的不是撮合和中介,而是赋能和改造。

在这个大背景下,互联网时代的平台和中心的概念已经不那么重要了,如何对B端用户进行深度而又全面地赋能,如何深入到B端行业的方方面面,才是保证B端玩家真正把握风口的关键所在。

从这个角度来看,在B端时代,人们真正需要的或许并不是一个平台,而是一个中台。

同平台仅仅只是一手联通着上游的生产端,一手联通着下游的消费端不同。中台更像是一个深入到生产端和消费端的细枝末节的强大的根系,它不仅要承担联通的角色,而且还要承担输送营养和能量,改造B端角色。

可见,我们再去用平台的概念来实践B端时代的发展,依然无法真正把握B端时代的精髓,仅仅只能变成落后的B端玩家倾销传统、原始库存产品的场所,而无法成为升级、转型B端行业的助推器和营养基。

在B端时代来临早期阶段,我们看到的诸多以销售为主导的赋能方式和方法,无论是社交电商,还是社交新零售基本上都是基于平台思维出现的,而后来的发展同样告诉我们,这种平台思维无法真正奏效,以中台代替平台,才能真正把握B端时代的发展红利。

三、B端时代不一定要封闭,但一定要开放

在C端时代,我们更多地看到的是你强我弱的零和游戏,即一方的强大,一定是以另外一方的弱势为基础的。这是互联网平台之所以会不断建构属于自身的生态系统,不断进行流量的争夺,并且逐渐走向封闭和垄断的根本原因。虽然这套模式在C端时代非常奏效。

但是,等到B端时代来临,我们再去用这样一种封闭的、独立的生态系统式的模式发展的时候,便会开始遭遇越来越多的困境和难题。

因此,在B端时代,我们并不一定要建构一个封闭的、独立的生态系统,而是要打破自身的局限,不断破圈才能获得更大的发展空间。当下,我们看到越来越多地互联网平台开始破圈,打破原有的生态圈的概念,正是这种现象的直接体现。

B站在破圈,快手在破圈,阿里在破圈,微信也在破圈。这说明,在B端时代,不同的生态体和平台之间同样需要不断联通,才能真正给B端产业带来改变,一味地封闭,不仅无法获得发展,甚至还将会走入到死胡同里。

在B端时代,一定要开放,一定要协同。当我们不断打破原有的圈层限制,当我们不断开启新的发展的时候,不同中心之间的协同给B端行业带来的改变才能更大。从单平台到多平台,将会成为B端时代的主旋律。

以此为开端,在我们的头脑当中所形成的根深蒂固的平台和中心的概念将会由此打破,取而代之的将会是共生体的概念。

四、B端时代不一定要消费升级,但一定要产业升级

我们都知道,伴随着B端时代的来临,人们提及最多的是“消费升级”的概念。因为在消费升级的概念出现之后,人们才会反推到产业端,用产业升级来实践B端时代,并且由此衍生出来了产业互联网的概念。

事实上,所谓的消费升级的概念,其实依然是基于C端时代诞生出来的概念,如果用这个概念来指导B端时代的发展,是无法让B端时代的发展跳出C端时代的发展怪圈的。

真正意义上的B端时代并不真正需要所谓的消费升级,但是,一定需要产业升级。因为以C端为主导的消费互联网时代遭遇困境的根本原因不是因为C端用户出问题了,而是因为B端的生产和供应方式出问题了,落后的供应端已经难以与消费端完美对接。

在这个时候,我们只有升级B端产业,通过新的生产方式和供应方式去满足C端用户的新需求,才能化解消费互联网时代的问题,再度让供求两端实现对接。

随着人们对于B端时代认识的深入,消费升级的概念开始逐渐被弱化,取而代之的是产业升级和消费平权的概念。通过产业升级,我们看到的是B端行业的生产模式和供应模式需要一场深度且全面地改变;通过消费平权,我们看到的是B端行业的用户群体需要从一二线城市转向下沉市场。

从本质上来看,无论是产业升级,还是消费平权,都是一场以B端变革为肇始点的新发展。不同的是,产业升级的概念之下,玩家们真正应该关注的是外部产业的升级;而在消费平权的概念之下,玩家们真正应该关注的是自身的升级。

五、B端时代不一定要去互联网化,一定要数字化

伴随着B端时代出现的是产业互联网的概念,提及产业互联网的字眼,人们自然而然地将其与互联网联系在一起。

后来,随着大数据、云计算、区块链和人工智能为代表的新技术的崛起,我们看到的是一场以去互联网化为代表的新发展浪潮的来临。于是,人们开始将B端时代与互联网撇清联系,甚至开始诋毁互联网的功能和作用,去互联网化俨然已经成为一种潮流。

笔者认为,在B端时代,我们并不一定要去互联网化,而是一定要摆正互联网的位置,认清互联网的作用。在很多时候,B端时代的互联网更多地承担的是一个数字流量的获取和整合的角色,它存在的价值和意义在于为将来的数字化积蓄能量。从这个角度来看,B端时代的来临并不一定需要去互联网化,而是应该更多地需要数字化。

如何以数字化为切入点来改变消费互联网时代以互联网为主导的发展模式,通过对传统产业进行数字化的改造和整理,为传统行业的发展汲取新的发展动能,或许才是我们真正应该关注的地方。

从这个逻辑来看,B端时代并不一定要去互联网化,但是,一定要数字化。只有数字化真正实现和完成之后,B端时代才能真正完成和实现。

当产业互联网时代来临,B端市场成为一个备受关注的热门领域。很显然,B端市场与C端市场是存在着巨大区别的。认清这种区别,并且以此来落地和实践产业互联网,才能避免产业互联网走回头路,真正让产业互联网带入到属于自己的发展轨道里。



文章来源:人人都是产品经理  作者:
孟永辉


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


日历

链接

个人资料

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

存档