首页

最简单理解web前端

前端达人

web前端

web中开发的三个基本技术(html5,css3,JavaScript)

html简介:html语言是纯文本类型的语言,是internet上用来编写网页的主要语言,使用HTML语言编写的网页文件也是标准的纯文本文件(简单说告诉浏览器显示什么)
.
css简介:css是一种网页控制技术,采用css技术,可以有效地对页面、字体、颜色、背景和其他效果实现更加精准的控制
(简单的说告诉浏览器如何显示)
.
JavaScript:JavaScript是web页面中的一种脚本编程语言,也是一种通用的、跨平台的、基于对象和事件驱动并具有安全性的脚本语言。它不需要进行编译,而是直接嵌入HTML页面中,把静态页面变成动态页面。(简单的来说告诉浏览器如何交互)

简单HTML文件结构

<html>/*文件开始*/ <head>/*文件头*/ <title>标题</title>/*文件标题*/ </head> <body>内容</body> </html>/*文件结束*/

HTML常用的标记

<br>换行 <p></p>段落 <s></s>删除线 <b></b>字体粗体 <u></u>下划线 <em></em>斜体内容 <sub></sub> 下标 <sup></sup>上标 <hr></hr>水平线 <a></a>超链接 .....





bool查询简介

Elasticsearch(下面简称ES)中的bool查询在业务中使用也是比较多的。在一些非实时的分页查询,导出的场景,我们经常使用bool查询组合各种查询条件。



Bool查询包括四种子句,



must

filter

should

must_not

我这里只介绍下must和filter两种子句,因为是我们今天要讲的重点。其它的可以自行查询官方文档。



must, 返回的文档必须满足must子句的条件,并且参与计算分值

filter, 返回的文档必须满足filter子句的条件。但是跟Must不一样的是,不会计算分值, 并且可以使用缓存

从上面的描述来看,你应该已经知道,如果只看查询的结果,must和filter是一样的。区别是场景不一样。如果结果需要算分就使用must,否则可以考虑使用filter。



光说比较抽象,看个例子,下面两个语句,查询的结果是一样的。



使用filter过滤时间范围,

GET kibana_sample_data_ecommerce/_search
{
  "size": 1000, 
  "query": {
    "bool": {
      "must": [
        {"term": {
          "currency": "EUR"
        }}
      ],
      "filter": {
        "range": {
          "order_date": {
            "gte": "2020-01-25T23:45:36.000+00:00",
            "lte": "2020-02-01T23:45:36.000+00:00"
          }
        }
      }
    }
  }
}


filter比较的原理

上一节你已经知道了must和filter的基本用法和区别。简单来讲,如果你的业务场景不需要算分,使用filter可以真的让你的查询效率飞起来。



为了说明filter查询的原因,我们需要引入ES的一个概念 query context和 filter context。



query context



query context关注的是,文档到底有多匹配查询的条件,这个匹配的程度是由相关性分数决定的,分数越高自然就越匹配。所以这种查询除了关注文档是否满足查询条件,还需要额外的计算相关性分数.



filter context



filter context关注的是,文档是否匹配查询条件,结果只有两个,是和否。没有其它额外的计算。它常用的一个场景就是过滤时间范围。



并且filter context会自动被ES缓存结果,效率进一步提高。



对于bool查询,must使用的就是query context,而filter使用的就是filter context。



我们可以通过一个示例验证下。继续使用第一节的例子,我们通过kibana自带的search profiler来看看ES的查询的详细过程。



使用must查询的执行过程是这样的:



可以明显看到,此次查询计算了相关性分数,而且score的部分占据了查询时间的10分之一左右。



filter的查询我就不截图了,区别就是score这部分是0,也就是不计算相关性分数。



除了是否计算相关性算分的差别,经常使用的过滤器将被Elasticsearch自动缓存,以提高性能。



我自己曾经在一个项目中,对一个业务查询场景做了这种优化,当时线上的索引文档数量大概是3000万左右,改成filter之后,查询的速度几乎快了一倍。


总结

我们应该根据自己的实际业务场景选择合适的查询语句,在某些不需要相关性算分的查询场景,尽量使用filter context可以让你的查询更加。


Web安全之CSRF实例解析

seo达人

前言

文章首次发表在 个人博客


之前写过一篇 web安全之XSS实例解析,是通过举的几个简单例子讲解的,同样通过简单得例子来理解和学习CSRF,有小伙伴问实际开发中有没有遇到过XSS和CSRF,答案是有遇到过,不过被测试同学发现了,还有安全扫描发现了可能的问题,这两篇文章就是简化了一下当时实际遇到的问题。


CSRF

跨站请求伪造(Cross Site Request Forgery),是指黑客诱导用户打开黑客的网站,在黑客的网站中,利用用户的登陆状态发起的跨站请求。CSRF攻击就是利用了用户的登陆状态,并通过第三方的站点来做一个坏事。


要完成一次CSRF攻击,受害者依次完成两个步骤:


登录受信任网站A,并在本地生成Cookie

在不登出A的情况,访问危险网站B

CSRF攻击


在a.com登陆后种下cookie, 然后有个支付的页面,支付页面有个诱导点击的按钮或者图片,第三方网站域名为 b.com,中的页面请求 a.com的接口,b.com 其实拿不到cookie,请求 a.com会把Cookie自动带上(因为Cookie种在 a.com域下)。这就是为什么在服务端要判断请求的来源,及限制跨域(只允许信任的域名访问),然后除了这些还有一些方法来防止 CSRF 攻击,下面会通过几个简单的例子来详细介绍 CSRF 攻击的表现及如何防御。


下面会通过一个例子来讲解 CSRF 攻击的表现是什么样子的。

实现的例子:

在前后端同域的情况下,前后端的域名都为 http://127.0.0.1:3200, 第三方网站的域名为 http://127.0.0.1:3100,钓鱼网站页面为 http://127.0.0.1:3100/bad.html。


平时自己写例子中会用到下面这两个工具,非常方便好用:

http-server: 是基于node.js的HTTP 服务器,它最大的好处就是:可以使用任意一个目录成为服务器的目录,完全抛开后端的沉重工程,直接运行想要的js代码;

nodemon: nodemon是一种工具,通过在检测到目录中的文件更改时自动重新启动节点应用程序来帮助开发基于node.js的应用程序

前端页面: client.html


<!DOCTYPE html>

<html lang="en">


<head>

   <meta charset="UTF-8">

   <meta name="viewport" content="width=device-width, initial-scale=1.0">

   <meta http-equiv="X-UA-Compatible" content="ie=edge">

   <title>CSRF-demo</title>

   <style>

       .wrap {

           height: 500px;

           width: 300px;

           border: 1px solid #ccc;

           padding: 20px;

           margin-bottom: 20px;

       }

       input {

           width: 300px;

       }

       .payInfo {

           display: none;

       }

       .money {

           font-size: 16px;

       }

   </style>

</head>


<body>

   <div class="wrap">

       <div class="loginInfo">

           <h3>登陆</h3>

           <input type="text" placeholder="用户名" class="userName">

           <br>

           <input type="password" placeholder="密码" class="password">

           <br>

           <br>

           <button class="btn">登陆</button>

       </div>

       

       

       <div class="payInfo">

           <h3>转账信息</h3>

           <p >当前账户余额为 <span class="money">0</span>元</p>

           <!-- <input type="text" placeholder="收款方" class="account"> -->

           <button class="pay">支付10元</button>

           <br>

           <br>

           <a href="http://127.0.0.1:3100/bad.html" target="_blank">

               听说点击这个链接的人都赚大钱了,你还不来看一下么

           </a>

       </div>

   </div>

</body>

<script>

   const btn = document.querySelector('.btn');

   const loginInfo = document.querySelector('.loginInfo');

   const payInfo = document.querySelector('.payInfo');

   const money = document.querySelector('.money');

   let currentName = '';

   // 第一次进入判断是否已经登陆

   Fetch('http://127.0.0.1:3200/isLogin', 'POST', {})

   .then((res) => {

       if(res.data) {

           payInfo.style.display = "block"

           loginInfo.style.display = 'none';

           Fetch('http://127.0.0.1:3200/pay', 'POST', {userName: currentName, money: 0})

           .then((res) => {

               money.innerHTML = res.data.money;

           })

       } else {

           payInfo.style.display = "none"

           loginInfo.style.display = 'block';

       }

       

   })

   // 点击登陆

   btn.onclick = function () {

       var userName = document.querySelector('.userName').value;

       currentName = userName;

       var password = document.querySelector('.password').value;

       Fetch('http://127.0.0.1:3200/login', 'POST', {userName, password})

       .then((res) => {

           payInfo.style.display = "block";

           loginInfo.style.display = 'none';

           money.innerHTML = res.data.money;

       })

   }

   // 点击支付10元

   const pay = document.querySelector('.pay');

   pay.onclick = function () {

       Fetch('http://127.0.0.1:3200/pay', 'POST', {userName: currentName, money: 10})

       .then((res) => {

           console.log(res);

           money.innerHTML = res.data.money;

       })

   }

   // 封装的请求方法

   function Fetch(url, method = 'POST', data) {

       return new Promise((resolve, reject) => {

           let options = {};

           if (method !== 'GET') {

               options = {

                   headers: {

                       'Content-Type': 'application/json',

                   },

                   body: JSON.stringify(data),

               }

           }

           fetch(url, {

               mode: 'cors', // no-cors, cors, *same-origin

               method,

               ...options,

               credentials: 'include',

           }).then((res) => {

               return res.json();

           }).then(res => {

               resolve(res);

           }).catch(err => {

               reject(err);

           });

       })

   }

   

</script>


</html>

实现一个简单的支付功能:


会首先判断有没有登录,如果已经登陆过,就直接展示转账信息,未登录,展示登陆信息

登陆完成之后,会展示转账信息,点击支付,可以实现金额的扣减

后端服务: server.js


const Koa = require("koa");

const app = new Koa();

const route = require('koa-route');

const bodyParser = require('koa-bodyparser');

const cors = require('@koa/cors');

const KoaStatic = require('koa-static');


let currentUserName = '';


// 使用  koa-static  使得前后端都在同一个服务下

app.use(KoaStatic(__dirname));


app.use(bodyParser()); // 处理post请求的参数


// 初始金额为 1000

let money = 1000;


// 调用登陆的接口

