首页

JSP的刨根问底

前端达人

JSP的刨根问底

  • 一.概念
  • 二.原理
  • 三.脚本
  • 四.内置对象
  • 五.注释
  • 六.编译指令
  • 七.动作指令


  • 点击查看原图


    这篇文章从一个初学者的角度,复习一波JSP。






    一.概念
    Java Server Pages: java服务器端页面

    可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
    用于简化书写!!!
    二.原理
    本质是一个Servlet

    三.脚本
    定义:Jsp定义java代码的方式

    <% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
    <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
    <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
    四.内置对象
    对象名 实现接口或继承类 作用
    PageContext 当前页面共享数据,还可以获取其他八个内置对象
    request HttpServletRequest 一次请求访问的多个资源(转发)
    session HttpSession 一次会话的多个请求间
    application ServletContext 所有用户间共享数据
    response HttpServletResponse 响应对象
    page Object 当前页面(Servlet)的对象 this
    out JspWriter 输出对象,数据输出到页面上
    config ServletConfig Servlet的配置对象
    expection Throwable 异常对象
    五.注释
    1.html注释
    <!-- -->:只能注释html代码片段
    2.jsp注释
    <%-- --%>:可以注释所有

    六.编译指令
    作用
    用于配置JSP页面,导入资源文件

    格式
    <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
    分类
    1.page
    配置JSP页面的
    1. contentType:等同于response.setContentType()
    *设置响应体的mime类型以及字符集
    * 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)
    2.import:导包
    3. errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
    4.isErrorPage:标识当前也是是否是错误页面。
    * true:是,可以使用内置对象exception
    * false:否。默认值。不可以使用内置对象exception
    2.include
    页面包含的。导入页面的资源文件

     <%@include file="top.jsp"%>
    3.导入资源
    导入资源

     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      prefix:前缀,自定义的
    1
    七.动作指令
    作用
    动作指令与编译指令不间,编译指令是通知 Servlet 引擎的处理消息,而动作指令只是运行时的脚本动作。编译指令在将JSP 编译成 Servlet 时起作用:处理指令通常可替换成 Java脚本,是 JSP脚本的标准化写法。

    分类
    指令 作用
    jsp:forward 执行页面转向,将请求的处理转发到下一个页面。
    jsp:param 用于传递参数,必须与其他支持参数曲标签一起使用。
    jsp:include 用于动态引入一个 JSP 页面。
    jsp:plugin 用于下载 JavaBean 或 Applet 到客户端执行。
    jsp:useBean 使用 JavaBean。
    jsp:setProperty 修改 JavaBean 实例的属性值。
    jsp:getProperty 获取 JavaBean 实例的属性值。
    具体细节:
    jsp:forward:
    动作把请求转到另外的页面。可以转发静态的HTML页面,也可以转发动态的JSP页面,或者转发到容器中的servlet jsp:forward标记只有一个属性page。 page属性包含的是一个相对URL。 page的值既可以直接给出,也可以在请求的时候动态计算。

    jsp:param
    用于设定参数值,这个指令不能单独使用 可以与以下三个指令结合使用:
    jsp:include :用于将参数值出入被导入页面
    jsp:forword : 用于将参数值传入被转向页面
    jsp:plugin : 用于将参数值传入页面中javaBean的实例

    jsp:include
    (拿目标页面插入原有页面)该动作是一个动态的include指令,也用于带入某个页面,他不会导入被include页面的编译指令,仅仅导入页面的body内容插入到本页面
    该动作把指定文件插入正在生成的页面。其语法如下:   flush:用于指定输出缓存是否转移到被导入的文件中, true:包含在被导入的文件中 false:包含在源文件中
    前面已经介绍过include指令,它是在JSP文件被转换成Servlet的时候引入文件,而这里的jsp:include动作不同,插入文件的时间是在页面被请求的时候。j
    sp:include动作的文件引入时间决定了它的效率要稍微差一点,而且被引用文件不能包含某些JSP代码(例如不能设置HTTP头),但它的灵活性却要好得多。
    jsp:plugin

    用于下载服务器端的javaBean或applet到客户端)
    jsp:plugin动作用来根据浏览器的类型,插入通过Java插件运行Java Applet所必需的OBJECT或EMBED元素。

    <jsp:plugin  
      type="bean | applet"   : 被执行的java程序的类型
      code="classFileName" :被执行的文件名,必须以  .class 结尾
      codebase="classFileDirectoryName"   :被执行文件的所在目录
      [ name="instanceName" ] :给程序起一个名字用来标识该程序
      [ archive="URIToArchive, ..." ] :指向一些要预先载入的将要使用到的类
      [ align="bottom | top | middle | left | right" ] :
      [ height="displayPixels" ]
      [ width="displayPixels" ]
      [ hspace="leftRightPixels" ] 
      [ vspace="topBottomPixels" ]
      [ jreversion="JREVersionNumber | 1.1" ]   :能正确运行改程序必须的JRE的版本
      [ nsplug inurl="URLToPlugin" ]  
      [ iepluginurl="URLToPlugin" ] >
      [ <jsp:params>
      [ <jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" /> ]+
      </jsp:params> ]
      [ <jsp:fallback> text message for user </jsp:fallback> ]  :当不能正确显示该Applet时,显示该指令中的文本提示
     <jsp:plugin>
    



    jsp:useBean
    useBean:用于在jsp页面中初始化一个java实例(如果多个jsp中需要重复使用某段代码,可以把这段代码定义成java类在页面中引用)
    jsp:useBean动作用来装载一个将在JSP页面中使用的JavaBean。这个功能非常有用,因为它使得我们既可以发挥Java组件重用的优势,同时也避免了损失JSP区别于Servlet的方便性。
    jsp:useBean动作最简单的语法为:<jsp:useBean id=“JavaBean的名称” class=“package.class"包名.类名” scope=“有效范围”/>

    这行代码的含义是:“创建一个由class属性指定的类的实例,然后把它绑定到其名字由id属性给出的变量上”。不过,就象我们接下来会看到的,定义一个scope属性可以让Bean关联到更多的页面,它可接受四个值:request、session、page、application。此时,jsp:useBean动作只有在不存在同样id和scope的Bean时才创建新的对象实例,同时,获得现有Bean的引用就变得很有必要。
    获得Bean实例之后,要修改Bean的属性既可以通过jsp:setProperty动作进行,也可以在Scriptlet中利用id属性所命名的对象变量,通过调用该对象的方法显式地修改其属性。这使我们想起,当我们说“某个Bean有一个类型为X的属性foo”时,就意味着“这个类有一个返回值类型为X的getFoo方法,还有一个setFoo方法以X类型的值为参数”。  有关jsp:setProperty动作的详细情况在后面讨论。但现在必须了解的是,我们既可以通过jsp:setProperty动作的value属性直接提供一个值,也可以通过param属性声明Bean的属性值来自指定的请求参数,还可以列出Bean属性表明它的值应该来自请求参数中的同名变量。
    在JSP表达式或Scriptlet中读取Bean属性通过调用相应的getXXX方法实现,或者更一般地,使用jsp:getProperty动作。
    注意,包含Bean的类文件应该放到服务器正式存放Java类的目录下,而不是保留给修改后能够自动装载的类的目录。例如,对于Java Web
    Server来说,Bean和所有Bean用到的类都应该放入classes目录,或者封装进jar文件后放入lib目录,但不应该放到servlets下。
    id:javaBean的实例名 class: javaBean的实现类 scope:指定javaBean实例的生存范围
    page:javaBean仅在该页面有效 request:javaBean在本次请求中有效 session:
    javaBean在本次session内有效 application:
    javaBean在本应用内一直有效  下面是一个很简单的例子,它的功能是装载一个Bean,然后设置/读取它的message属性。
    关于jsp:useBean的进一步说明   使用Bean最简单的方法是先用下面的代码装载Bean:   <jsp:useBean id=“name” class=“package.class” />
    然后通过jsp:setProperty和jsp:getProperty修改和提取Bean的属性。 不过有两点必须注意。   第一,我们还可以用下面这种格式实例化Bean: <jsp:useBean …>   Body   </jsp:useBean>
    它的意思是,只有当第一次实例化Bean时才执行Body部分,如果是利用现有的Bean实例则不执行Body部分。正如下面将要介绍的,jsp:useBean并非总是意味着创建一个新的Bean实例。
    第二,除了id和class外,jsp:useBean还有其他三个属性,即:scope、type、beanName。
    id:命名引用该Bean的变量。如果能够找到id和scope相同的Bean实例,jsp:useBean动作将使用已有的Bean实例而不是创建新的实例。
    class:指定Bean的完整包名。
    scope:指定Bean在哪种上下文内可用,可以取下面的四个值之一:page、request、session和application。  默认值是page,表示该Bean只在当前页面内可用(保存在当前页面的PageContext内)。
    request表示该Bean在当前的客户请求内有效(保存在ServletRequest对象内)。
    session表示该Bean对当前HttpSession内的所有页面都有效。
    最后,如果取值application,则表示该Bean对所有具有相同ServletContext的页面都有效。
    scope之所以很重要,是因为jsp:useBean只有在不存在具有相同id和scope的对象时才会实例化新的对象;
    如果已有id和scope都相同的对象则直接使用已有的对象,此时jsp:useBean开始标记和结束标记之间的任何内容都将被忽略。
    type:指定引用该对象的变量的类型,它必须是Bean类的名字、超类名字、该类所实现的接口名字之一。请记住变量的名字是由id属性指定的。
    beanName:指定Bean的名字。如果提供了type属性和beanName属性,允许省略class属性。

    jsp:setProperty
    jsp:setProperty用来设置已经实例化的Bean对象的属性,有两种用法。
    首先,你可以在jsp:useBean元素的外面(后面)使用jsp:setProperty,    …

    第二种用法是把jsp:setProperty放入jsp:useBean元素的内部, …

    jsp:setProperty动作有下面四个属性:name:表示要设置属性的是哪个Bean。  property:表示要设置哪个属性。有一个特殊用法:如果property的值是"",表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set方法。  value:value属性是可选的。该属性用来指定Bean属性的值。字符串数据会在目标类中通过标准的valueOf方法自动转换成数字、boolean、Boolean、byte、Byte、char、Character。例如,boolean和Boolean类型的属性值(比如“true”)通过Boolean.valueOf转换,int和Integer类型的属性值(比如"42")通过Integer.valueOf转换。  value和param不能同时使用,但可以使用其中任意一个。  Param:param是可选的。它指定用哪个请求参数作为Bean属性的值。如果当前请求没有参数,则什么事情也不做,系统不会把null传递给Bean属性的set方法。因此,你可以让Bean自己提供默认属性值,只有当请求参数明确指定了新值时才修改默认属性值。  例如,下面的代码片断表示:如果存在numItems请求参数的话,把numberOfItems属性的值设置为请求参数numItems的值;否则什么也不做。    如果同时省略value和param,其效果相当于提供一个param且其值等于property的值。进一步利用这种借助请求参数和属性名字相同进行自动赋值的思想,你还可以在property(Bean属性的名字)中指定“”,然后省略value和param。此时,服务器会查看所有的Bean属性和请求参数,如果两者名字相同则自动赋值。  下面是一个利用JavaBean计算素数的例子。如果请求中有一个numDigits参数,则该值被传递给Bean的numDigits属性;numPrimes也类似。  JspPrimes.jsp

    20200321215032100.jpg
    jsp:getProperty
    jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出。
    jsp:getProperty有两个必需的属性,即:name,表示Bean的名字;property,表示要提取哪个属性的值。

    END!!!有什么意见可以提出来!
    长路漫漫,JAVA为伴!!!
    ————————————————
    版权声明:本文为CSDN博主「福尔摩东」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_43688587/article/details/105017469

label和span标签设置宽度width无效的解决办法

前端达人

如何用CSS使label标签等宽?

<div><label>密码</label><input type="password" /></div>
<div><label>确认密码</label><input type="password" /></div>
如何对齐呢?加空格的方法不好哦。(因为label中的字数不一样,所以页面显示效果不对齐)
问题原因及解决办法:

label默认为内联元素,元素前后没有换行符,并且不可以设置宽度。

如果要为label设置宽度,则需要改变label的display属性,使其变为一个块级元素。

方法如下:

1.增加inline-block属性值,将label标签变为行内块元素(css2.1新增)

     {display:inline-block;}

2.增加width属性,如将宽度设置为100px
    label{width:100px;display:inline-block;}

3.添加好后页面上所有的label标签会变为100pxv



JavaScript中的混淆器

随着 AJAX 和富界面技术的发展,Javascript 在 Web 应用上的重要性越来越高,Javascript 代码的复杂性、功能和技术含量也越来越高,对Javascript 代码保护的需要也越来越迫切。



压缩 compress: 去掉空格,换行,注释等,格式紧凑,节约存储空间。



混淆 obfuscate/garble:替换变量名或方法名,让js不容易看懂。也做到了压缩的效果。



加密 encrypt:一般用eval方法加密,效果与混淆相似。也做到了压缩的效果。



我们可以通过工具进行混淆,通过工具也是目前最好的方式。推荐一个很好的混淆工具: JSObfuscator By Unest


20200321102359879.png


————————————————

版权声明:本文为CSDN博主「刘亦枫」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/liuyifeng0000/article/details/105004732




科学的 UI 配色方法

涛涛

各行各业的设计师每天都在和颜色打交道,UI 设计师设计用户界面也不例外。

用户界面是一个设计师用理性思维解决用户感性需求的窗口。如果对色彩的运用不加以克制,界面可能会显得花哨而没有主次;但过于拘谨又容易使界面保守,难以激发用户情绪。所以如何让色彩的搭配平衡,是 UI 设计师需要修炼的一课。

但色彩毕竟是感性的元素,我们总是仰慕一些对色彩天赋异禀的设计师,总能不拘绳墨给作品带来惊艳的视觉效果。我们难以偷习他们的天赋,但或许你有没有想过,干脆我们另辟蹊径,用理性推导来制定一套色彩系统?

那么今天我用我的项目示例,教给大家一个科学推导颜色搭配的方法。也许能够带你发现一些色彩背后的数学秘密。

区分颜色模式

在此之前我们需要先熟悉一下颜色模式。

在 PS 菜单栏的「图像-模式」下可以看到非常多的颜色模式:RGB、CMYK、Lab 等等。那是因为 PS 是一个需要满足设计行业水平领域的软件,要解决各类设计师需求,所以涵盖的颜色模式非常丰富。

但 UI 大多数时候需要关注的是线上场景,成果的展示渠道一般是自发光设备。所以弄明白垂直领域软件 Sketch 中的几种颜色模式,其实就足够了,分别是 RGB、HSB 和 HSL。

RGB 是指通过 R(Red:红)、G(Green:绿)、B(Blue:蓝)三个颜色通道的变化以及它们相互之间的叠加得到各式各样的颜色。三个通道分别有「0-255」这 256 个值,这些值分别代表着各通道的亮度层级。

虽然 RGB 在机器表现上很友好,但并不够人性化。因为人们判断颜色,往往是通过「这是什么颜色?是不是太鲜艳了?亮了还是暗了?」这样的感官维度,而很难通过红绿蓝的亮度层级去判断。所以人们后来基于 RGB 衍生出了 HSB 模式和 HSL 模式。

HSB 是指通过 H(Hue:色相)、S(Saturation:饱和度)、B(Brightness:明度)来控制颜色。Hue(色相)的取值范围是色环上 0-360° 的圆心角度;而 Saturation(饱和度)与 Brightness(明度)是在 0-100% 的量占比。

HSL 中的 H、S 与 HSB 相同,都是指 Hue(色相)、Saturation(饱和度)。但 L 所指的则是 Lightness(亮度)。

HSL 和 HSB 稍微有一些不同,我们在两个颜色模式下输入相同的数值,会发现颜色实际是不一样的。虽然 H、S 指代的都是色相和饱和度,但 L(Lightness:亮度)与 B(Brightness:明度)分别被认为是「颜色中白色的量」和「颜色中光线的量」。

Lightness 和 Brightness 的概念要深度研究下去的话其实是计算机算法领域的问题了,感兴趣的朋友可以查阅更多资料,但我个人认为对于 UI 来说没有太大必要。

关于 HSB、HSL 的使用场景,记住以下两点即可:

  • 前端 CSS 代码里支持的是 HSL,而不是 HSB。如果和前端对接时,UI 给到的是 HSB 的色值,那么最终落地的颜色效果会与设计稿有出入。
  • 我们接下来讲到的配色推导,是基于 HSB 颜色模式的,因为它更容易理解,数值变化在色系坐标中的产生的结果更加直观。

配色推导

支付宝 Alipay Design 团队提出过一个配色原则:

以同色系配色为主导,多色搭配为辅。

同色系为统一的色相,使用中可以加深品牌色的感知,可以让界面更有层次,同时可以让界面保持色彩上的一致性;由于业务的多样化,我们需要多色搭配为辅;多色的辅助颜色,也可称之为功能色,可设定不同的任务属性和情感表达;再搭配中性色黑白灰,赋予更多的变化和层次。两种配色通过主次、使用比例,可灵活运用在业务的各个场景中,具有非常好的延展性。

那么知道了这个原则,我们又该如何科学、合理地得出产品的色彩系统呢?接下来我就用我的一个项目示例给大家做讲解。

步骤一:找到符合产品调性的品牌色

我负责的该项目主要业务与高校支付、缴费相关,所以希望整个产品视觉风格首先要给用户带来安全感。又因为主要用户群体是高校师生居多,新潮、年轻化是主要用户的一大标签,所以我们选择了用饱和度较高的蓝色来作为品牌色。

最终选择品牌色的 Hex 值为 #1585FF ,HSB = (211,92,100)。

步骤二:提取24色

选定了品牌色之后,以品牌色的 H(色相)为基础,不断地递增、递减 15,在 0-360 之间可以得出 24 个颜色,也就是将 360° 色环分割为 24 份,可以得到 24 色。

为什么要提取 24 色,并且以 15 为公差呢?

我们知道,想得到邻近色、类似色、互补色这一系列的颜色,我们就会使用到色环。

  • 邻近色:色相差值 15° 以内的颜色为邻近色;
  • 类似色:色相差值 30° 以内的颜色为类似色;
  • 互补色:色相差值 180° 的颜色为互补色。

而 24 色色板是帮助我们提取辅助色的便捷工具。

步骤三:找到同色系配色

同色系是指与品牌色 H(色相)一致,通过改变 S(饱和度)与 B(明度)变化产生的色组。同色系色组的推导需要借助拾色板坐标。

我们建立一个基于 S(饱和度)与 B(明度)的平面坐标系,设定当前品牌色为色值为(S₀,B₀),连接品牌色色值点与右上纯白点(0,100)、右下纯黑点(100,0),得到两条线段。

我们各在两条线段上均分取得 5 个点坐标(包含首位两点)。这样两条线段一共就会产生 11 个(S,B)坐标值,对应着 11 个同色系色组。

经过上图的计算,我们可以得到基于品牌色的同色系色阶。

步骤四:多色搭配

用于搭配的辅助色应满足以下两个条件:

  • 和品牌色有明显区分:尽量避免所选辅助色感官上给用户视觉区别与品牌色差距不大,传递的调性太过一致;
  • 不能过于突兀:根据色彩原理来说,互补色是最能与品牌色本色产生视觉感官对比的颜色,但可能会有些突兀。为了让颜色的辅助起到丰富画面的作用,而不是反而让整个版面显得不和谐,所以我们选择互补色的邻近色作为辅助色,而不要直接使用互补色。

于是根据以上条件,基于品牌色可衍生出 3 个辅助色:一个与品牌色传递调性有明显区分的类似色;两个互补色的邻近色。

步骤五:感官明度校准

经过计算后,我们已经得出了品牌色和三个辅助色。

可以看出,虽然我们提取出的辅助色明度色值都一致,但因为颜色本身自带的感官明度属性有所区别。为了让辅助色和品牌色的感官明度尽量一致,我们要对第一次提取出的辅助色进行感官明度校准。

校准方式是:依次在辅助色上叠加一层纯黑图层,将该纯黑图层颜色模式调整为 Hue(色相),就可以通过无彩色系下的明度色值,进行对比。

这样我们终于得到以品牌色为基准的 3 个辅助色了。

步骤六:全色系输出

将得到的辅助色依次进行步骤三的计算,可以得到辅助色的同色系色阶。

但因为明度过低时,颜色已经非常接近于黑色,色相在肉眼上几乎已经趋于一致。所以删除最左边的三种同色系颜色。最后得到基于品牌色推导出的全色系色阶色板。

总结

完成了以上的工作,当然还不算结束。一套标准的色彩系统还会包含中性色规范、颜色的使用规范等等。但相信解决了大部分的需求,剩下的工作也难不倒大家了。毕竟以上的方式只是给大家提供了一个理性科学的方法,色彩的使用最终还是要融合设计师个人的共情能力。

比如许多产品有了一套自己的色彩方案后,设计师还会根据具体的业务场景去赋予 icon、卡片背景等元素不一样的色彩方案。

希望这个方法能够带你发现一些色彩背后的数学秘密。

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

大厂设计师的草稿本里画的都是什么?!

涛涛

很多同学投票想看看设计师的草稿本,今天就来满足大家了!我们来看看六位淘宝设计师的草稿本们,有些是纸质派,有些是电子党,Here we go!

草稿本是设计师工作生活必不可少的工具,比起正儿八经的作品集,设计师的草稿本其实也是十分有趣的,它是设计师脑海里千奇百怪想法的随手记录。

Shiyu:本人是被胁迫公开草稿本的卑微设计师

手绘装备:iPad Pro+Procreate

以下是被迫营业现场对话

△ 给「老同学」的公众号形象草稿

老同学:「好久不见~我记得你画画挺好的~帮画个形象呗~我现在在做一个公众号,需要*&%¥#……你明白吧?你就简单画一画就好~谢谢啦」

我:「….」

△ 给「朋友」画的头像草稿

朋友:「好久不见~我记得你之前帮谁谁画的那个头像挺不错的~也帮我画一个呗~我现在在做blablabla,需要*&%¥#……你明白吧?很简单吧~谢谢啦」

我:「….」

Dajing:我的草稿本就是平时画画原型图或者需要做文档整理规范的时候拿出来画画草图,对我来说我的草稿本是帮我理清思路的一个很好的助手。

手绘装备:A4点格草稿本+马克笔

 △ 智能配色草稿

△ 中后台加框草稿

Dajing:里面有当时做中后台框架的时候导航的原型,还有之前做智能配色的时候HSB色环推演的草图,还有些文档维度整理草图,画出来方便查看也便于直观梳理自己的逻辑。

Wanru:画画是我记录生活、寻找灵感的一种方式。

手绘装备:MUJI笔记本、水彩、铅笔、马克笔等等…

△ 冲绳旅行水彩

Wanru:水彩是我最喜欢的绘画形式,非常浪漫,食物也是我擅长画的题材。这是在冲绳旅行时的第一顿晚餐,新鲜的海鲜和爽口的啤酒也具有明亮的颜色,让人忍不住想去表达。烧肉店的杯垫被我带了回来,日本的平面设计做得很好,是很好的素材~

△ 电影小漫画

用小漫画记日记的习惯已经很多年了,我是非常喜欢漫威的,这是13年《钢铁侠3》上映和两个朋友看电影的场景。这个场景必须用美漫的风格了!偶尔会尝试各种画画风格。

△ 随手小速写

偶尔会画些小速写,勾一些人物、小物品、小动物,速写可以很好地练习造型能力。

Zoey:作为一个热爱喝奶茶、追番和打手游的肥胖又无助的设计师,感觉累了就在草稿本上放空自己。

手绘装备:iPad Pro+Procreate & Sketches Pro

△ 记录日常生活的草稿

Zoey:我很喜欢用草稿本记录自己的生活(食物为主),喜欢的电影角色也会简单画下来。

△ 二次元小画

作为半个二次元 ,草稿本当然也被满屏的羞耻占领~ 这两张草稿是我画的Persona 5里面的人物,因为我个人真的特别喜欢P5 ,对于自己喜欢的事情即便996也会熬夜画下去~

Dribbble 十年重磅改版背后,值得关注的7大亮点

涛涛

Dribbble 经历了资本入驻、创始人出走之后,最大的事情应该就是这次改版吧?这个全球最大、最有影响力的设计师社区的每一个动作都必然会牵扯着每个设计从业者的注意力,新版背后到底有哪些变化?这些变化又是出于什么样的想法来修改的?看看 Dribbble 的官博是怎么说的吧:

在过去的10年当中,Dribbble 已经成长成为一个全球性的社区,成千上万的人从这里获得启发和灵感,助力设计,而我们从最初分享设计作品小样的创意社区,逐步成长为一个全球设计师产品和作品集展示和社交的平台。在此,而我们也第一次开始问自己一个简单的问题:【我们到底是在做些什么?】

今天,我们很高兴宣布,我们在过去的10年当中首次进行了彻底的重设计。

Dribbble 的新时代

在过去十年当中,我们所设计的 Dribbble 页面的特点,是将设计师的作品和内容放在首位,所以叫我们不追随潮流,采用了极简风格的设计,即使潮流来来去去,它们也只是 Dribbble 展示内容的一部分。我们提供了一幅未经修饰的画布,这样就可以和最疯狂最激进的设计探索相辅相成。不过,这么多年来,Dribbble 这种「隐形」的设计,在视觉美学上确实和时代脱节了。这次,我们创建了一套有着一致样式的设计和代码库,用以替代以往不断修改、庞大且不一致的代码。

「我们新的设计系统旨在保持整个视觉和谐的同时,展示你的创造力。」

如今,我们正在改进 Dribbble 的界面,以更加干净的布局、统一的设计系统、更加简化的配色方案、更加轻便的代码库(加载也更加迅速),以及全新配置的文件,来更好地帮你将作品推到最前沿,正确而合理地展示你的创作和个性。

我们新的设计系统旨在保持整个视觉和谐的同时,展示你的创造力。它是你分享设计作品和创造力的理想画布,而新的美学特质也可以更好地反应此刻我们的公司的气质。

全新的设计师个人页面

在进行重设计的时候,我们明确知道,我们要完全重新思考社交化的设计师作品展示,并且将创意更大化地呈现。对于 Dribbble Pro 用户和 Pro Business 订阅者,你现在拥有一个全新的、经过全面修改的设置和配置页面,可以在 Dribbble 上充分展示自己的个性,

你的页面,你的个性

Pro 用户和 Pro Business 用户可以通过上传你自己的首图和定制化的欢迎语,来个性化你的个页面。

你还会注意到,你的个人页面还可以上传更大的照片,这可以让你的作品对于页面的访客、你的客户、招聘设计师的企业人事而言,看起来都是非常出挑的。新的网格布局是可以自定义的,因此你可以充分完美地设置和展示内容。

此外,我们还修改了「关于我们」这个部分,新版当中,这个部分你可以将所有的个人信息汇集到一起,以便完整而充分地展示你的个人经历、展示简历和技能。

寻求工作机会?

如果你正在寻求工作机会,新的信息发送组件,确保了你的客户或者招聘企业可以一键联系到你,他们可以直接从你的个人资料页向你发送信息,非常轻松地和你取得联系。

面向所有人的新个人页面

当然,并非是只有 Pro 和 Pro Business 用户才能拥有高度定制化的个人页面,无论你是普通用户、内容创作者还是内容策划人,Dribbble 上每个普通用户的个人页面也都会升级。尚未订阅 Pro 服务的设计师会注意到,他们的个人页面会更加简洁,而设计作品会以更加聚焦的形式,吸引到每一个访客的目光。

全新的收藏页

我们将以往的带有分享功能的收藏合集页(之前叫 Buckets)给翻新了,你可以精心策划整页内容和案例,从一个情绪板到完整的项目,这意味着,借助这个收藏页功能,你可以更加轻松地在 Dribbble 上寻找和搜集灵感。

给策划人的个人页面

现在,我们可以非常自豪地宣布,即使你并没有将 Dribbble 作品给分享出来,每个人也都会拥有一个策划人页面,你可以在其中搜集和整理自己喜欢的作品,来展示你的个人品味,通过保存别人的作品,来创建新的合集,我们会自动将它添加到你的个人页资料页当中,让全世界的同好因为品位而关注你。

升级发现页

我们在整个改版设计过程中,面临最大的挑战,其实是图片网格,因为这是绝大多数用户每天浏览图片、发现设计灵感的地方,我们有意识地去弱化 Dribbble 本身 UI,避免喧宾夺主,让每个用户的作品成为视觉焦点,减少噪音。

当然,我们还未完成…

2020 年才刚刚开始,我们迫不及待地想要展示我们计划中的一切。从案例研究到更好的视频支持,再到作品集展示,摆在我们眼前的改版路线图足以证明我们的雄心,所有的这一切都是为了让全球的设计师能够从中获益,走向成功。请期待我们进一步的改版升级吧!

文章来源:优设    作者:Dribbble

2020年最值得设计们保持关注的8个UI设计趋势

涛涛

快速变化的技术每年都在影响着设计趋势。作为设计师,我们需要时刻保持关注,对设计趋势拥有较高的敏感度,不断学习,扩充自己的设计技能,目的是为了跟上的市场环境。基于我的调研,经验和观察,我甄选了在2020年你将会看到的最为关键的8个UI/UX设计趋势。让我们一起来看看吧。

动效插图

插图被应用到APP中已经有很长一段时间了,它们在最近几年的演变令人印象深刻。插图作为一种非常流行的设计元素,为我们产品的整体产品增加了情感化体验。插图非常能抓人眼球,尤其是在融入动效后会显得更加的自然,将产品带入生活的气息,使得产品功能更加突出,同时也增添了更多的细节和个性。

△ Welcome to Swiggy by Saptarshi Prakash

△ Onboarding animations — Virgil Pana

另一个好处是使用动效后,能抓住用户的注意力使其能够更加沉浸在你的产品中。动效同样是讲好品牌故事,产品或者服务最有影响力的途径之一。

微交互

微交互存在与每一个网页或者app界面中。每当打开你最喜欢的那些应用时,都有机会看到它们,比如像Facebook中就有大量不同的微交互,我认为「Like」功能就是一个完美的例子。有时,我们几乎意识不到它的存在,因为它们非常的不显眼,非常自然地融到界面中去了。但是,如果当你把这些微交互移除掉的话,你又会非常快的注意并能感受到一些非常重要的东西丢失了。

△ Menu toggle close animation — Aaron Iker

△ Tab bar active animation — Aaron Iker

一般来说,在UI/UX中即使非常小和细节处的设计都可能会带来巨大的冲击力。微交互就是完美的证明,细节和对它的关注能极大的改善产品的整体体验,并让产品体验上升一个台阶。每年,新设备的发布伴随着新的机会,能给产品塑造新品牌和创造富有创意的微交互。

3D图形

3D图形设计几乎无处不在,比如在电影,游戏或者运营广告里等等。3D图形设计早在10年前就出现了然后一直在不断提升和进化。手机和web技术进展迅猛,新的web浏览器能力打开了3D设计新世界的大门,这给了设计师们在web和手机界面中创造炫酷3D设计的机会。

△ 3D flip menu by Minh Pham

△ Car health report UI by Gleb Kuznetsov

创造并整合这些3D创意设计到web和手机界面中需要特殊的技能和花费大量的工作,但这些付出会得到回报。

△ Apple AirPods Pro landing page

3D设计对于产品和服务来说,具有非常大的吸引力,例如在交互上能够支持用户360度查看产品,从而大大提升整个的产品体验。

在2020年会有更多的品牌利用3D渲染模型的产品和服务去模仿线下购物体验。

VR设计

VR技术在2019年有一个巨大的飞跃。最近的一年我们激动地看到了头戴式设备有了非常大的发展,尤其是在游戏领域。我们需要记住的是,游戏行业经常在引领着新技术的发展并落地到实际的产品设计中。研究表明,VR也不例外,在Oculus Quest于2019年推出后,许多机会为其他行业打开了大门。Facebook CEO 扎克伯格已经测试了激动人心的手部交互功能,并正式宣布将在2020年初为Quest进行更新。

△ Oculus Quest — hand interaction feature

△ PlayStation Virtual Reality Website Design by Kazi Mohammed Erfan

索尼和微软计划在2020年夏季发布他们的新设备,这就给VR技术带来巨大的机会和发展空间。

学习VR 可以阅读优设这个专题:https://www.uisdc.com/zt/vr-design

AR设计

在最近几年,我们能看到在AR(增强现实)这块有了很大的进步和惊喜。世界引领着科技公司在AR开发方面进行了巨大的投入,所以我们应该期待这项技术在2020年有更大的成长和发展。苹果公司也发布了他们自己的AR套件叫AR KIT3来帮助设计师和开发者在他们的产品中打造AR体验。

△ Apple ARKit 3 by Apple

△ Public transit app by Yi Li

△ House of Plants AR Concept by Nathan Riley

在AR空间里会有无限的机会和创意去打造一个新的品牌和激动人心的体验。为AR做UI设计会在2020年成为一大趋势,这就要求设计师们在面对创造AR产品体验前,应该去准备和抓紧学习新的工具,原型之类的知识。

学习AR 可以阅读优设这个专题:https://www.uisdc.com/zt/ar-design

新拟物化设计

一般来说,拟物化设计是指以现实风格/方式创造出来与现实中的物体相匹配的设计元素。不断发展的VR/AR技术以及在各大最流行设计平台(Dribbble,Behance等)上展示的设计作品趋势来看,预示着拟物化的回归,但这次换了个更现代,更酷略微高大上的名字叫「新拟物风」(也叫Neumorphism)。

△ Skeuomorph Mobile Banking | Dark Mode by Alexander Plyuto

△ Simple Music Player by Filip Legierski

△ Sleep Cycle App — Neumorphism Redesign by Devanta Ebison

你可能注意到了:Neumorphism代表了丰富细节和明确的一种设计风格。高光,投影,发光,这些细节非常令人印象深刻。Neumorphism风格已经鼓舞了全世界一大批的设计师创作作品,它也会成为2020年最大的设计趋势。

学习新拟物风可以阅读优设这个专题:https://www.uisdc.com/zt/neumorphism

不对称布局

最近一年我们也注意到一种不对称风格正在快速发展。传统基于「模板」的布局肯定会消失。这种设计趋势给2020年的设计带来了更多的差异化。合适的不对称风格将会在我们的作品中增多一大批不同的性格,火力以及个性,所以设计不再单纯的基于模板。

△ Limnia Fine Jewelry Grid — Zhenya Rynzhuk

△ Carine fashion store — selection screen concept — Dawid Tomczyk

当设计这种不对称风格时,设计师拥有非常多的选项以及巨大的发挥空间。但是,想设计好这种不对称风格需要大量的练习,它绝不是将元素随机的摆放在网格中,而应该小心使用和实现它们,时刻需要把用户的诉求考虑到设计中。我们并不想让用户迷失在我们的产品中,对吗?

用户故事

故事在整个用户体验中扮演着非常重要的角色。你可能经常会在着落页看到它作为品牌介绍,产品或者一个新的服务。讲故事就是利用创意的形式把信息传递给用户。这可以通过强大的视觉元素来呈现(字体,插画,高清图片,颜色,动画,交互元素)。

△ A+WQ / Young Lab Page Story of The Week Animation by Zhenya Rynzhuk

△ Free Sketch Template :: Mimini by Tran Mau Tri Tam

讲故事可以帮助产品创造出品牌和用户之间积极的情感连接。讲故事可以为你的产品创造出非常多的记忆点,让用户感受到自己就是产品或服务的一部分,他们便会更加愿意使用你的产品。话虽如此,讲故事也是一种非常有效的营销手段,它可以极大地提高你的产品/服务的销量。讲故事作为一种非常成功的手段,将在2020年继续发扬光大。

总结在2020年非常值得关注的8个设计趋势

1. 动态插图

通过把动画和插图进行结合,我们可以使得设计变得更加突出,并把它带入用户的日常生活,为产品赋予了的细节和个性化。

2. 微交互

微交互被证明是可以在当用户注意到他们是能够带来非常大的惊喜体验,它能够有效的提升整个产品的用户体验并把产品的品质提升一个等级。

3. 3D图形的应用

新的浏览器技术打开了3D图形应用的大门,能够给设计师带来非常大的创意机会去打造让人惊叹的3D图形设计应用到网页和手机APP中。

4. 虚拟现实

游戏行业将迎来新的变革,新的技术能够应用到产品设计中。

5. 增强现实

在AR空间中拥有无限的机会去创造新的品牌和令人激动的新体验。为AR技术服务的UI设计将在2020年成为主要趋势,设计师需要位为之准备并去学习新的工具,原型,当真的需要你去做一款AR应用时就需要用到。

6. 新拟物风

AR/VR技术不断发展,以及在各大流行设计平台上大量涌现的写实设计作品预示着拟物风的回归,但只是这次换了个新的更加现代化的名字。

7. 不对称布局

运用不对称布局能让设计创意变得拥有更多选项和机会。虽然,设计一个成功的不对称布局需要投入大量的练习和时间。

8. 讲故事

讲故事就是利用创意形式把信息传递给用户。讲故事是一个非常好的营销工具,可能会大大增长产品的销售额或服务。

文章来源:优设    作者:彩云译设计

2020 年最火的新拟物化如何落地应用?

涛涛

最近关于新拟物化 Neumorphism 的风太大,简直是传遍大江南北无人不知。对于它的看法大家也都众说纷纭,大部分的观点都集中于:第一看过去非常的高大上,再仔细琢磨一下就感觉只能是飞机稿中的战斗稿。对此我表示非常的理解,毕竟在国内体制下的用户界面设计基本都延续商业设计的命脉──低效能、不实用、不能带来良好转化的东西统统给我丢掉,哪怕是用户体验也是建立在商业目标驱动下的存在。

尽管观点如此,我还是想为新拟物化这位诞生在不平凡 2020 年的新生儿稍稍正个身,它并非空穴来风,也并非完全无法落地使用,相反如果合理加以优化应该能达到意想不到的双赢效果。

新拟物化的由来

一切的开始都源于一个叫 Alexander Plyuto 的设计师在各平台发布了一个他的新作品──「Skeuomorph Mobile Banking(拟物化手机银行)」。

在去年末的时候这名设计师还一直沿用 Skeuomorph(拟物化)这个名词来命名自己的一系列设计作品,直到 HYPE4 的 CEO-Michal Malewicz 写了一篇关于此风格的文章,并赋予了它一个新名词 Neumorphism(New+Skeuomorphism),自此之后大家就都照着这个新名词进行传播了。

在详解新风格之前,先让我们回忆一下这些年移动端用户界面设计风格的演变历程。自 2013 年苹果推出了 iOS7 之后开始刮起的扁平风潮,所有走在设计前沿的大厂都开始不约而同地对自己家的 app 进行了大刀阔斧的改版。

这扁平风一刮就是 7 年,仔细分析一下就能明白为何 ta 如此长寿:内容优先的认知简约,不仅拓展性强且具有能的特性,解放了一大堆「手活」不是那么好的设计师,让他们有更多时间专注在设计解决问题的命题上。

但就算一个风格再适应市场的需求,用户和时代还是会对它逐渐疲惫,审美疲劳和新的市场需求都会催生新的变革。

新拟物化设计语言解析

1. 新拟物化≠轻拟物

第一次看到这个风格介绍的时候险些以为就是曾经的轻拟物重返江湖了,但仔细看看原设计师输出的设计原则,发现确实是完全不同的 2 种定义。

轻拟物从本质上来说是 Y 轴面原质化层级分离的,而新拟物是在 Y 轴面不分离的情况下物理化拟态。

来看一个轻拟物与新拟物卡片的比对:

从上图可以感受到新拟物在保留轻质感的同时,更贴近事物的物理还原,但真实感与舒适度带来的代价就是它的辨识度和对比度明显较其他风格低了很多,这也是它被大家吐槽飞机稿中的战斗稿的重要原因之一。

2. 新拟物化控件示例

原设计师对新拟物化的「浅色版」控件规范如下,基本涵盖了核心的界面设计控件,整体对于控件的定义就在于良好使用投影和渐变来打造物理化界面肌理。

另外还有可以良好适配当前流行黑色模式的「黑色版」。

新拟物化的改良与应用

在了解新拟物化的设计语言特点之后,大家应该都发现这种风格的设计是有一定局限性的,它并不适用于一部分商业产品,大部分时候也不适合全局控件应用。那么如果我们想要把新拟物化应用到我们的落地项目设计中,需要注意哪些地方,并进行什么样的改良呢?

1. 深浅模式叠加解决弱可视难题

新拟物的按钮肌理很多是建立在素色白板上的浅色按钮,如果继续沿用浅色按钮,且不说色弱用户的可视问题,普通用户的操作行为也会大打折扣,所以这里我们建议将新拟物的深浅模式叠加来使用,如下图:

2. 局部高光使用解决层级难辨问题

如果将新拟物化全控制使用,确实容易造成界面层级混乱的问题,因为毕竟它的设计语言就是 Y 轴面不分离的设计定义,但如果我们合理选择它来作为局部高光,应该大部分情况下还是不错的。如下图,我们仅在银行卡部分使用新拟物化(深浅双模式均可用),其他的控件部分保持扁平,使用 2 个风格相融合的方式可以良好保障层级的划分:

3. 拿什么解决开发崩溃的问题?

之前看到很多文章在转发一个生成新拟物化 css 代码的网站:Neumorphism.io,说是用这个就可以轻松解决开发的问题。

然而事实的真相总是令人落泪的,这个网站提供的 css 代码只是网页代码,移动端是完全用不了的。而且就算有对应的 css 代码,对于开发来说也是远不够的,他们还是要写框架来支持这套 css 代码,不然是跑不起来的。所以我们要如何解决开发小哥哥手写新拟物化设计稿崩溃的问题呢?

很简单,就是给他们切图。按钮的软点击切两张状态图,卡片背景只需要切一张,ppduck 压缩走一波,对 app 性能的影响基本可以忽略不计(因为上文我也说过了这种风格不大可能大面积或者全界面应用)。

至于新拟物风不适用的场景大家应该都心知肚明了,信息承载大,层级关系复杂,我就不一一举例了,基本就涵盖了大部分现在市面上主流的产品的大部分场景。但即便如此我们还是需要对新的设计保有一丝激情与希望,不要轻易的去否定,毕竟新生事物总是有它的魅力与独到之处。

文章来源:优设    作者:Nana的设计锦囊

"从客户端中检测到有潜在危险的 Request.Form 值"的解决方案汇总

seo达人

在一个asp.net 的项目中,前端通过ajax将富文本中的文字内容post到服务端的一个ashx中,在ashx中尝试读取参数值时,

结果报错:“从客户端中检测到有潜在危险的 Request.Form 值”

#事故分析
由于在asp.net中,Request提交时出现有html代码字符串时,程序系统会认为其具有潜在危险的值。会报出“从客户端 中检测到有潜在危险的Request.Form值”这样的Error。

而富文本中的内容是包含html代码的,所以...

#解决方案:
1、前端对富文本字符串进行encodeURI编码,服务端进行HttpUtility.UrlDecode解码操作;
前端代码:

var str = '<p><span style="color: #00B0F0;"><em><strong>我想留在你的身边,</strong></em></span><br/></p><p><span style="color: #7030A0;"><strong><span style="text-decoration: underline;">深情款款多么可怜;</span></strong></span></p>';
    $(function() {
        $.ajax({
            type: "post",
            url: "TestHandle.ashx",
            data: { Title: 'jack', Content: encodeURI(str) },
            success: function (data) {
                $("#div").html(data);
            }
        });
    });
后端代码:

    public void ProcessRequest(HttpContext context)
    {
        string str = context.Request["content"];
        string content = HttpUtility.UrlDecode(str);
        context.Response.ContentType = "text/plain";
        context.Response.Write(content);
    }
效果图:

2、前端不以form的方式提交,直接以json方式提交,服务端从request的body中读取数据,然后反序列化,得到信息;
前端代码:

    var str = '<p><span style="color: #00B0F0;"><em><strong>我想留在你的身边,</strong></em></span><br/></p><p><span style="color: #7030A0;"><strong><span style="text-decoration: underline;">深情款款多么可怜;</span></strong></span></p>';
    var temp = { Title: 'jack', Content: str };
    $.ajax({
        type: "post",
        url: "TestHandle.ashx",
        contentType:"application/json;charset=utf-8",
        data: JSON.stringify(temp),
        success: function (data) {
            $("#div").html(data);
        }
    });
后端代码:

    string bodyText;
    using (var bodyReader = new System.IO.StreamReader(context.Request.InputStream))
    {
        bodyText = bodyReader.ReadToEnd();
    }
    dynamic bodyObj = JsonConvert.DeserializeObject(bodyText);
 
    context.Response.ContentType = "text/plain";
    context.Response.Write(bodyObj.Content);
效果图:

#其他场景的解决方案:
1、aspx页面,当前页面进行form提交
打开当前.aspx页面,页头加上代码:validateRequest=”false”,如:

<%@ Page Language="C#" ValidateRequest="false" AutoEventWireup="false" CodeFile="default.aspx.cs" Inherits="default" %>
该方法不推荐,还有一种修改web.config配置文件的方法,强烈不推荐,就不写在这里了;

2、在ASP.NET MVC中的解决方案
1)、针对某个实体类的单个字段设置 [AllowHtml] ,这样提交的时候,系统就会放过该字段。

