来谈谈APP提示弹窗交互设计

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来谈谈APP提示弹窗交互设计相关的知识,希望对你有一定的参考价值。

参考技术A 移动端常见的提示弹窗可分为3类:提示框、泛Toast 和消息推送。

提示框是一种打断用户操作行为的弹窗,用户必须做出确认、取消等操作才能进行下一步。

常见的用法有功能引导(但别指望傲娇的用户会认真看)、弹出广告信息或者重要通知(虽然用户未必觉得有卵用还感觉有点烦)、提醒用户当前操作会发生什么事情(告诉用户别手贱,想好了再点)、耗时操作提示(安慰客官别着急,菜正在做着)、进行文本输入或功能设置(少跳转一个页面)。

功能引导一般是APP第一次安装、UI交互改版或者更新重要功能时对用户进行使用引导,增加用户对某功能的认知度,减轻用户对APP陌生感,避免了用户面对复(nǎo)杂(cán)交互时的一脸懵逼。

广告的弹窗最好是能抓人眼球。用户不是烦广告,而是烦对自己没用并且没趣的广告。

有一些操作是无法挽回的,所以需要增加一个确认提示,防止用户误触。

应用正常运行的时候缺少权限会使某些功能无法正常使用,但是乐视你一个薯片……哦不对,视频软件要我定位、通话这种敏感权限,不给还强制关闭APP,这是想干嘛?还是卸载了吧。

申请权限或者应用更新的提示框最好能把事情写详细,让用户明白授权权限或者升级APP对自己有什么好处。UC浏览器耍了个心眼,把取消按钮故意设计的不显眼,视觉上引导用户去点击“立即体验”按钮。

如果用户需要进行简单的设置或输入,可以用弹出操作框的形式减少界面跳转。但是操作框大小有限,如果是复杂设置的话最好还是跳转新的页面。

用户的耐心比金鱼的记忆时间还短。如果应用3秒没反应用户就会疑惑,5秒没反应用户就可能会觉得是出问题了而去尝试关闭。这时候就体现出了一个有趣的loding界面的重要性了。

为什么是泛Toast 呢,因为现在Toast 的玩法越来越多了。

android官方设计规范里,Toast 是一种主要用于提示系统消息的轻量级控件,显示一段时间后自动消失,不包含操作也不能从屏幕上手动关闭,不会打断用户的操作,多个Toast 可以叠加出现。

之后Android针对轻量级反馈操作在Material Design中新增加了一种叫Snackbar 的控件。Snackbar 以一个小的弹出框的形式,出现在手机屏幕最底部,左侧为提示文本,右侧是操作按钮。Snackbar 不仅会超时自动消失,用户也可以滑动将其关闭,屏幕上同时最多只能显示一个 Snackbar。

Android官方设计规范里Toast 和Snackbar都应该保持简约,不对用户造成过多的打扰,所以不建议提示文本过长(显示时间有限,太长用户看不完),更不建议在其中增加图片和过多按钮。

但是有句名言说得好,规则就是用来打破的。

小米应用市场安装完APP后出现的Toast ,功能上是方便了用户,但是设计上不太好看。

豌豆荚的新版本升级提示用Snackbar 的形式出现,左侧有两个操作按钮。因为豌豆荚的这个Snackbar 是不自动消失的,除非用户点击操作按钮或者滑动才会关闭,所以不会出现用户正在纠结两个按钮该点哪个而Snackbar 超时自动消失的情况。但是一句“新版本已准备好了”就想让用户去升级,看来这版本也没多重要。

上面bilibili这个投币的交互设计挺有趣的,如果投币成功后弹出的Snackbar增加“再次投币”的操作按钮,一定能增加用户投币的数量。

很多APP为了更少的遮挡内容,将Toast移到了顶部。

传统的Toast样式低调,很容易被用户忽略,我们可以按照提示内容设计不同的颜色,也使得APP变得更加生动有趣。

消息推送的使用场景一般是应用处于非活跃状态(未启动或在后台里),为了避免用户错过重要信息而通过系统发出提示,点击消息可跳转到应用内相关页面。

消息推送也经常被用来促进用户活跃度,消息推送的频率和质量反映了一个团队对用户心理的掌握程度。优秀的运营应该对用户群进行详细分类,投其所好才能吸引用户点击,否则用户就会烦的禁止APP推送。

有用、好用、有趣,我觉得这是交互设计中最重要的三点。