const login = ctx => {

   const req = ctx.request.body;

   const userName = req.userName;

   currentUserName = userName;

   // 简单设置一个cookie

   ctx.cookies.set(

       'name',

       userName,

       {

         domain: '127.0.0.1', // 写cookie所在的域名

         path: '/',       // 写cookie所在的路径

         maxAge: 10 * 60 * 1000, // cookie有效时长

         expires: new Date('2021-02-15'),  // cookie失效时间

         overwrite: false,  // 是否允许重写

         SameSite: 'None',

       }

     )

   ctx.response.body = {

       data: {

           money,

       },

       msg: '登陆成功'

   };

}

// 调用支付的接口

const pay = ctx => {

   if(ctx.method === 'GET') {

       money = money - Number(ctx.request.query.money);

   } else {

       money = money - Number(ctx.request.body.money);

   }

   ctx.set('Access-Control-Allow-Credentials', 'true');

   // 根据有没有 cookie 来简单判断是否登录

   if(ctx.cookies.get('name')){

       ctx.response.body = {

           data: {

               money: money,

           },

           msg: '支付成功'

       };

   }else{

       ctx.body = '未登录';

   }

}


// 判断是否登陆

const isLogin = ctx => {

   ctx.set('Access-Control-Allow-Credentials', 'true');


   if(ctx.cookies.get('name')){

       ctx.response.body = {

           data: true,

           msg: '登陆成功'

       };


   }else{

       ctx.response.body = {

           data: false,

           msg: '未登录'

       };

   }

}

// 处理 options 请求

app.use((ctx, next)=> {

   const headers = ctx.request.headers;

   if(ctx.method === 'OPTIONS') {

       ctx.set('Access-Control-Allow-Origin', headers.origin);

       ctx.set('Access-Control-Allow-Headers', 'Content-Type');

       ctx.set('Access-Control-Allow-Credentials', 'true');

       ctx.status = 204;

   } else {

       next();

   }

})


app.use(cors());

app.use(route.post('/login', login));

app.use(route.post('/pay', pay));

app.use(route.get('/pay', pay));

app.use(route.post('/isLogin', isLogin));


app.listen(3200, () => {

   console.log('启动成功');

});

执行 nodemon server.js,访问页面 http://127.0.0.1:3200/client.html


CSRF-demo


登陆完成之后,可以看到Cookie是种到 http://127.0.0.1:3200 这个域下面的。


第三方页面 bad.html


<!DOCTYPE html>

<html lang="en">

<head>

   <meta charset="UTF-8">

   <meta name="viewport" content="width=device-width, initial-scale=1.0">

   <title>第三方网站</title>

</head>

<body>

   <div>

       哈哈,小样儿,哪有赚大钱的方法,还是踏实努力工作吧!

       <!-- form 表单的提交会伴随着跳转到action中指定 的url 链接,为了阻止这一行为,可以通过设置一个隐藏的iframe 页面,并将form 的target 属性指向这个iframe,当前页面iframe则不会刷新页面 -->

       <form action="http://127.0.0.1:3200/pay" method="POST" class="form" target="targetIfr" style="display: none">

           <input type="text" name="userName" value="xiaoming">

           <input type="text" name="money" value="100">

       </form>

       <iframe name="targetIfr" style="display:none"></iframe>

   </div>

</body>

<script>

   document.querySelector('.form').submit();

</script>

</html>

使用 HTTP-server 起一个 本地端口为 3100的服务,就可以通过 http://127.0.0.1:3100/bad.html 这个链接来访问,CSRF攻击需要做的就是在正常的页面上诱导用户点击链接进入这个页面

CSRF-DEMO


点击诱导链接,跳转到第三方的页面,第三方页面自动发了一个扣款的请求,所以在回到正常页面的时候,刷新,发现钱变少了。

我们可以看到在第三方页面调用 http://127.0.0.1:3200/pay 这个接口的时候,Cookie自动加在了请求头上,这就是为什么 http://127.0.0.1:3100/bad.html 这个页面拿不到 Cookie,但是却能正常请求 http://127.0.0.1:3200/pay 这个接口的原因。


CSRF攻击大致可以分为三种情况,自动发起Get请求, 自动发起POST请求,引导用户点击链接。下面会分别对上面例子进行简单的改造来说明这三种情况


自动发起Get请求

在上面的 bad.html中,我们把代码改成下面这样


<!DOCTYPE html>

<html>

 <body>

   <img src="http://127.0.0.1:3200/payMoney?money=1000">

 </body>

</html>

当用户访问含有这个img的页面后,浏览器会自动向自动发起 img 的资源请求,如果服务器没有对该请求做判断的话,那么会认为这是一个正常的链接。


自动发起POST请求

上面例子中演示的就是这种情况。


<body>

   <div>

       哈哈,小样儿,哪有赚大钱的方法,还是踏实努力工作吧!

       <!-- form 表单的提交会伴随着跳转到action中指定 的url 链接,为了阻止这一行为,可以通过设置一个隐藏的iframe 页面,并将form 的target 属性指向这个iframe,当前页面iframe则不会刷新页面 -->

       <form action="http://127.0.0.1:3200/pay" method="POST" class="form" target="targetIfr">

           <input type="text" name="userName" value="xiaoming">

           <input type="text" name="money" value="100">

       </form>

       <iframe name="targetIfr" style="display:none"></iframe>

   </div>

</body>

<script>

   document.querySelector('.form').submit();

</script>

上面这段代码中构建了一个隐藏的表单,表单的内容就是自动发起支付的接口请求。当用户打开该页面时,这个表单会被自动执行提交。当表单被提交之后,服务器就会执行转账操作。因此使用构建自动提交表单这种方式,就可以自动实现跨站点 POST 数据提交。


引导用户点击链接

诱惑用户点击链接跳转到黑客自己的网站,示例代码如图所示


<a href="http://127.0.0.1:3100/bad.html">听说点击这个链接的人都赚大钱了,你还不来看一下么</a>

用户点击这个地址就会跳到黑客的网站,黑客的网站可能会自动发送一些请求,比如上面提到的自动发起Get或Post请求。


如何防御CSRF

利用cookie的SameSite

SameSite有3个值: Strict, Lax和None


Strict。浏览器会完全禁止第三方cookie。比如a.com的页面中访问 b.com 的资源,那么a.com中的cookie不会被发送到 b.com服务器,只有从b.com的站点去请求b.com的资源,才会带上这些Cookie

Lax。相对宽松一些,在跨站点的情况下,从第三方站点链接打开和从第三方站点提交 Get方式的表单这两种方式都会携带Cookie。但如果在第三方站点中使用POST方法或者通过 img、Iframe等标签加载的URL,这些场景都不会携带Cookie。

None。任何情况下都会发送 Cookie数据

我们可以根据实际情况将一些关键的Cookie设置 Stirct或者 Lax模式,这样在跨站点请求的时候,这些关键的Cookie就不会被发送到服务器,从而使得CSRF攻击失败。


验证请求的来源点

由于CSRF攻击大多来自第三方站点,可以在服务器端验证请求来源的站点,禁止第三方站点的请求。

可以通过HTTP请求头中的 Referer和Origin属性。


HTTP请求头


但是这种 Referer和Origin属性是可以被伪造的,碰上黑客高手,这种判断就是不安全的了。


CSRF Token

最开始浏览器向服务器发起请求时,服务器生成一个CSRF Token。CSRF Token其实就是服务器生成的字符串,然后将该字符串种植到返回的页面中(可以通过Cookie)

浏览器之后再发起请求的时候,需要带上页面中的 CSRF Token(在request中要带上之前获取到的Token,比如 x-csrf-token:xxxx), 然后服务器会验证该Token是否合法。第三方网站发出去的请求是无法获取到 CSRF Token的值的。

其他知识点补充

1. 第三方cookie

Cookie是种在服务端的域名下的,比如客户端域名是 a.com,服务端的域名是 b.com, Cookie是种在 b.com域名下的,在 Chrome的 Application下是看到的是 a.com下面的Cookie,是没有的,之后,在a.com下发送b.com的接口请求会自动带上Cookie(因为Cookie是种在b.com下的)


2. 简单请求和复杂请求

复杂请求需要处理option请求。


之前写过一篇特别详细的文章 CORS原理及@koa/cors源码解析,有空可以看一下。


3. Fetch的 credentials 参数

如果没有配置credential 这个参数,fetch是不会发送Cookie的


credential的参数如下


include:不论是不是跨域的请求,总是发送请求资源域在本地的Cookies、HTTP Basic anthentication等验证信息

same-origin:只有当URL与响应脚本同源才发送 cookies、 HTTP Basic authentication 等验证信息

omit: 从不发送cookies.

平常写一些简单的例子,从很多细节问题上也能补充自己的一些知识盲点。

后来居上的抖音,做对了什么?

资深UI设计者

当下“两微一抖”已成为企业品牌传播必备的渠道策略,可见抖音的江湖地位不容小觑。

抖音,诞生于2016年9月,是一款“音乐创意”短视频社交软件。截至2020年1月,其日活跃用户数突破4亿,而同属短视频行业的快手的日活跃用户数也才刚过3亿。要知道,在2016年6月,当时抖音还没上线,快手就坐拥3亿注册用户数。显而易见,抖音不过是一个后起之秀,却能傲视群雄。

短视频行业的数据统计

也有数据表明,抖音用户的粘性很大,转去玩快手的用户只有55.6%,反而快手用户转去玩抖音的高达68.2%。快手高级副总裁马宏斌也曾透露,快手前100名的大V有70个是抖音用户,抖音前100名的大V只有50个是快手用户。

想知道抖音是如何后来居上,必先了解冰山模型

一般认为,一个人80%的成功几率是由冰山模型水平面以下要素:动机、价值观/性格和综合能力决定的,另外20%是由冰山模型水平面以上要素:经验和技能决定的。

而且,上层要素的生长受到底层要素的制约:一个人有什么样的动机,就会促使他/她着重培养哪方面的综合能力;有什么样的价值观/性格,对他/她的行为举止也会产生一定约束力,什么该做,什么不该做。

互联网产品的冰山模型

如果把一家互联网公司的品牌视为一个人,那么动机就是品牌价值,价值观/性格就是品牌人格,综合能力就是营销4C中的用户需求(Customer)和学习成本(Cost),经验和技能就是营销4C中的消除障碍(Convenience)和用户运营(Communication)。