2)、前端代码:

    var str = '<p><span style="color: #00B0F0;"><em><strong>我想留在你的身边,</strong></em></span><br/></p><p><span style="color: #7030A0;"><strong><span style="text-decoration: underline;">深情款款多么可怜;</span></strong></span></p>';
    $(function () {
        $.ajax({
            type: "post",
            url: "Home/Test",
            data: { Title: 'jack', Content: str },
            success: function (data) {
                $("#div").html(data.ok);
            }
        });
    });
3)、后端代码:

    public class NewInfo
    {
        public string Title { get; set; }
        [AllowHtml]
        public string Content { get; set; }
    }
 #写在最后
 该文只是浅显的总结一下,其中涉及的xss方面,没有详细考虑,欢迎指正!

JavaScript中Array数组的some()函数的详解

seo达人

前言

开发中,经常会用到js的Array数组的各种迭代函数map(),filter(),some(),every(),forEach(),find() findIndex(),也是在ES6中新增一些遍历函数。同样是不是也是一道面试题,说说ES6新增的一些新特性????



✍开始正文some()函数



✍一、对some()函数的定义:



some():用于检测数组中的元素是否满足指定条件(函数提供);

some()方法会依次执行数组中的每一个元素:



如果有一个元素满足条件,则表达式返回true,剩余的元素不会再执行检测。