1、有用:没有反馈的APP毫无生气,而各种乱弹窗又会使用户心烦到恨不得立刻卸载。所以反馈的信息一定是有价值的,让用户知道刚才发生了什么,接下来需要进行什么操作,一些显而易见的情景可以省略掉提示。

2、好用:提示控件的形式一定要把握好,不同的提示类型最好要区别展示。对话框会打断用户的操作,一般是处理重要事件,做好用户引导操作;toast是轻量级提示,不会打断用户的操作流程,提示的信息一定要言简意赅,显示时间不宜过长;消息推送最容易成为垃圾信息的重灾区,如果不能决定到底推送给用户哪些信息时,可以在设置里增加一些推送开关。

3、有趣:有趣的事情,大家都会喜欢。我相信即使是很讨厌广告的用户,在看到一个有趣的提示时也会十分感动然后把它关闭;即使是很讨厌等待的用户,在看到一个好玩的等待动画时也会会心一笑,然后时间就不知不觉的过去了。

弹窗提示插件(全局提示弹窗)

    弹窗可以说是每个项目都会用到的一个东西,弹窗有很多种,有系统默认的,网上也有一堆插件。默认的弹窗一般不好看,都会被设计嫌弃的,如果用插件的话,又比较占资源空间,所有我开发的项目一般都是自己封装全局同用插件的,下面来细说一下这些弹窗的用法。

系统默认的有这3种常用的

//弹出对话框并输出一段提示信息  
function ale() {  
    //弹出一个对话框  
    alert("提示信息!"); 
} 
//弹出一个询问框,有确定和取消按钮  
function firm() {  
    //利用对话框返回的值 (true 或者 false)  
    if (confirm("你确定提交吗?")) {  
        alert("点击了确定");  
    }  
    else {  
        alert("点击了取消");  
    }  

}  

//弹出一个输入框,输入一段文字,可以提交  
function prom() {  
    var name = prompt("请输入您的名字", ""); //将输入的内容赋给变量 name 
    
    //这里需要注意的是,prompt有两个参数,前面是提示的话,后面是当对话框出来后,在对话框里的默认值  
    if (name)//如果返回的有内容  
    {  
        alert("欢迎您:" + name)  
    }
} 

网上的插件也有好几个不错的插件,我个人用得比较多的就是layer,使用起来也很方便。大家可以去官网看看

 

//初体验

layer.alert(内容)
//第三方扩展皮肤

layer.alert(内容, {
  icon: 1,
  skin: layer-ext-moon //该皮肤由layer.seaning.com友情扩展。关于皮肤的扩展规则,去这里查阅
})
//询问框

layer.confirm(您是如何看待前端开发?, {
  btn: [重要,奇葩] //按钮
}, function(){
  layer.msg(的确很重要, {icon: 1});
}, function(){
  layer.msg(也可以这样, {
    time: 20000, //20s后自动关闭
    btn: [明白了, 知道了]
  });
});
//提示层

layer.msg(玩命提示中);
//墨绿深蓝风

layer.alert(墨绿风格,点击确认看深蓝, {
  skin: layui-layer-molv //样式类名
  ,closeBtn: 0
}, function(){
  layer.alert(偶吧深蓝style, {
    skin: layui-layer-lan
    ,closeBtn: 0
    ,anim: 4 //动画类型
  });
});
//捕获页

layer.open({
  type: 1,
  shade: false,
  title: false, //不显示标题
  content: $(.layer_notice), //捕获的元素,注意:最好该指定的元素要存放在body最外层,否则可能被其它的相对元素所影响
  cancel: function(){
    layer.msg(捕获就是从页面已经存在的元素上,包裹layer的结构, {time: 5000, icon:6});
  }
});
//页面层

layer.open({
  type: 1,
  skin: layui-layer-rim, //加上边框
  area: [420px, 240px], //宽高
  content: html内容
});
//自定页

layer.open({
  type: 1,
  skin: layui-layer-demo, //样式类名
  closeBtn: 0, //不显示关闭按钮
  anim: 2,
  shadeClose: true, //开启遮罩关闭
  content: 内容
});
//tips层