抖音的成功可从冰山模型自下而上进行总结:

1. 底层构建了一个让人为之惊叹的品牌人格

从最初的品牌Slogan——让崇拜从这里开始,以及有一头条的员工在朋友圈晒出公司的背景墙——让更多人的美好生活被看见,可以看出抖音成立的动机——帮助更多人提升个人知名度。

字节跳动的公司背景墙

这个动机是基于对社会冲突的深刻洞察:近年来各类选秀节目(如:中国好声音、超级女声等)的热播透露出许多年轻人心藏一个明星梦,但由于家庭出身、人际资源、社会财富等先天条件限制不得不放弃追逐梦想。城市已经发展到需要一个品牌来给这批年轻人创造机会的时候,抖音应运而生。

作为一个创造者,抖音还找到了提升个人知名度应该具备的人格特质——精致(Sophistication),并以这样的人格特质与城市年轻群体沟通,包括借助明星光环来诠释何为精致、掷重金在各大城市举办美好生活节……这些事件在目标群体里迅速传开,并取得目标人群的情感认同和品牌信任。

在抖音里明星云集

注:精致(Sophistication)、称职(Competence)、刺激(Excitement)、坚韧(Ruggedness)和真诚(Sincerity)是J.Aaker通过问卷调查得出的五大最容易被消费者感知的人格特质,而且这五大特质也能概括许多流行品牌在消费者心目中的人格形象。

2. 浅层做到了品牌价值稳定输出及承诺兑现

在站内,抖音致力于帮助更多人提升个人知名度,加强产品功能和用户体验,让更多人得到同等机会展示自我。

在用户需求(Customer)方面,采用了去中心化内容分发机制,当内容创作者发布一条短视频后,抖音并不是把这条短视频发给创作者的所有粉丝用户,而是小范围分发测试这条短视频的潜力,让可能喜欢这类内容的标签用户通过行动来评价。只有获得更多用户认可的优质短视频才能得到二次流量推荐,进而成为爆款,创作者就有机会爆红。同时,采用了全屏自动播放模式,让每一条短视频都能被观看,不失为一种公平竞争。

抖音的产品功能

在学习成本(Cost)方面,采用了中心化内容生产机制,组建了服务达人的MCN机构,由平台签约明星、网红和大V推出一个个可复制、易模仿的有趣短视频,降低用户学习门槛。同时,运营团队也会不定期发起各类短视频挑战赛,提供各种滤镜、剪辑技能、流行音乐等素材,即使普通用户没有创新力,跟风模仿也能拍出看起来酷炫的、专属于自己的15秒“大片”。

3. 顶层把精致人格和品牌决心展示得更直观

在站外,抖音秉承“精致”理念开展一系列PUGC营销活动,持续影响用户的感知,并不断强化精致的人格特质。

抖音冠名综艺节目

在消除障碍(Convenience)方面,抖音通过冠名一些和明星互动的综艺节目,比如中国有嘻哈、快乐大本营、天天向上等,借助节目酷炫的舞台效果和高度吻合的受众群体,消除年用户从产品感知到下载应用之间存在的疑虑——抖音是否有实力助我提升知名度?事实上,抖音已经帮助不少草根明星(如刘宇宁、陆超等)登上主流媒体的舞台,让用户看到了展示自我的机会、成为明星的希望。

在用户运营(Communication)方面,除了大众明星入驻,引入其他平台的网红和大V,还与多家MCN机构合作,扶持和培养平台内的潜力用户,保证内容的质量和持续产出。同时,不定期更新挑战活动、热门搜索、加强品牌合作激励用户创作,以增强用户对抖音的依赖和活跃。在参与创作的过程中,用户也能得到抖音提供的专群维护、不定时礼物、拍摄指导、流量曝光等多方面帮助。

抖音品牌活动及福利

写到这里,你可能会惊叹一声:哦,原来如此!

但是换到自己来做品牌、运营产品,你就会一脸懵逼了。要么无从下手,要么觉得每天的工作就是打杂,不知道做这些运营动作意义何在。你制定的运营计划也可能是杂乱无章,运营策略多半也是效仿其他大品牌,在各个产品生命周期阶段没有什么不同。

产品运营人的苦恼

产品运营的策略制定

所以,我们应该从抖音身上学如何“做正确的事“,并且”正确地做事“——把产品当作对社会有贡献的人来培养,寻找能让它快速被社会接纳的人格特质(做正确的事),然后在不同的成长阶段制定相应的历练计划,并长期坚持做事风格的一致性,而不是一天一个花样模糊了用户对品牌的印象(正确地做事)。

从抖音身上学如何“做正确的事“

第一步,了解产品所属的行业发展到哪一阶段

行业生命周期曲线

探索期:市场供给量和需求量低,增长速度只有3%左右。只有一部分有研发实力的企业在生产产品,因为试错率高、生产成本高,使得企业不敢做出太多花样,产品售价普遍也高。对于消费者来说,老产品的转换成本高,新产品的功能还不稳定,普遍是观望态度。

成长期:市场供给量和需求量增加,增长速度达到10%以上。这时候产品技术已取得突破性进展,可大规模复制生产,部分产品还是供不应求。随着进入市场的企业数量增多,企业的竞争就是价格战(红包、补贴)和产品多元化,助长了市场抢购风气,强化了消费者对价格的敏感性。

成熟期:市场供给量和需求量接近峰值,增长速度在5%以下。企业占有的市场份额越多,其产品销路越宽卖得越好。企业之间的竞争从瓜分空白市场变成了抢占对手的市场,营销手段多了起来,导致消费者出现了选择困难症,这时企业的口碑开始发挥了作用。

衰退期:市场供给量和需求量下降,增长速度在0%以下。消费者的消费观念改变了,市场出现了供过于求的现象,而替代品日益增多又带来冲击,企业开始大批量清理库存,行业标杆在现有的口碑基础上向新产业转型,小工厂则因资金不足被迫退出市场。

从行业的发展规律来看,只有产品的企业会因行业变化而被淘汰,但是有好口碑的企业却不会,因为它可以引导用户消费来应对市场挑战。

第二步,在当前发展阶段应为用户带来耳目一新

新媒体时代下的需求

首先,根据行业供给和需求特点细分出公司产品的目标用户群,描绘能给产品创造最大价值的核心人群画像,然后洞察他们在社交生活中未被得到满足的需求:在新媒体时代,每个人都想成为“主角”,年轻人更急于寻求个性表达,但自拍效果不够酷,也没有太多技能加持。

其次,了解标杆/竞争对手又是如何解决这些现实冲突,对目标用户群说了什么。作为抖音的头号竞争对手——快手,以“记录世界,记录你”作为Slogan,具有很浓的个人主义色彩,乍一看以为是帮助感情受到挫折的人走出伤痛,学会自我疗愈。

最后,顺势而为,不违背或超前于行业发展,将核心人群的需求痛点与公司产品利益点建立连接,从事实主张、认知区隔、情感主张和价值区隔中挑选适合当下的一种广告内容。

不同生命阶段的产品广告内容

事实主张:根据品牌内部能力或资源的明显优势进行突出定位,传达所具备的事实优势壁垒,直击重点。如:早期的抖音——让崇拜从这里开始。

适用评估:企业在行业中具有先发优势,在组织资源方面具有强大的科研能力、上市速度快,在产品/服务方面是行业唯一,不容易被模仿/超越。

认知区隔:在受众心中建立独特记忆认知,让受众对于该品牌和其他某种特定行为或体验产生强关联,从而做出选择。如:现在的抖音——记录美好生活。

适用评估:行业中出现了新的关键驱动因素,消费者心智中还有其他尚未被占领的空间。

情感主张:提炼品牌中蕴含的情感因素,通过向受众传递美好的情感联想,让受众将心中期望憧憬与品牌实现关联。如:格力——让世界爱上中国造。

适用评估:除功能性需求外,目标用户群还有情感性需求未被满足。相比竞争对手,产品包装设计、信息传播更能触动用户情感,公司愿景能够引发消费者共鸣。

价值区隔:传达品牌对于受众产生的某种独特价值观,且能通过产品体现在受众心中形成心理认同,产生价值共鸣。如:耐克——Just do it。

适用评估:已经积累了一定数量的用户群,公司愿景切换用户心理并引领时代,取得了行业KOL、大V等背书。

第三步,扮演极具感染力的人来讲品牌价值所在

品牌人格原型及特质

将创始人/团队个性特征和公司产品的发展愿景两方面因素综合匹配,找到适合公司长远发展的人格原型。

不同的品牌塑造如同人的成长,不同的基因决定了不同的人格,不同的人格决定了不同的传播调性,不同的传播调性又决定了受众对品牌的不同反应。有生命力的长寿品牌是具有人格原型的。一个成功的品牌人格,可以让品牌拉近与用户的情感距离,并且在用户心智刻画出鲜明难忘的品牌形象。

所以,确立相应的品牌人格后,找出核心人群最可能听具有什么样人格特质的人说的话,然后学习这类人的表达方式、行动风格等,以此作为产品运营的人设模板并长期坚持不断强化。

第四步,明确当前产品生命阶段的任务是什么

产品生命周期曲线

产品所处的生命周期阶段一般可从以下几个方面进行判断:

  1. 将产品日下载量/销量变化趋势曲线与生命周期的“S”曲线拟合;
  2. 将产品累计下载量/销量与市场总量及潜在用户总量对比,评估上升的可能性;
  3. 将产品的百度指数与行业标杆/头部竞品的对比,客观评价产品的差距;
  4. 观察产品的日/月活量、营收等平台数据波动情况,预判上升的幅度大小。

探索期:日下载量/销量极低,市场占有率几乎为0。该阶段主要任务就是寻找高质量的种子用户,让用户参与产品体验,并对产品提出优化建议。种子用户一般控制在100个左右,多了会交流不过来,严重地会导致分不清主次需求。这些种子用户可以是有一定圈子影响力的同事或朋友,与产品沾边的相关领域意见领袖(KOL),微信(群)、微博、垂直论坛等网络大V。那么如何让对方搭理我们愿意成为种子用户?我们得事先准备一个鼓舞人心的品牌故事,愿景是致力于解决某一个非常紧迫的社会难题,现正寻找一群志同道合的人一起攻克。