如果没有满足条件的元素,则返回false。

注意:



some()不会对空数组进行检测。

some() 不会改变原始数组。

✍二、浏览器支持

表格中的数字表示支持该方法的第一个浏览器的版本号。



✍三、语法



array.some(function(currentValue,index,arr),thisValue)

1

参数说明:



✍三、示例



<script>

var ages = [4, 12, 16, 20];



function checkAdult(age) {

    return age >= document.getElementById("ageToCheck").value;

}



function myFunction() {

    document.getElementById("demo").innerHTML = ages.some(checkAdult);

}

</script>


淘宝、拼多多为什么要让你玩游戏?

前端达人

从支付宝蚂蚁森林开始,游戏化产品开始回归移动互联网领域。拼多多上线“多多果园”后,通过玩游戏免费领水果的玩法,引发了电商游戏化产品的风潮。淘宝、天猫、京东、苏宁等互联网平台纷纷推出了自己的游戏产品。那么游戏化到底能够为产品带来什么呢?
一、什么是游戏化
游戏化(Gamification)是指将游戏元素和游戏设计技术应用于非游戏场景,用游戏化机制创造乐趣来更好地实现目标。也就是说,通过游戏的方式,为非游戏化的场景或产品赋能,让用户在使用产品过程中获得更多的乐趣,创造更大的产品价值。