layer.tips(Hi,我是tips, 吸附元素选择器,如#id);
//iframe层

layer.open({
  type: 2,
  title: layer mobile页,
  shadeClose: true,
  shade: 0.8,
  area: [380px, 90%],
  content: mobile/ //iframe的url
}); 
//iframe窗

layer.open({
  type: 2,
  title: false,
  closeBtn: 0, //不显示关闭按钮
  shade: [0],
  area: [340px, 215px],
  offset: rb, //右下角弹出
  time: 2000, //2秒后自动关闭
  anim: 2,
  content: [test/guodu.html, no], //iframe的url,no代表不显示滚动条
  end: function(){ //此处用于演示
    layer.open({
      type: 2,
      title: 很多时候,我们想最大化看,比如像这个页面。,
      shadeClose: true,
      shade: false,
      maxmin: true, //开启最大化最小化按钮
      area: [893px, 600px],
      content: //fly.layui.com/
    });
  }
});
//加载层

var index = layer.load(0, {shade: false}); //0代表加载的风格,支持0-2
//loading层

var index = layer.load(1, {
  shade: [0.1,#fff] //0.1透明度的白色背景
});
//小tips

layer.tips(我是另外一个tips,只不过我长得跟之前那位稍有些不一样。, 吸附元素选择器, {
  tips: [1, #3595CC],
  time: 4000
});
//prompt层

layer.prompt({title: 输入任何口令,并确认, formType: 1}, function(pass, index){
  layer.close(index);
  layer.prompt({title: 随便写点啥,并确认, formType: 2}, function(text, index){
    layer.close(index);
    layer.msg(演示完毕!您的口令:+ pass +<br>您最后写下了:+text);
  });
});
//tab层

layer.tab({
  area: [600px, 300px],
  tab: [{
    title: TAB1, 
    content: 内容1
  }, {
    title: TAB2, 
    content: 内容2
  }, {
    title: TAB3, 
    content: 内容3
  }]
});
//相册层

$.getJSON(test/photos.json?v=+new Date, function(json){
  layer.photos({
    photos: json //格式见API文档手册页
    ,anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机
  });
});

 下面这个就是我个人封装的一个小小的弹窗对象,大家喜欢可以拿去用

var GlobalTip = {
  /**
 * 全局提示框  只显示提示内容的弹窗
 * @param {type} message      提示内容
 */

  TipMessageBox:function(message,callback_function){
    var timer = null;
    var body = document.getElementsByTagName(body)[0];
    var globalNotice = document.createElement(div);
    globalNotice.id = globalNotice;
    if(message.length>11){
      globalNotice.innerHTML = <p style="line-height:35px;">+message+</p><div class="back"></div>;
    }else{
      globalNotice.innerHTML = <p>+message+</p><div class="back"></div>;
    }
    body.appendChild(globalNotice);
    clearInterval(timer);
    timer = setTimeout(function(){
       if($.isFunction(callback_function)){callback_function();}
      document.getElementById(globalNotice).parentNode.removeChild(document.getElementById(globalNotice));
    },2000)
  },


  /**
 * 全局选择弹框  有"确定"与"取消"按钮的弹窗
 * @param {type} message           提示内容
 * @param {type} YesMess           右侧按钮提示
 * @param {type} callback_function 回调函数(可选)
 * @param {type} callback_param     回调函数参数,(由于参数个数不定,所以以对象方式传参)(可选)

    使用例子:
         GlobalTip.askComfirmTipBox(message,YesMess,callback_function,callback_param); 
         无参数:GlobalTip.askComfirmTipBox(‘提示消息内容‘,‘确定‘,回调函数);

         有参数:var param = {"one":‘参数1‘,‘two‘:‘参数二‘}
                 GlobalTip.askComfirmTipBox(‘请选取裁剪图片范围‘,‘确定‘,回调函数,param);
 */

  askComfirmTipBox:function(message,YesMess){
    var callback_function = arguments[2];
    var callback_param = arguments[3]?arguments[3]:false;
    var body = document.getElementsByTagName(body)[0];
    var globaComfirmTipBox = document.createElement(div);
    globaComfirmTipBox.id = ComfirmTipBox;
    globaComfirmTipBox.innerHTML = <h3><span>提示</span><i onclick="GlobalTip.close()"></i></h3><p>+message+</p><p><a id="askComfirmTipbtn0" onclick="GlobalTip.close()" href="javascript:;;">取消</a><a id="askComfirmTipbtn1" onclick="GlobalTip.close()" class="ComfirmTipBox_ok" href="javascript:;;">+YesMess+</a></p>;
    var grayBox = document.createElement(div);
    grayBox.id = globalgrayBox;
    body.appendChild(globaComfirmTipBox);
    body.appendChild(grayBox);
    $(#askComfirmTipbtn1).click(function(){
        if($.isFunction(callback_function)) {
            if(callback_param != false ){
              callback_function(callback_param);
              return ;
            }
            callback_function();
        }
    })
  },

    /**
 * 全局选择弹框  只有一个"确定"按钮的弹窗
 * @param {type} message      提示内容(必填)
 * @param {type} YesMess      右侧按钮提示(必填)
 * @param {type} callback_function 回调函数名称(可选)
 * @returns {undefined}
 */
  WarningTipBox:function(message,YesMess){
    var callback_function = arguments[2];
    var callback_param = arguments[3]?arguments[3]:false;
    var body = document.getElementsByTagName(body)[0];
    var globaComfirmTipBox = document.createElement(div);
    globaComfirmTipBox.id = ComfirmTipBox;
    globaComfirmTipBox.innerHTML = <h3><span>提示</span><i onclick="GlobalTip.close()"></i></h3><p>+message+</p><p><a onclick="GlobalTip.close()" id="askComfirmTipbtn1" class="ComfirmTipBox_ok" href="javascript:;;">+YesMess+</a></p>;
    var grayBox = document.createElement(div);
    grayBox.id = globalgrayBox;
    body.appendChild(globaComfirmTipBox);
    body.appendChild(grayBox);
    $(#askComfirmTipbtn1).click(function(){
        if($.isFunction(callback_function)) {
            if(callback_param != false ){
              callback_function(callback_param);
              return ;
            }
            callback_function();
        }
    })
  },

  /*关闭弹窗*/
  close:function(){
     document.getElementById(ComfirmTipBox).parentNode.removeChild(document.getElementById(ComfirmTipBox));
     document.getElementById(globalgrayBox).parentNode.removeChild(document.getElementById(globalgrayBox));
  }

}



//css样式

/*----------------------------------------------- 通用弹框 -------------------------------------*/
#globalNotice{position: fixed;padding:10px;width: 180px;height: 70px;top:40%;left: 50%;margin-left: -100px;margin-top: -45px;z-index: 999;border-radius: 2px;}
#globalNotice p{position: absolute;top:10px;left: 10px;width: 180px;height: 70px;line-height: 70px;font-size: 16px;color: #fff;text-align: center;z-index: 1001;overflow: hidden;}
#globalNotice div.back{position: absolute;top:0;left: 0;width: 200px;height: 90px;z-index: 1000;background: #000;opacity: 0.75;filter:alpha(opacity=75);transition:all 0.5s ease-out 0s;

     -moz-transition:all 0.5s ease-out 0s;-webkit-transition:all 0.5s ease-out 0s;-o-transition:all 0.5s ease-out 0s;}