成长期:日下载量/销量、 日/月活量、营收增多而且增速较快,但与头部竞品的市场占有率相比还有很大差距。该阶段的主要任务就是激发用户尚未意识到或未被满足的需求,一旦使用产品后能够给生活带来不一样的感觉。例如,有些年轻人喜欢自拍模仿明星,但鲜有人围观,最终沦为自娱自乐。于是抖音推出一条“找呀找呀找爱豆”竞猜H5,一下子刷爆了朋友圈,为模仿者,也为抖音带来了巨大的流量关注。在那之后,抖音开始找一些明星合作增加产品流量和话题,让更多的用户也加入到抖音队伍中来。

让抖音一炮而红的宣传

成熟期:日下载量/销量基本稳定,已占据了一定市场规模,但日/月活量、营收仍在增加。该阶段主要任务就是对用户进行精细化运营,围绕用户的地域、人口特征、消费品类、品牌偏好,购物行为、生活场景和用户价值七大维度进行用户分群贴标签,然后收集用户贡献值,如活跃度、购买力情况等数据将用户按二八原则分为不同等级:1%为重要客户,19%为主要客户,30%为普通客户,50%为长尾客户,让不同等级用户享受到不同的专属服务,培养用户的忠诚度和提高客单价。

衰退期:日下载量/销量、日/月活量、营收均出现明显下滑。该阶段主要任务就是牢牢把握住核心用户,通过发起有影响力的社会公益活动扩大品牌影响力的边界,开发出和产品/服务强相关的常用周边产品,满足用户的新需求。同时关注行业的潜在进入者动态,通过升维或降维的方式尝试创新转型,升维是指增加自身的实力,给同质化的产品或服务附加超值的东西;降维是指用高级、全套的打法平移到相对落后的空间,如车企推出网约车服务。

第五步,按照原先拟定的品牌人格组织内容运营

人格是贯穿始终的唯一宗旨,包括内容定位、行文风格、推送时间等在长时间内都是保持不变,让内容集成为一个有人格特质、高辨识度的符号。

内容运营的基本流程

首先,打好内容定位的核心基础,分析用户TA是谁、在哪、每天在做什么、有什么偏好等等,制作出不同于竞品的差异化内容,如图文、视频等类型上的差异,漫画、直播、弹幕等形式上的差异,猎奇、愉悦、慰藉等需求上的差异,形成产品特有的内容亮点。内容亮点是热点和特点的集合,热点源于长期不断积累的素材库、百度热搜和微博热搜,特点则是产品特性和品牌人格的总结。

其次,建立内容生产的素材库和人才库。素材库的建立主要通过以下三种方式,一是对时事保持敏感,搜集和整理每天的新闻热点;二是对舆论保持敏感,通过百度搜索风云榜、微博热搜实时榜等网络渠道了解当下的热点;三是保持的运营思维,收藏和分析最近的优秀内容案例。

人才库的建立通常是先寻找和记录的优质内容创作者,包括个人和机构,然后联系和维护这些优质内容创作者,平时也多加留意热点文章的作者,随时更新和完善优质内容创作者的信息。

当然人才的关系维护离不开一整套合理的合作机制:找到能够帮我们传达信息和组织其他用户的超级用户后,要用产品资源对其进行包装和曝光,如:经纪团队挖出杨超越“村花”这个事件点后,通过节目再不断发酵出各种新的事件。然后再找更多的超级用户,复制这一模式,不断重复循环操作。也可以从不同角度对内容生产者设置不同的奖项,如:微博之夜,由官方定小奖,用户投票定大奖,让80%的用户参与评选,最终给20%的用户颁奖。

再次,有组织地进行内容加工和包装。常见的高级包装有专题和专栏两种:专题是特定事件的内容集合(世界杯专题)、特定时间的内容集合(6月原创歌曲排行榜)、特定场景的内容集合(抖in City 美好生活节)。专栏是特定主题的连续内容(今日说法)、特定领域的连续内容(舌尖上的中国)、特定形式的连续内容(焦点访谈)。

一般加工流程是根据内容的定位确定要生产的内容主题,搭建最终想要呈现的内容框架,用最酷或最土的方式击中用户。再从素材库中挑选出有用的元素,撰写一个优秀的内容策划方案,在特定的时间推一些能引起目标用户情感共鸣的话题。也可以把内容框架和素材给到人才库的创作者,将他们生产的内容包装成一个栏目。又或者把所有具备共性的内容抽离出来,提炼出一个主题,这个主题是没有立场之分,能够引起正反方辩论的。

最后,在用户可触达的渠道发布内容。试想在0预算的情况下,借势热点利用产品功能以不同的方式(Push、Banner、客服等)内推给用户,或者在免费平台(微信微博)建立基础的外推渠道。也可以在一条或多头内容上加入玩法(如:评论、直播、弹幕、测试等),引导用户进行互动传播。为了能让用户有意愿参与,可按用户分层(人群、年龄、工作标签、用户等级等)、内容分层(超级内容、头部内容、信息流内容)、时间场景(上班、周末、休假等)、空间场景(办公、餐厅、酒店等)进行内容精准推荐。个人建议,任何栏目或版块都应有C位内容,把它们放在最显眼的位置。

第六步,策划活动让品牌人格常在用户眼前晃动

根据活动举办的周期性,活动类型可分为常规活动、原创活动和节点活动三类。

常规活动,主要包括各种节假日活动、用户共知的节日活动,比如世界杯、NBA总决赛、奥斯卡颁奖等;

原创活动,主要是一些品牌积累到了一定用户基础并有广泛的品牌认知,结合产品本身特点打造的专属性活动,比如天猫的双十一,京东的618等;

节点活动,主要是针对产品生命周期的用户特点开展的重大运营活动,比如为了需求唤醒、信息互动在拉新阶段开展的【新人红包】,为了培养使用习惯、购买升级在促活阶段开展的【每日签到】,为了增强购买升级、精细服务在转化阶段开展的【首单立减】,为了建立用户口碑在传播阶段开展的【分享有礼】。

节点活动目的及手段

每一个活动必须要有一个目标,活动运营的目的无非就是提升粘性、加快用户转化、增强消费决策、提升用户复购和扩大活动传播五个要点。

活动策划的目的及手段

提升用户粘性,实现该目标的关键点(或者说如何让用户养成使用产品的习惯)是让用户在产品上消耗时间,有时间投入,或对产品价值有一定预期,常用的手段就是每日签到各种任务;

加快用户转化,实现该目标的关键点(或者说如何让用户产生付费的意愿)是突出产品在某一方面的实用价值,常用的手段是红包/优惠券,新人特权;

增强消费决策,实现该目标的关键点(或者说如何催促用户尽快下单)是通过价格冲击和优惠策略刺激用户消费,常用的手段是限时秒杀,特殊优惠;

提升用户复购,实现该目标的关键点(或者说如何让用户多次购买,买的更多)是为用户提供信息筛选或新奇有趣的内容,常用的手段是内容/商品精选,特定补贴;

扩大活动传播,实现该目标的关键点(或者说如何让用户主动分享产品信息)是赋予产品更多的内容娱乐价值和社交价值,常用的手段是转发/邀请有奖,测试小游戏。

第七步,以强化品牌人格为目的开展用户运营

本着与用户交朋友的心态服务用户,循序渐进为用户谋福利,让用户感知到并不断强化品牌的人格特质。

用户运营的基本流程

拉新:利用高频使用、刚需、大众化需求等流量爆品(如公交刷卡、比价搜索等),以丰富内容形式(如直播、短视频、吉祥物IP等)来吸引用户的策略,进行搜索引擎、新媒体平台、应用商店等线上宣传,或扫楼发传单、赠品合作、地面广告等线下硬广。但是宣传渠道并不是越多越好,事前需要考虑到关于流量效率的问题并做好渠道调研,是不是精准流量来的用户,拉新渠道不精准,获客成本高,用户质量差。

在宣传过程中,适当使用折扣、抽奖、代金券、红包、限时限量购等营销工具,或者团购、预售/众筹、邀请返利、二级分销等社群裂变方法。值得注意的是每一款产品都应该有一个核心的拉新手段/方式,东打一棒西揍一拳,如此从各个渠道得到的流量不会太多。所以建立快速稳定的热点扩散渠道是有必要的,推荐一种方法:强控公司员工朋友圈,然后维护核心种子用户群,再利用双微一抖等第三方管理工具进行效果检测,最后对每个热点创意进行总结、复盘和优化。

盘活:从用户接触产品后需要有一个引导文案或指导规范,突出产品核心功能、利益点,让用户知道这款产品是干嘛用的,对TA有什么好处,给他什么东西希望TA留下来。常见的引导方案就是设计丰富的新手特权,引导用户尝试不同类型资产投资,比如完成签到、转发、评论、收藏等各种任务就可以获得各种奖励。用户能够完整地使用或操作产品全流程,才算是一个有效的、相对稳定的新用户。如果产品服务体验不精准/认知度差,新用户容易流失、产品口碑差。

防流失:一次给用户发多张券,分为不同的面额和门槛,引导用户完成5次以上消费,同时设置连续购买多单就给奖励,缩短付费时间间隔,加速用户生命周期的进化。还可以搭建常态化的活动体系,在固定的时间点(如:每天10点,每月8日等)开展每日秒杀、限时抢购、会员日等的促销活动,让用户形成具备记忆点的活动预期。

对于一个已经流失的用户,可以通过电话召回(重点用户)、短信/App消息、品牌宣传(老用户)、大型促销活动等手段召回,为他们提供限时特权、红包/抵用券、新品发布/重大改版、重点促销商品等新体验。为什么我们宁愿花时间去召回一个老用户而不是寻找新用户,因为召回一个老用户带来的效益要远大于一个新用户的获取成本,老用户已经熟悉我们的产品,不需要太多的教育成本,而且能够直接带来效益的。当然并不是真的等到用户已经流失才会采取行动,我们可以通过RFM模型监控用户活跃情况,对潜在的流失用户进行预警,并且采取相应的挽留措施。

强粘性:建立用户成长体系,比如用户积分体系、积分商城,用户等级体系、会员体系、勋章、证书等。用户成长体系是一整套驱动用户成长的运营机制,是在用户数据模型的基础上,比如交易类产品的累计交易金额、交易频次、交易类型、交易质量等,内容类产品的用户参与度、内容贡献度、用户活跃度等,工具类产品的用户活跃度、用户ARPU值、用户访问时长等,找到用户成长的关键路径和核心驱动力,从而搭建用户成长的激励通道和连接用户行为的触达通道。