1.png


随着移动互联网的快速发展,人口红利逐渐消失,电商领域开始从增量市场进入存量市场。当用户数量无法持续有效增长时,就需要深挖存量用户的价值,通过精细化运营,提高DAU(用户日活)来获取更大的用户价值。
2016年8月27日,支付宝上线蚂蚁森林。2017年数据显示,由于蚂蚁森林拥有远超平常应用的用户黏性,产品已拥有超过2亿用户,带来的日活不可小觑。
2017年8月6日,支付宝又上线了蚂蚁庄园。2019年11月20日,蚂蚁庄园官方微博对外发布了运营大数据。该数据显示,蚂蚁庄园上线至今,全国约4亿网友捐了150亿个鸡蛋。
这两款游戏化产品引爆了用户的热情,为传统的支付工具添加了游戏化属性,开创了移动互联网时代“种树养鸡”的娱乐化模式。


2.png


随后,2018年4月,拼多多上线了“多多果园”,在电商领域率先开启了游戏化模式。于是游戏化产品在电商平台上开始生根发芽。
2018年11月,京东上线了“种豆得豆”;
2019年1月,淘宝上线了“金币庄园”;
2019年5月,苏宁易购上线了“云钻魔法狮”;

据不完全统计,主流电商都推出了多款游戏化产品。清单如下:


3.png


二、游戏化产品的价值
目前在电商领域,游戏化产品主要是作为流量产品存在的,核心目标是为了增强平台的用户粘性,盘活现有的存量用户,提高用户活跃度。

4.png


在游戏化产品未出现前,各大电商基本采用的是“签到”送奖励的形式,提升用户活跃度。从短期效果上,签到同样可以带给用户强烈的激励。然而虚拟币在购物过程中才能形成价值感知,所以单纯虚拟币总量的积累无法形成持续性的激励,用户容易产生厌倦心理。
同时为了平衡商业价值,虚拟币必然带有一定的使用门槛,因此签到价值与用户的购买链路无法即时匹配。用户在购物过程中,无法使用虚拟币时,必然会产生一定的负面情绪。
5.png



为了弥补签到行为中情感体验的缺失,电商平台开始通过游戏化对“签到”产品进行了包装升级。相比较传统的签到产品,游戏化产品的优势在哪里呢?
我认为有以下几个方面:
6.png


1、形成内部触发
根据上瘾模型理论,用户上瘾需要有一个“触发”。而内部触发是产品在用户内心、情感层面上建立的一种潜意识的认知,是产品和用户之间最有力的纽带。
基于游戏“八角行为激励模型”,在产品设计中,可以通过多种手段不断激励用户参与到游戏中(具体内容参见下一篇文章)。用户进入了游戏后,无论是激励体系、游戏玩法,还是视觉设计,都可以更好的触发用户的情感体验点。
同时成长体系、成就体系、好友排名等激励,为用户设定了更加丰富和明确目标,让用户更持久的投入到游戏的玩法中,并逐步在用户意识中形成内部触发,让产品具有更高的用户粘性。