#ComfirmTipBox{position: fixed;width: 270px;/*height: 160px;*/top:40%;left: 50%;margin-left: -135px;margin-top: -80px;z-index: 999;background: #fff;padding-bottom: 20px;}
#ComfirmTipBox h3{height:40px;line-height: 40px;font-size: 14px;color: #333;border-bottom: 1px solid #f2f2f2;padding-left: 17px;}
#ComfirmTipBox h3 i{width: 40px;height: 40px;float: right;background: url(../images/popup_guanbi.png) no-repeat 0px 13px;cursor: pointer;background-size:30px 60px; }
#ComfirmTipBox p{font-size: 16px;color: #333;text-align: center;/*height: 64px;*/line-height: 30px;padding-top: 15px;}
#ComfirmTipBox p a{display: inline-block;margin:0 25px;width: 80px;height: 32px;line-height: 32px;text-align: center;color:#fff;font-size: 14px;background: #b3b3b3;border-radius: 2px; }
#ComfirmTipBox p a.ComfirmTipBox_ok{background: #34c5c7;}
#globalgrayBox{position: fixed;top:0;left: 0;width: 100%;height: 100%;z-index: 998;background: #000;opacity: .5;-moz-opacity:0.5;-webkit-opacity:0.5;-o-opacity:0.5; filter:alpha(opacity=50);}

 

 

谢谢阅读,如果能帮到您,请帮忙顶一个,当然喜欢的可以收藏一下,谢谢!~( ̄▽ ̄~)(~ ̄▽ ̄)~

注:转发请注明出处

以上是关于来谈谈APP提示弹窗交互设计的主要内容,如果未能解决你的问题,请参考以下文章

第五组交互设计文档Hunger Killer

如何用Axure快速制作APP交互原型

谈谈用户体验中的表单设计-理论篇

APP开发设计应以人为本!浅谈APP交互设计原则

APP设计中的交互动画是怎么实现的?

WebAPP与原生APP的交互设计区别