促转化:常见的有提高客单价、增加关联购买和拓展盈利模式三种手段。提高客单价手段再细化就是满额立减、满件立减的满减优惠,加N元送配件/日化用品的加价购,第二件半价的N件N折。制作场景、季节专题或推出产品套装就是为了增加关联购买。在拓展盈利模式里,除了线下探索,将产品和服务延展到线下,寻找产品/服务强相关的常用周边商品,提高品类的丰富度。还可以设置会员专属服务,不同等级会员享受不同的服务,首次付费有优惠。

在用户运营工作中最难的是搭建用户成长体系。当然不建议产品刚上线就做用户成长体系,当用户达到一定量级,知道哪些用户对产品贡献值最大后再考虑要不要做、怎么做,而且用户等级不易超过4级。据调查,抖音至今都没有对外公开(就当不存在)用户成长体系,用户也不会知道自己处于哪个等级,有哪些特殊权益。

用户成长体系搭建的基本流程

首先建模型,可以沿用用户漏斗模型,提升从访客、下单到支付每个环节的运营效率,实时关注用户反馈,看用户是在哪个点流失的,这个点就是要优化的地方;也可以沿用用户生命周期模型,判断用户处于哪一阶段,设定对应的运营规则;还可以沿用用户价值模型,根据用户在不同阶段对产品的贡献度,设定对应的运营规则。

其次搭通道,激励通道主要有秒杀/限时抢购、抽奖、代金券/红包、特权等级、积分/成长值/经验值、任务引导;触达通道主要包括关键访问路径、短信、邮件、产品通知功能、微信渠道、个性化Push等。

最后促成长,通常采用补贴策略、在成长节点触发消息推送和抓牢动力引擎三种方式。动力引擎主要包括:内容类产品的高质量、率、内容形态丰富,电商类产品的低价格、高品质、物流快、品类丰富,教育类产品的优秀师资、系统化教学,金融类产品的供给渠道、电商化、游戏化,出行/外卖类产品的供给驱动、匹配、优质服务,工具类产品的解决具体问题的效率。

第八步,环顾行业发展部署下一阶段运营重心

了解行业发展及竞争对手动态,及时调整品牌的价值主张,加快催熟成长期的产品,或扩大品牌影响力的边界延长产品的成熟期。无论运营重心怎么变,但品牌人格和人格特质不能改变。

在扩大品牌影响力的边界方面,除了借助用户故事都自带自传播的特点,对有代表性的用户故事进行包装,前提是故事一定要真实,把品牌人格的塑造得更富有真情实感。个人推荐发起社会公益活动,就像蚂蚁森林一样打破虚拟空间,通过线上攒能量种树活动,再把4亿+用户的这份参与热情展现到线下——在沙漠种真实的树苗。

 文章来源:人人都是产品经理    作者:炒冷饭的二叔


用户不信任你做的产品/界面?不如试试这5招

ui设计分享达人




前言:


什么是产品的信任感??


指:基于产品为用户提供‘可靠服务、价值依赖’的一种情感体验。


这种体验不仅影响着用户黏性的强弱、业务目标的实现,也影响着不同生命周期下给产品给来的价值。如图:



而在产品与用户间建立信任感的过程中,我惊奇地发现有3个因素贯穿始终:理念 > 内容 > 表现。


‘基于什么样的理念,向用户传递什么内容,并且怎么表现。’



所以,未来3篇文章主要围绕‘信任感的打造’,希望能系统性地认识它,挖掘更多工作上可实用的小技巧。


今天先分享第一篇:信任感的理念层



信任的本质:是让人觉得真诚、可靠、放心等。换句话说,它就是一种‘为用户着想,建立产品温度’的理念/方向,从而引导后续的内容都围绕该理念而进行。


那么,如何才能为用户着想,慢慢建立起对产品的信任感呢??


既然为用户着想,那么可以试着从‘减少用户的投入成本’切入。



Part1:减少健康投入


健康投入,指用户使用我们的产品,可能会对身体上带来直接或潜在的负担/影响。比如视频看久了,眼睛就会感到酸痛。


针对这些负担与影响进行的一些关怀提示,可以用户提前消除、减轻这些痛苦,拉进与用户间的距离。


不同产品类型拥有专有的关怀点,所以比较通用的主要有5个:使用时长、使用姿势、夜间休息、夜间护眼、音量大小。



a.使用时长提示:


除纯工具类产品之外,大部分用户在产品上都有一定的使用时长(尤其是内容消费类产品),对于‘连续使用N分钟、或者满足特定时长’的用户,可针对该时长进行休息提示。


如有道精品课,在用户观看课程满40分钟 时有个时长提醒:




b.夜深关怀提示:


深夜本身是一个休息的时间,但还是有大量的‘夜猫子’根本停不下来。不管是主动性的娱乐消费,还是被动性的信息/工作处理,都将手机‘进行到底’。


此时对于‘深夜忙碌’中的用户,夜间的关怀就是一个切入点:比如企业微信,会在深夜启动页上展示 ‘夜深了,xxx’的文案提示。



虽然只是简单的一句话,但还是能感受到鹅厂对员工的关怀。


而且不管是C端还是B端,只要有用户在深夜使用产品的可能,都可针对性地给予关怀设计,体现产品的‘人性’。




c.夜间护眼提示:


夜晚周围的光线会变得幽暗,部分手机屏幕会自动变亮。时间一长会严重刺激用户双眼,并造成视觉疲劳(尤其是小学生群体)。


此时对用户进行护眼提示,不失为一个用户关怀点。


再如有道精品课:




d.使用姿势提示:


我们日常都会将手机横过来看视频、看八卦。而且相信各位都有过这样的经历:



当手机长期处于某个屏幕状态+重力倾向时,用户难免会出现手酸脖痛的情况。


此时进行使用姿势的纠正提醒,亦能起到关心用户的效果,从而建立良好的产品印象。


还是以有道精品课为例:



e.音量提示:


这个大伙都知道,过大的音量会影响耳朵听力。一般出现在各种音频、视频的产品与功能中。





Part2:减少金钱投入


没有人不会在意自己的钱包(除非你是对钱不感兴趣...),金钱上的收入与支出很大程度上会影响 人们对某事物的看法。


产品也是如此,若能帮用户减少金钱上的支出,或者带来真实收入。不仅能极大提升用户对你的信任度与黏性,还能增加产品的竞争力。


比如高德地图的打车功能,能显示所有车型的价格预览,帮助用户选择所需价格的车型。



无论是商品优惠券,还是返利。



只要能帮助用户钱包上的‘节源’或‘开流’,都能引发用户的信任感,从而信赖产品。




Part3:减少情感投入


情感投入,是指用户基于内心活动和情绪感受,对某事物所表现出来的一种想法。


这种想法制约着 用户是否接受我们的产品服务。一般体现在:安全性、性价比、真实性 3个方面。


a.安全性 - 放不放心:


人们面对某事物 可能会带来的伤害/损失时,都会有一种本能的“警惕感”


就拿此次疫情来说,对于有‘出差住房’诉求的用户来说,‘住的安全’是重中之重。因此寻找一家‘无感染、每日消毒、卫生干净’的安全酒店,可以减低用户选择我们的警惕感。



而在酒店列表中,带有‘严格消毒’、‘健康守护’等安全标签的酒店,会给人带来一种安全、放心、信赖的心理效应,从而提升该酒店的转化率。




b.性价比 - 值不值得


性价比是人们衡量‘付出成本与回报价值’间的一种决策依据,没有谁会喜欢付出小于回报的事物。


而为了让用户降低这种决策依据,除了自我服务/实力的展示外,往往需要一种“参照物”来凸显性价比。


如美团上的‘满减神器’,通过不同的食物/价钱间的对比,让用户买到最具性价比的食物。



而“参照物” 的形式多种多样,不管是竞品数据。



老版本也属于一种竞品


还是是各种优惠信息、额外礼物/礼包、售后服务等等。



目的都是通过该参照物,向用户传递一种‘划算’、‘值得’的心理效应。



c.真实性 - 真不真实:


光是性价比高还只是片面依据,至于内容是否属实,成为了我们与用户建立信任感 中最重要的影响因素。因为没有人喜欢被骗、喜欢虚假事物。


而真实性的建立,在‘电商领域’应该被运用得最多。如大牌背书、证书授权、专家介绍、明星代言、官方保证、销量成绩、用户反馈...等等。




展示自己的真实、最具实力的一面即可,别过度吹嘘与包装,用户又不傻。




Part4:减少脑力投入


人们一向不喜欢复杂的东西,除了不易理解外,更担心因为自己的理解错误,会给带来意外的损失。


帮助用户减少记忆负荷、顺畅完成操作目标,是每个产品必不可少的设计点。


如微信转账,输入数字时会检测对应的数额,减去用户边输入 边计算“这是多少钱”的脑力投入。



而且对比支付宝的转账,微信这点确实做到了‘洞察用户需求’。



再如账号注册,提供‘剩余步骤’能让用户了解 当前处于哪一步、预测完成整个操作还需多久。





Part5:减少体力投入


除了记忆负荷,‘操作负荷’的减少也是一种‘为用户着想‘的方式。我们身边也存在太多这方面的例子:


如手机上,如淘宝的快链弹窗、支付宝的转账提示,都是前置用户的目标,缩短操作流程



如电脑上,如Mac会保存耳机音量。


下次插入耳机时,会将扬声时的音量,自动调整至上次耳机插入时 所记录的音量。这样就免去了重新调整音量的操作。


以网易云音乐为例:注意 扬声时和耳机插入后 的音量变化.



这些都是帮助用户快速使用,从而减少体力操作的方式。除了前置用户目标、保存记录 外,常见的还有:给予默认值、自动选择/处理、多选与批量等等。



总结:


以上就是关于理念篇的内容,让今后的内容设计有了明确的方向。下面是走查表,平时设计功能、制作界面的时候可以看看,增加产品的温度。领取方式:公众号回复【信任1】


转自:ui中国-

浅析如何设计交互缺省页

ui设计分享达人

大纲



1 哪些状态需要缺省页  
2 缺省页的表现形式
3 缺省页的设计技巧