7.png


例如蚂蚁森林对于用户不仅仅是每日7点左右收取能量,更多的是在拿起手机不由自主的打开支付宝,查看有没有能量可以收取。
2、深度激活用户
传统的签到为每日活动,用户更倾向于完成即走,用户链路短,无法挖掘用户的潜在价值。
而游戏玩法丰富,增强了用户链路,同时将玩法细化到小时级的颗粒度,激活用户的活跃度。例如在金币庄园中植物在4个小时内即可成熟采摘,促使用户多次打开产品收取果实。
游戏的任务也更加灵活,通过频次可以满足不同的用户的需要。深度玩家可以反复多次完成任务,普通玩家可以灵活参与,因此对用户的覆盖更广,也有利于普通用户升级为深度玩家。多次和定时的任务,用户需要频繁的进出游戏来获取奖励,从而极大的提高了用户的活跃度,逐渐培养用户玩游戏的习惯。


8.png


3、增加用户停留、提高用户转化
用户的停留时长其实是一种零和博弈,面对激烈的市场竞争,用户在一个平台的停留时长增加,必然会导致另一个平台停留时长的下降。因此大电商在关注用户活跃度的同时,也开始争夺用户停留时长。
游戏化产品拥有更加细化的游戏玩法和任务,无形之中增加了用户的停留时长。同时也为产品提供了更多的机会,埋下各种用户转化触点,提高用户的转化率。例如在游戏任务中,用户需要浏览店铺和商品获得收益。或者在游戏过程中会推送各种优惠券,激励用户转化。
9.png