导语:缺省页指页面的信息内容为空或信息响应异常的状态;设计缺省状态的作用不仅是引导用户在异常边界状态的操作提示,同时也是安抚用户体验情绪的重要场景;更重要的是为边界场景营造出良好用户体验。通过分析缺省状态产生的原理,从而更为准确的把握交互缺省页的设计原则。


1 哪些状态需要缺省页 

谈到缺省页面可能是设计师最容易忽略输出的范围,可能直到对接的开发同学提出来,“这个页面,如果没有数据的时候,该怎么显示啊?”。为了更好的把控设计缺省页交互状态,首先要了解缺省页出现的原理。App页面内容(包括图片、文字、数据字段等等)都是请求服务器数据,顺利返回后,正常显示到客户端页面。在了解清楚基础实现逻辑后,就可以开始梳理整理缺省状态的设计思路。



图1 缺省状态的场景梳理图


缺省状态包括:系统层、信息层、空白层。
系统层:指当用户请求服务器时,返回提示请求提交失败,并检测到失败原因时呈现的页面;例如:加载失败、服务器异常、无网络等;页面一般会有重新请求的快捷按钮。文案上可做失败原因的细分描述,也可节约成本使用网络异常的统一文案。

                    


                                               
信息层:请求服务器数据成功,但返回的数据异常的页面;例如:内容已删除、内容已下架、内容不存在;文案内容以提示数据类型的缺失为主。显示形式除了常有的全屏缺省图,还会出现在数据列表下单一内容缺失的缺省模块化的情况,例如:单一作品在书架上显示已下架。





空白层:请求服务器数据成功,但显示无数据;内容页在无数据时需要缺省状态进行表达;例如:页面空数据、搜索无结果等。空白页面属于正常网络显示场景,所以一般会在缺省页附带有相似属性模块的用户引导,争取用户重复消费的目标,满足用户的操作的诉求。



最后根据每个不同的缺省状态,梳理产品相对应的场景。逐一根据场景特点来设计页面内容。那缺省页的设计有哪些表现形式呢?


 2 缺省页的表现形式 

没有用心设计的缺省页无法给用户带来良好用户体验,并可能给用户带来困扰,如下图:某小众直播平台的拉新邀请页面,无邀请记录状态下没有任何有效反馈信息,用户不能明确得知到底是网络问题还是账号同步出错亦或者是没有一次邀请。正确的缺省页设计内容理应明确表达出符合用户心理预期的视觉场景表达(图形);和使用易理解和语法恰当的表达当前的异常状态(标题)甚至于引导用户解决问题的文案描述。



图5 缺省页的错误示范

2-1视觉图案+文案

此类缺省设计形式一般应用于表达系统性无响应或初始空白态的缺省场景。视觉图案一般使用app吉祥物或主色调延展出的icon或插画来表示缺省状态;文字:通常为“标题”或“标题+描述”结构;标题通常是表达出现缺省的原因;描述文案则说明结束缺省状态的解决办法,如“请检查网络是否顺畅”  等等。



               
2-2 视觉图案+文案+引导

此类缺省设计形式一般运用于需要用户引导操作来达到业务目标的缺省场景。在视觉图案+文案的基础上加入引导模块,主要作用于避免用户在数据边界的状态下,会因为无法达到操作目而提高的跳出率。引导模块的内容包括:相似属性内容,相似行为目标按钮或解决缺省状态操作按钮,加入引导,用户进行某项行为或者感知某些信息,对于功能的教学和使用频率的提升有着重要作用。引导模块的形式也是日新月异,逐渐变成新用户业务引导的作用,不仅限于页面平铺,也可以做成固定气泡微动效,例如:抖音的发布缺省页。

 



                                 
3 缺省页的设计技巧 

缺省页除了常规的提示型设计方法,还有许多其他的设计技巧,帮助用户体验在遇到困难,更好地安抚用户的情绪。这些设计技巧有些是替代原来的缺省内容,让用户有更多地消费空间与深度。有些是拓展缺省状态的补充内容,让用户不容易跳出页面,增加用户的消费时长。具体如下:

3-1 使用推荐内容

缺省状态中的空白层非常影响边界情况的用户体验,提出一种假设,是否可以刻意推荐相同属性的内容呢?这样的界面既不会显得苍白无力又可以留住用户的注意力。相似性的内容也可以解决用户目标的迫切性。所以说,这种方法非常适合内容型产品中使用。例如:新用户在打开电商产品的购物车时候,理应是空白无消费行为的操作记录。那么平台方通过用户画像与热门排行算法推荐了一个商品流。这样可以解决用户无目标性挑选的诉求,增加消费时长。至于产品如果确定用户画像的推荐算法,可以通过获取第三方登录的个人基本数据之后,才给我推荐了数据库内相对应标签的热门商品,这样推荐的精准度也会高些。 
             




3-2 使用缓存

是否使用缓存内容代替缺省状态?根据产品特性来判断,工具类、金融类等同类型产品不适合使用缓存;因为用户交互操作的数据必须保持实时性与真实性。而内容型、电商类等类型产品适合使用缓存来代替缺省状态;理由:用户消费内容的转化路径是先消费后转化的行为特点,不存在系统操作门槛,且缓存内容可以代替产品的缺省状态,安抚用户操作失败所带来跳出率过高的风险。

3-3 情感化表达

当缺省页给到用户时,通常省时省力的做法就是老老实实告诉用户当前的状态,最多配上一个具有通识性的灰色icon。但是,秉持着以用户体验为己任的时代,我们其实可以把缺省内容表达得更加生动形象一些。在这里会加入一些情感化的表达,而不是仅仅只是做到准确的目标而已,比如加上活泼的插图故事,或者把文案写得更加拟人化、喜剧化一些。这些配图在让用户明白当前的状态的同时,往往也能引发用户会心一笑,从而弥补空白页面带来的失落感甚至可以带给用户一些正面的情感。如下图:
                 



3-4 提供新任务

通常缺省页的引导模块都着眼于解决当前任务。如果碰到没有解决方案的情况(例如:404,服务器崩溃等)可以提供给用户具有情感共情的新任务,让他们暂时忘记无法达到目标的挫败感,又有体谅的情怀。帮助建立正向积极的品牌价值观。例如:访问腾讯网时访问失败的时候,网页除了显示404状态之外,还会显示腾讯“宝贝回家”的公益寻人计划。将缺省页与公益内容相结合,不仅改善到用户缺省状态。也贯彻腾讯价值观“用户为本,科技向善”的输出。一个好的缺省页也可以承担社会责任,让公益传播到每个角落。



图10 腾讯网404公益任务缺省页

结语:作为设计师有时会听到需求方表述“这种极少出现的情况,我们可以暂且不管它。”但是细节见真章,所有优秀的体验设计都必须照顾到方方面面的缺省情况。让每个用户的流量价值发挥到最大,产生相互信任的良好的品牌关系。这样的平台生态是良性的,这样的产品会更有流量转化的商业化价值。


转自:ui中国-腾讯动漫TCD

最近爆火的小宇宙APP,有哪些值得关注的产品细节?

资深UI设计者

「小宇宙」是即刻团队开发的播客App,目前已上架各大应用商店,仅能通过邀请码使用,导致一时间微博上出现「一码难求」的情况,那它与其他播客App有什么不同?

内容推荐

进入App即展示「信息流」推荐,每日更新3条播客「信息流」推荐,听的时间越长,会推荐越多更加精准的播客内容。那用户如何判断推荐的单集是否有自己想要听的内容呢?如下图所示,页面上单集信息展示条目的空间较大,在首屏约能展示2条的单集内容,除了基础的节目封面、节目名称及单集名称外,小宇宙巧妙地通过将热门评论外显,辅以展示播放量及评论数量,引导用户点击进入二级页面,进而形成转化。

强大的搜索

不同于传统播客App仅能搜节目名称,小宇宙还支持搜索单集和用户,甚至是节目内页的内容也可以搜索到。对于那些「我对栏目本身不感兴趣,只想听其中的某一集」或者「我关注某个人或某个话题,想听听看关于他的一切」的节目,使用单集搜索功能可以更简单地直达所需。

让人惊喜的是,在节目内页长按选中任意词汇可以呼出「智能搜索」功能,这个智能体现在它允许用户选择用magi搜索和用互动百科搜索相关内容。这让我想到了Mac上一款很好用的工具PopClip(通过对文本内容的扩展来提升操作效率),小宇宙的智能搜索对于边听节目边扒关键词的「考据党」来说,无疑会大幅提升在听节目时获取资讯的效率。

更便捷的互动

在单集播放界面,除了常规的进度条拖拽、快速后退/前进等功能外,还有一个点赞功能,用户听到精彩的内容或引起共鸣的部分可以通过点赞进行互动,从点赞功能的反馈到进度条的高度的升起都能够进行实时的反馈,同时也可以帮助其他听众了解单集内容的关注点,以此为⽤⼾营造出符合他当时⾏为和感知的情景,可以达到提高用户的参与度的目的。

评论页的输入框常驻于页面底部,点击后输入框高度延伸,引导用户评论互动,此时用户如果是通过单集播放界面进入的评论页面,还会出现标记时点的选项,勾选后评论内容即带上了单集内容的时点。而时点高亮色+下划线的表现形式可以引导用户聚焦注意力和点击进行内容的收听,当其他用户点击带评论中的时点即可直接跳转至对应时间点播放单集内容,为⽤⼾之间的互动建⽴起羁绊,方便用户间的讨论交流,进而提升了点击率和单集的收听率。

另外,在用户输入评论时,输入框并不是以模态的形式出现,在用户评论的过程中依然可以滚动页面进行交互操作,这样做的好处在于不打断用户操作的连续性。以iPhone X的屏幕高度为例,除去标题栏+评论输入框+键盘高度外,留给评论本身的空间仅有大约1/3左右,在空间有限的情况下,用户滚动屏幕查阅感兴趣的评论或针对性进行回复的行为非常连贯,非模态的处理可以进一步降低用户互动的门槛。

这里有一个改进小建议,输入框内的预制文案可以换成引导性更强的内容或由系统自动生成一个场景适合的评论,这样不需要用户自己思考写什么内容,降低用户评论操作的成本,提高用户参与度。