那么游戏链路和玩法复杂后,会带给用户压力和困扰吗?答案是肯定的。但是由于人们普遍都是“逐利”心理,当面对利益时,用户很容易忽视时间成本和操作成本。
因此游戏中的各种任务多而繁杂,频繁出现的弹窗带来了不好的用户体验。但是对于用户而言,细化的任务体系和营销弹窗更多的是收益,因此用户不会产生大的心理压力和操作负担,反而乐于接受,完成率也更高。于是用户在无意识中会频繁的接触店铺和商品,让转化也变得更加的流畅和自然。
4、减少用户流失
一旦参与到游戏中,用户不仅仅收获了各种虚拟币,还投入了自己的时间和情感,这就是用户的沉没成本。随着时间增加,产品的粘性越强,用户流失几率也就越低。

三、游戏化产品分类

根据电商平台现有的游戏化产品,我们从游戏模式上大致可以分为4大类。


10.png


1、购物抵现类
仿照线下的代金券,电商推出了平台内的代金币。一方面可以吸引用户参加各种运营活动,同时也可以占领用户心智。当出现购物需求时,用户会优先考虑消费代金币完成交易。
淘宝“金币庄园”、京东“种豆得豆”、苏宁“云钻魔法狮”都是这类产品。而深谙游戏玩法的拼多多,则是直接推出了“现金签到”的方式,现金的认知相对于代金币更加强烈,消费方式也更加灵活,可以提现或购物,增强了玩法的价值感和吸引力。


11.png


2、实物领取类
这类游戏以拼多多“多多果园”最为典型,用户只要给选择的果树浇水和施肥,长成后即可获得一份实物水果。
相对于代金币的购物抵现金。实物兑换的目标性更强,而且摆脱了购买交易的概念,让用户感觉自己没有付出任何成本,却得到了一份水果,用户的获得感更强;
3、商品兑换类
用户通过游戏获得奖励,可以兑换相应的商品。例如拼多多“多多赚大钱”、“多多牧场”等。商品兑换模式,跟实物领取方式类似,给用户树立了更加明确的目标,让用户持续的投入精力。而成功兑换后,会带给用户更强的获得感,激励用户继续玩下去。
4、公益捐献类

以蚂蚁森林和蚂蚁庄园为典型代表,而淘宝里的“野生小伙伴”、天猫里的“童话镇”也是此类题材。这类游戏更多是通过公益捐献的形式赋予用户更多的使命感,吸引用户参与,但是带来的用户商业价值不高。目前“野生小伙伴”已经下架,“童话镇”在天猫平台的露出并不明显,用户的感知较弱。

四、总结

爱玩是人类的天性。因此游戏以及游戏化的产品,天然具有高用户粘度和用户活跃度的特质。但是市场上有无数的游戏化产品,为什么有的异常火爆,有的无人问津呢?

在产品设计时需要注意以下几点:

1、游戏化产品之所以受到用户的喜爱,利益点仅仅是表层驱动,游戏的玩法才是产品真正的核心。因此需要通过建立完善的游戏化体系,提升产品的竞争力;

2、游戏化产品竞争激烈,需要不断的进行玩法创新,才能带给用户差异化体验。例如拼多多系列产品,通过实物领取和兑换,带给了用户全新的体验感受,对用户的吸引力也更强;

3、游戏化产品需要赋能商业目标,在实现了用户活跃的基础上,还需要提升用户转化;


作者:子牧先生 

转自 :子牧设计笔谈

640.png

640.png

640.png

640.png

640.png

日历

链接

个人资料

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

存档