小宇宙目前在社交上的尝试处于用户友好型状态,用户可以查看他人的播客订阅列表,发现同好,即「相近信息的收集爱好者容易获得共鸣」。如果这个有共同兴趣爱好的人刚好是用户收听的主播,就可以很容易拉近听众和主播的距离,主播对于听众来说不再是手机屏幕后面冷冰冰的声音,他更像你的一个朋友,你可以去了解他的喜好,讨论共同话题,更好地跟他进行互动。

情感化共鸣

不同的主题表达了不同情感,针对不同的社会群体的设计风格也会有所不同。

回到产品本身,小宇宙根据播客节目封面的主题色来适配不同播客信息页的视觉风格,营造出适合不同播客风格的氛围,以此来传达不同播客节目的特点。

若在热门的单集下评论,且评论点赞数最高,小宇宙领航员(官方账号)会给你留言,告知「你的评论上首页啦!」,通过这种与用户互动的方式激起⽤⼾的情感认同,提升用户评论的积极性。

点击「加入播放列表」,通过动效形式给予用户反馈,让信息的展示更生动自然,为产品增添趣味性的同时,给予用户更美好的操作体验。

下拉刷新动效中以「宇宙」图形为载体,将产品的Logo融入了其中,赋予产品独有的个性和灵气,让用户切身感受到这是一个可以探索的「宇宙」,而不是一个冰冷的工具,在减少用户等待过程中引发的负面情绪的同时强化了品牌形象。

可以改进的地方

产品中使用了较多无文字按钮,对于初次使用的用户来说存在一定认知负荷,不知道这些都是什么功能。

存在相同样式的图标承载不同功能操作的问题:「播放列表」功能在「我的播客」页中点击后是加入播放列表操作,而在播放列表模态弹窗中,点击后进入播放列表的编辑状态,同个样式的按钮承载了不同功能操作,容易引起用户困惑,带来冗余的学习成本。

当你收藏了一篇文章,收藏按钮状态从「收藏」变为「已收藏」,点击「已收藏」可以取消收藏状态,这是用户对于两个状态切换已有的认知。而小宇宙的加入播放列表功能,在点击加入播放列表后,再次点击「播放列表」按钮,会提示「已在播放列表」,而不是通常认知中的「取消加入播放列表」,容易带来认知错误。

列表右侧的「已订阅」按钮,视觉感知上像是不可点的状态,点击后提示「已取消」,再次点击提示「订阅成功」。对于有明显状态变化的功能性操作可以省去toast,这里通过「已订阅」和「订阅」状态的按钮样式变化已经给予用户清晰的传达反馈,再次提示反而多余。

小宇宙的体验分析就到这里,总的来说虽然存在一些需要优化的细节(毕竟还处于邀请码体验阶段),但是设计师可以学习的设计亮点有很多,感兴趣的小伙伴可以下载体验一番,也欢迎大家一起留言交流。

语音交互中的“等待体验”研究

ui设计分享达人

语音交互是最自然的人机交互方式,它极大地降低了人们与机器交互时的学习成本,已成为非常重要的人机交互方式。


回顾人机交互发展史,人类先后经历了基于命令行的CLI 时代,基于鼠标键盘的GUI时代,基于触摸的初级NUI时代。后面每一个阶段比前一个阶段更自然,学习成本更低,综合效率更高。

 


进入AI时代,人工智能给机器带来三种能力:感知能力、认知能力、自然语言输出能力。感知能力使机器能听得懂人类语言,认知能力使机器能思考如何回答人类问题,自然语言输出能力使机器可以像人类一样表达——三种能力的综合运用将人机交互带入语音交互阶段。语音交互是最自然的人机交互方式,它极大地降低了人们与机器交互时的学习成本,将人机交互综合效率带上新的台阶,已成为非常重要的人机交互方式。

“等待体验”——语音交互体验的三分之一

生活中人与人的对话场景,对话是由“向对方说出一句话”、“等待对方回复”、“对方给出回复”三个阶段不断循环构成。其中“等待对方回复”是对话体验的“三分之一”,会对回复的满意度造成直接影响。在等待回复阶段,如果对方处于认真思考的状态,会让我们觉得被重视;然而,如果在等待过程中对方的注意力不在对话本身,即便对方给出的回复再好,我们也会心存疑虑。



对应到人机语音交互中的三个部分——“输入体验”、“等待体验”、“回复体验”,“等待体验”同样处于整个体验循环链的中间环节,在语音交互体验中起到了承上启下的重要作用。但是,关于语音交互中的“等待体验”在行业尚未被系统的研究,依旧处于模糊状态。

 

1. 响应时间一定是越短越好吗?

数字性能管理平台Dynatrace对用户浏览网页的行为进行了研究,发现当网页加载速度提升0.5秒,可促进用户在网站的行为转化核心数据提升10%。因此,在网页设计和App设计中,尽量缩短等待时间是产品设计的不懈追求。

 

不同于基于视觉的交互,语音交互天然附带情感属性。然而,情感的体验是复杂的,它不只受效率这个单一变量的控制。大多数情况下,在生活中人与人对话时,一个过快的回答会给用户带来轻浮感和抢话感,而一个过慢的回答会给用户带来迟缓感和愚钝感。


那么,在语音交互中,究竟什么样的响应时间能有最佳的体验呢?响应时间的体验趋势是怎样的呢?

 

2. 等待体验受哪些变量的影响?
在视觉设计领域,当设计页面的loading态时,为降低用户的跳出率,设计师时常会通过给出进度条,或采用趣味性的情感化设计来消除用户的不安情绪。

 

但是在语音交互领域,语音的承载体是无形的,或不确定形态的,我们甚至没有承载loading态的界面。在这种情况下等待体验又受哪些变量影响呢?影响的程度怎样呢?

 

综上,可以说在语音交互领域,等待体验虽然重要,但目前仍是“一团迷雾”。鉴于此,我们以目前语音交互的主要载体——智能音箱产品为例,对AI产品中的等待体验问题进行专题研究。

 

二、智能音箱的等待体验研究

目前的智能音箱,主要采用先语音唤醒后输入指令的语音交互流程。鉴于此,我们可以将智能音箱的使用过程分为两个主要阶段:

1)唤醒阶段:用户通过指定的唤醒词将音箱从等待态转换为就绪态,音箱被唤醒后才可以接收用户的语音指令。

2)用户请求及反馈阶段:用户给出语音指令内容以及智能音箱反馈结果满足用户的需求。

 


针对这两个阶段,我们先后通过以下三个实验进行研究。

实验一:唤醒阶段的响应时间对等待体验的影响;

实验二:用户请求及反馈阶段的响应时间对等待体验的影响;

实验三:视觉、声音等不同反馈方式对等待体验的影响。

下面我们对每个实验的结论进行逐一详述:

实验一:唤醒阶段的响应时间对等待体验的影响

为了全面考察唤醒阶段各种因素对等待体验的影响,在实验中,我们为用户提供了不同唤醒响应时间和不同唤醒反馈方式的智能音箱。用户完成实验任务后,需要对音箱的唤醒响应速度进行评价(5点量表:太快了,接受不了;有点快,能够接受;刚刚好;有点慢,能够接受;太慢了,接受不了)。



实验一的结果表明最佳的唤醒响应时间与唤醒反馈方式有关,不同唤醒反馈方式下,最佳响应时间不同:

1)当唤醒反馈为"灯光"反馈时,唤醒响应速度越快越好,在200ms时,用户响应舒适度最高(对响应时间评价为刚刚好的用户比例),73%的用户对速度满意。

2)当唤醒反馈为"灯光+音效"时,唤醒响应速度的舒适时间为300ms左右,76%的用户对速度满意。

3)当唤醒反馈为"灯光+人声"时,唤醒响应速度的舒适时间为500ms左右,74%的用户对速度满意。

(注意:本次实验设置了市面上主流的三种唤醒反馈方式:灯光、灯光+音效、灯光+人声,以给不同反馈情况的响应时间感受作参考,但对最优反馈方式,除了响应时间还受其他因素影响,将另着篇章探讨。)



实验二:用户请求及反馈阶段响应时间对等待体验的影响

 

由于用户请求及反馈阶段的响应在技术实现和用户预期上,与唤醒阶段的响应存在差异,因此我们通过第二个实验对用户请求及反馈阶段的最佳响应时间范围进行研究。在实验中,我们为用户提供了不同响应时间设置的智能音箱。



实验二的主要研究发现:

1)1250ms以内是用户认为响应速度较优的区间,其中650ms为最佳体验值。在450ms时,少量用户觉得响应速度太快了,用户会感觉到紧迫感和压力,难以接受。

2)在1450ms时,有53%的用户开始感觉响应有延时,但仍能够接受。

3)从2150ms开始,有20%的用户认为音箱响应太慢,不能够接受。我们认为20%的用户不满意,已经不足以被称为一个优秀的产品。



实验三:视觉、声音等不同反馈方式对等待体验的影响

由于目前市场上的智能音箱在请求反馈阶段的响应时间普遍在1.5秒以上,并没有达到实验二研究的理想响应区间。因此,我们通过实验三进一步研究反馈方式设计对用户响应速度感知的影响,我们为用户提供了五组具有不同反馈方式设计的方案。



在实验三的五组方案中,每组方案分别进行了不同响应时间设置。



实验三的主要研究发现,不同反馈方式设计会影响人们对音箱响应速度的感知



1)1250ms以内,方案D感受较差,人声反馈会产生抢话的感受,部分用户认为音箱响应太快。



2)1350ms到2150ms,方案D、E感知舒适的用户比例较高,加入人声/音效后,如方案D的语音应答“好的”,有助于缓解用户延迟感受,提升速度感知体验。



3)在3150ms及以上的响应时间,响应方式设计对缓解延时的作用已经不明显,应该尽量避免此类情况发生。


此外,实验三还发现响应速度预期与用户性别、任务类型有关。与男性相比,女性用户对响应时间容忍度更低,她们最长在音箱无反馈时可以容忍的平均响应时间长度低于男性,即她们希望在更短的时间内得到音箱的响应反馈。



与音乐类、问答类等任务相比,用户对控制类任务的响应时间容忍度更低,用户希望在控制类任务中有更加及时的响应反馈。



三、小结

本文针对语音交互中的等待体验进行了讨论,并以智能音箱为例,重点对唤醒阶段和请求反馈阶段的响应时间和反馈方式进行了人类工效学实验研究。由于实验设定的条件和样本数量等限制因素,实验研究结论可能不能代表所有智能音箱用户在家居环境的全部感受,但希望通过我们的研究和探索,可以指导人工智能语音对话产品响应时间和反馈方式的设计,帮助打造自然和的语音对话体验。

 转自:站酷-DUBEST

写一个脚本,将所有js文件后缀批量改成ts后缀

seo达人

做项目的时候准备把js项目重构成ts项目,需要把文件后缀改成ts,一个bat脚本搞定,命令如下:

@echo off

rem 正在搜索...

for /f "delims=" %%i in ('dir /b /a-d /s "*.js"') do ren "%%i" "%%~ni.ts" rem 搜索完毕 @pause

把脚本放到根目录下,双击运行完就可以了

2020年最火的新拟物化设计,需要思考的五个方面

资深UI设计者

新拟物化设计只是一种风格吗?

最近正火的新拟物化风格(Neumorphism)在 2019 年底,设计师 Alexander Plyuto 所提出的「Skeuomorph Mobile Banking」作品中亮相。之后不仅被选为 2020 年界面趋势,又称为 soft UI。但这种风格在真实世界落地时,可视性上受到许多争议。

确实,新拟物化风格它算是一种风格,但又不是只有视觉上的风格这么简单,它延伸出来的议题,其实是扁平化跟拟物化之间的战争。

拟物化与扁平化的瑜亮情结

拟物化是 Apple 在早期设计中大量使用在界面上呈现对象属性、材质的方式。然而在 2013 年 ios7 发布时,Apple 开始为了画面简洁大量将界面元素扁平化,紧接着 Google 在 2015 年发布了 Material Design,宣示扁平化在 UI 设计中扮演着主导趋势的角色。2020 年真是百家争鸣的一年,首先是 BMW 发表的扁平化新 logo,接着是这一波新拟物化的反击。究竟代表新拟物化可能夺回界面风格主导权?或仅是 2020 年昙花一现的视觉风格呢?

扁平化VS 拟物化,我们可以思考的五件事

我认为新拟物化的概念其实是融合扁平化与拟物化的集大成,它建立在扁平化风格之上,又将组件带入了拟物化的元素,提高用户的判断力。不过在纠结于扁平化与拟物化哪个比较好时,有五个议题是可以让 UI、UX 设计师去思考的。

1. 多数年长者对于扁平化界面提供的视觉元素暗示无法理解。

大家身边一定都有那种已经把 Line 操作得滚瓜烂熟,但是每次要用 Line 加好友时,还是不知道怎么操作的长辈。最早期当人类还没进入屏幕时代前,我们所使用的界面大多是实体产品上的控制界面,而这些界面上的每个开关、按钮,都只有一个输入源,对应到一个功能(一对一),我们因此就这样与产品进行简单的交互动作。然而在屏幕上这个简单的交互模式被改变了,像是用键盘跟鼠标可以辅助我们,在系统中进行抽象与复杂的无限多任务(一对多)。

△ 你偏好用哪个微波炉加热咖啡呢?Image credit:Bence Mózer

让我们再来看看对长辈最重要的 Line 加好友功能,我们先不论这个功能在整个 APP 中被埋得多深,因为找到加好友的入口真的对长辈来说是看缘分~

在我引导长辈找出二维码画面的经验中,发现他们都是用死记的方式,把下一步要按哪个键、在画面的哪一个角落,记下来。但由于加好友功能并不是每天都会操作的,因此在学习上的效果,就像是高中时没有把课文理解、吸收就硬死背下来一样困难。

我们来看看「显示行动条码」在扫描二维码画面中,是否真的具有可以被点选的暗示。在扫描画面背景单纯的时候(如下图情况 1),「显示行动条码」的 button 底色是有透明度的黑、扁平化后没有阴影提供可以按的暗示,不过因为有大圆角的造型,勉强还是可以诱使人点点看;但一般情况下,扫面画面背景不会那么理想的无其他干扰(如下图情况2),button 原本的透明黑完全融入了后面的背景,这时候只剩下「显示行动条码」的文字,已经不具备可以被点选的提示。

△ 情况 2 中,显示行动条码的 button 看起来可以按吗?

扫描画面中的外框有一定的透明度,在可操作暗示(affordance)上已经不具有实体的特征,如果又放上有透明度的 button 在上面,让人充满不确定性,年长者无法将这样的情况与现实生活中的经验联想在一起。

2.以颜色做区别真的是最好的方法吗?

你知道同一个颜色,每个人看起来会不一样吗?而不同颜色在不同环境下,却又能看起来像同一个颜色吗?

不同意新拟物化设计的人中,有人主张运用颜色的引导用户操作界面的色彩元素不能从界面设计中抽离。但事实上,不同年龄、性别,视觉锥细胞中的活跃程度不一样。同一个颜色,不同人看,明度跟彩度会有差异。基于种种现实,由色彩的引导是好还是坏呢?

例子1:关于人类的视觉锥细胞

同一个颜色,不同人居然会看成不同颜色?

为什么阿嬷喜欢买大红大紫的衣服?这个偏好除了受到个人喜好影响外,也关系到阿嬷视觉锥细胞的活跃度。老年人在上了年纪后,部分视觉锥细胞开始退化,因此对于蓝色、绿色这类冷色系的颜色,老年人会开始接受不到这个区段的光带来的刺激。因为视觉锥细胞对冷色系的刺激降低,导致阿嬷在菜市场逛街时会被偏暖色系的物品吸引。所以会买热情系服饰不是阿嬷本人的意图,而是老化的锥细胞在作祟。

例子2:关于学习观察颜色这件事

不同颜色居然看成同一个颜色?

不同颜色却看起来很像,有可能是光线造成,也有可能是使用者必须学习去观察才知道的。日本的 JR 跟 Metro 系统,有着完整且细腻的视觉辨识系统。设计师理想中的情况是,我们将每条路线定义成不同颜色,可以让使用者更容易学习辨识路线。

但实地走访过东京的地下铁跟 JR,常常会发现跟错指示,才发现是潜意识辨认错文字或是颜色。我自己遇到过的经验是,在新宿站想要找都营大江户线时,因为在改札口看到了同样粉红色的标志,原本已经要哔卡进去,才发现那是京王新线的 IC 入口标志。

△ 新宿驶的改札口前,有两个同为粉红色的引导指标

所以说,高龄者或是天生视觉锥细胞有缺陷的人对于颜色无法清楚辨认外;大部分人可以借由学习来增强色彩辨识,除了可以对相似颜色进行更细节的判别外,也可以学着辨认不同光线(暖光、冷光)下造成的色彩差异。

但是,当我们在设计中,迫使用户学习、习惯我们制定颜色的意义。可能会在新手 onboarding 时造成适应上的负担,也有可能让他们在使用别的系统造成错乱。

3. 对于颜色被定义的意义各个文化、区域、种族都相同吗?

在不同文化之下,对于色彩的观察与运用也不一样,举个大家可能都有发现的例子,当你在不同城市旅游的时候,有没有发现不同城市的优先座颜色不一样?你能猜得出来,哪一个是台北捷运上优先座的颜色吗?

△ Image credit:wikipedia.org

当颜色在不同约定成俗下,有不一样的意义,又刚好缺乏文字或图像引导的时候,可能会让使用者解读成不同的意义。例如:红色具有热情、喜气、带来财运的意涵,但同时又具有危险的警示意义。

当设计师觉得红色可以引起使用者的注意,而把 button 设计为红色时,却可能让没看清楚文字的用户,认为按下这个 button 是危险的举动。

△ Image credit:photoAC

4. 光与影(明亮面跟阴暗面)给使用者的可操作暗示(affordance)一样吗?

新拟物化设计中假设了人在使用界面时,会运用与生俱来能判断光影效果的能力。这是真的吗?让我们来做个小实验:

为什么在台北车大厅席地而坐的人,会选择坐在黑色的棋盘格上呢?如果根据人类从大自然中所得到的可操作暗示来说,有阴影的地方可以提供人类休憩的功能,例如树阴下的阴影处。

△ Image credit:中央社、wikipedia.org

如果这样说得通的话,代表光亮的区域对人来说是可以行走、活动的地方;而阴影处则是休息与暂停处。

根据以上的推测,我们做个小实验,把车站中的 2 个不同区域的地面上分别涂上白色与黑色,来让受测者选出哪些区域可以暂停,哪些区域可以走动:

问题A:假设你要在车站的大厅等朋友,你会选择站在哪里等他呢?

假设:受测者会选 2,因黑色区域(影子)让人觉得可以暂停、休憩。

结果:符合假设

1:白色柱子前的白地面 32.5%; 2:白色柱子前的黑地面 67.5%

问题B:哪一边的楼梯是往上的方向呢?

假设:大家会选 1,因为黑色区域(影子)让人觉得可以踩上去。

结果:符合假设

1:白色立面+黑色地面 61.3%;2:黑色立面+白色地面 37.8%

由实验A、B可得证,虽然实验结果符合先前假设,大多数的受测者可从阴影判断要走哪条路,但还是有不少(30%以上)的受测者不认同。所以在用使用光亮阴影的设计暗示时,还是会遇到使用者感知的不同的问题。

5. 深度认知不同是导致判断物体距离的能力受影响,也就是所谓的视差。

新拟物化设计中,将界面组件以类 3D 的方式呈现,使用户在操作界面时必须去感知界面组件的远近以判断重要性,而在深度认知上有障碍的用户此时就会受到挑战。用户可能会遇到,不知道哪个组件才是浮在最上面、最重要的;若界面中的组件有三种以上的阴影深浅,会让用户在判断时要更花脑力判定物件在立体空间中的深浅。

总结

新拟物化风格中的光影表现提供了使用者人类最原始的操作意图:可操作暗示,是一个好的出发点,然而必须针对 APP 性质的不同而有所改良。在设计较走生活风格理念,而操作界面不复杂的 APP 时,非常适合用新拟物化风格来诠释:例如电子书服务、音乐软件;但在设计功能导向,且有大量信息化图表的界面,例如:移动网银,还是需要以扁平化的界面为主要信息架构,新拟物风格可能会是极少量界面元素中,拿来呈现生活中真实物的质感(例如:用户的信用卡)、或是作为亮点(例如:优惠卡片)的呈现方式,此类型 APP 中最重要的卡片与图表对于此种风格,一定要谨慎使用,必定三思三思再三思。

文章来源:优设    作者:Muse Chang

日历

链接

个人资料

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

存档