首页

app界面赏析+图标分享 ——— 北京蓝蓝设计 移动端UI设计资源分享(二十三)

前端达人

App界面设计对于设计师而言一直是盛久不衰的话题,尤其是如今越来越多的流量转移到了移动平台,使得更多的UI设计师涌入移动端领域,甚至出现了市场饱和的言论,对于从事移动端的UI设计师来讲,充满压力的同时又面临无限机遇,唯有不断的学习才能滋生出源源不断的设计灵感,站稳脚跟。

摹客想在这方面给各位设计师朋友做点什么,除了提供简单好用的设计工具,我们也整理了非常多的优秀设计案例,希望可以对设计师朋友有借鉴意义。这将会是一个系列的专题,我们以月为单位,整理了国内外设计师的优秀APP界面设计案例,我们是搬运工,更是好设计的传达者,希望你会喜欢。



接下来为大家分享精美的app UI设计案例:




WechatIMG1887.jpegWechatIMG1884.jpegWechatIMG1883.jpegWechatIMG1885.jpegWechatIMG1886.jpegjhk-1621332867203.jpgjhk-1621332865448.jpgjhk-1621332860244.jpgjhk-1621332860116.jpg




--手机appUI设计--

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



  更多精彩文章:

      手机appUI界面设计赏析(一)

       手机appUI界面设计赏析(二)

       手机appUI界面设计赏析(三)

       手机appUI界面设计赏析(四)

       手机appUI界面设计赏析(五)

       手机appUI界面设计赏析(六)

       手机appUI界面设计赏析(七)

       手机appUI界面设计赏析(八)

       手机appUI界面设计赏析(九)

        手机appUI界面设计赏析(十)

       手机appUI界面设计赏析(十一)

      手机appUI界面设计赏析(十二)

      手机appUI界面设计赏析(十三)

      手机appUI界面设计赏析(十四)

      手机appUI界面设计赏析(十五)

      手机appUI界面设计赏析(十六)

      手机appUI界面设计赏析(十七)

      手机appUI界面设计赏析(十八)

      手机appUI界面设计赏析(十九)

      手机appUI界面设计赏析(二十)

      手机appUI界面设计赏析(二十一)

     手机appUI界面设计赏析(二十二)


使用vue写一个计时器

前端达人

**

首先我们要知道setTimeout和setInterval的区别

**
setTimeout只在指定时间后执行一次,代码如下:

<script>  
//定时器 异步运行  
function hello(){  
alert("hello");  
}  
//使用方法名字执行方法  
var t1 = window.setTimeout(hello,1000);  
var t2 = window.setTimeout("hello()",3000);//使用字符串执行方法  
window.clearTimeout(t1);//去掉定时器  
</script> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

setInterval以指定时间为周期循环执行,代码如下:

//实时刷新时间单位为毫秒  
setInterval('refreshQuery()',8000);   
/* 刷新查询 */  
function refreshQuery(){  
   $("#mainTable").datagrid('reload',null);  
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

一般情况下setTimeout用于延迟执行某方法或功能,
setInterval则一般用于刷新表单,对于一些表单的实时指定时间刷新同步
**

计时器

**
HTML代码

<div class="father">
        <ul>
            <li>{{one}}<span>:</span></li>
            <li>{{two}}<span>:</span></li>
            <li>{{three}}</li>
        </ul>
        <el-button type="primary" @click="startHandler">开始</el-button>
        <el-button type="primary" @click="endHandler">暂停</el-button>
    </div> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

JAVASCRIPT代码

<script>
export default {
  name: 'HelloWorld',
  data(){
      return {
        flag: null,
        one : '00', // 时
        two : '00', // 分
        three : '00', // 秒
        abc : 0, // 秒的计数
        cde : 0, // 分的计数
        efg : 0, // 时的计数
      }
  },
  props: {
    msg: String
  },
  mounted() {

  },
  methods:{
  // 开始计时
    startHandler(){
        this.flag = setInterval(()=>{
            if(this.three === 60 || this.three === '60'){
                this.three = '00';
                this.abc = 0;
                if(this.two === 60 || this.two === '60'){
                    this.two = '00';
                    this.cde = 0;
                    if(this.efg+1 <= 9){
                        this.efg++;
                        this.one = '0' + this.efg;
                    }else{
                        this.efg++;
                        this.one = this.efg;
                    }
                }else{
                    if(this.cde+1 <= 9){
                        this.cde++;
                        this.two = '0' + this.cde;
                    }else{
                        this.cde++;
                        this.two = this.cde;
                    }
                }
            }else{
                if(this.abc+1 <= 9){
                    this.abc++;
                    this.three = '0' + this.abc;
                }else{
                    this.abc++;
                    this.three=this.abc;
                }
            }

        },100)
    },
    // 暂停计时
    endHandler(){
        this.flag = clearInterval(this.flag)
    }
  }
}
</script> 
  • 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

效果如下:
在这里插入图片描述




蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码蓝小助,报下信息,蓝小助会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

截屏2021-05-13 上午11.41.03.png


文章来源:csdn     作者:rock_23

分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

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

VueJs里利用CryptoJs实现Md5加密和3Des加密及解密

前端达人

前言

前我们介绍的用于vue用于数据签名的操作,《【干货】Vue TypeScript根据类生成签名字符串》,其目的就是用于生成这个再转MD5加密的模式进行校验,原来我们在C#和Android里面已经实现这些方式,因为前端准备用Vue来做,所以加密这块少不了也需要实现的。

安装Crypto

Crypto里面可以把md5和3des都一起做了,所以我们直接安装这个比较方便

找到我们的程序目录,按住Shift加鼠标右键,选择在此处打开Powershell窗口

然后在cmd窗口里面输入npm install crypto-js -save-dev 

安装完成后可以看到红框下面标注着成功了。


代码演示


MD5加密

我们还是用上次签名的那个项目里面,首先要先引用Crypto-js


getmd5,我们再写一个GetMd5的方法,传入的字符串直接生成MD5的字符返回,


接下来再定义一个双向绑定的字符串,在点击签名的时候同时生成md5的字符串显示的页面上

运行后的效果




3DES加密、解密

核心代码

加密

   Encrypt3Des(str: string, aStrKey: string, ivstr: string): string {
        const KeyHex = CryptoJS.enc.Utf8.parse(aStrKey);
        const encrypted = CryptoJS.TripleDES.encrypt(str,
            KeyHex,
            {
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.Pkcs7,
                iv: CryptoJS.enc.Utf8.parse(ivstr)
            });
        let hexstr = encrypted.ciphertext.toString().toUpperCase();
        console.log(hexstr);
        return hexstr;
    }

一般网上的加解密最后红框这里我们直接是输出 return encrypted.tostring(),但是因为我们自己的C#和Android的3Des的加解密都是最后输出的16进制的字符串,所以我们改为红框这里输出的样式。



解密

    Decrypt3Des(str: string, aStrKey: string, ivstr: string): string {
        const KeyHex = CryptoJS.enc.Utf8.parse(aStrKey);
        //因为我们加密的时候用到的16进制字符串,需要进行转换
        //第一步把16进制字符串转为WordArray格式
        const WordArray = CryptoJS.enc.Hex.parse(str);
        //第二步把WordArray再转为base64的字符串
        const base64str = CryptoJS.enc.Base64.stringify(WordArray);
        //第三步再进行解密
        const decrypted = CryptoJS.TripleDES.decrypt(base64str,
            KeyHex,
            {
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.Pkcs7,
                iv: CryptoJS.enc.Utf8.parse(ivstr)
            });

        return decrypted.toString(CryptoJS.enc.Utf8);
    }

这里比较重要就是红框里面,因为我们的加密最后输出的是16进制的字符串,所以我们解密的时候首先要把16进制字符串转为WordArray格式,再转换为BASE64的字符串,最后再进行解密。因为我也是个前端小白,就是这个问题我也是研究了一下午才搞明白。

最后下面的黄框要注意输出的字符要转为Utf8。




其余设置

我们在test.ts里面定义了两个字符串,一个des3encryptstr的加密后的字符串,一个des3decryptstr是解密后的字符串,然后又加上了两个方法,一个是加密的方法btnencrypt,一个是解密的方法btndecrypt,分别调用的就是我们刚才写的两段核心代码。


然后在test.vue.html里面加上双向绑定显示以及一个加密按钮和一个解密按钮。


页面效果

未加密的效果

点击加密后的效果

点击解密后的效果


蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码蓝小助,报下信息,蓝小助会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

截屏2021-05-13 上午11.41.03.png


文章来源:https://my.oschina.net/u/4582134/blog/4582375

分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

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

UI交互动效设计标准与规范探索

seo达人

 

今天分享一篇在medium很火的文章《UI交互动效设计标准与规范探索》这篇文字将系统性的给你介绍UI交互动画该如何深入研究,希望对您有用!

The ultimate guide to proper use of animation in UX

现如今,优秀的界面动画很能让人产生深刻印象,甚至是带来惊喜。它一方面表达了界面之间的交互过程,解释说明如何使用应用,另一方面也能正确引导用户的注意力。在浏览关于动效的文章时,我发现几乎所有的文章都只描述了特定的案例或者关于动画的一般事实,但是我还没有遇到过任何一篇文章能够清晰的描述所有关于界面动画的使用规范。在这篇文章中我不会写任何新的知识,我只是想把所有的主要原则和规范做一个收集归纳,这样就能便于其他设计师进行快速决策了。

动画的速度和持续时间

当界面元素改变他们的状态和位置时,动画的持续时间应该以用户能注意到又不用等待为标准。

1.gif

合适的动画时长,既不要太快也不至于慢到让用户打哈欠。

大量的研究发现在界面中最优的时间是200-500ms。这个数字是根据人类大脑的认知水平得出来的。任何小于100ms的动画是人类很难感知到的,而其他大于1秒的动画又会让用户觉得有些延迟,不够流畅。

2.gif

动画的持续时间是使得界面流畅的关键

在手机上,谷歌设计规范同样建议动画的持续时间在200-300ms为宜。在平板电脑上,这个时间会稍微长30%,大约在400-450ms。原因很简单,在更大的屏幕上,元素变化的位置路径会更长。基于此,在可穿戴设备中,持续时间又要缩短30%了,大约在150-200ms,因为小屏幕上元素变化的位置路径会更短。

3.gif

设备的大小会影响动画的持续时间

在网页上又会是另外一种方式。由于我们习惯于在浏览器中快速打开网页,所以我们也希望在不同的状态之间能够快速切换。所以,在网页上的动画应该要比在手机上持续时间少2倍多,在150-200ms之间。一旦超过这个时间区间,用户就会觉得网页是不流畅的,或者觉得是不是网络有了问题。

但是,如果你是在页面中创建一些装饰性的动画或者目的是为了吸引用户的注意力,此时就应该抛弃这些规范,时间你可以做的更长一些。

4.gif

大界面中的动画就一定是慢的吗?并不一定。

还需要记住的一点就是,无论在什么平台,动画的持续时间不仅跟它的移动距离有关,还跟它本身的大小有关系。小的元素或者变化不大的动画应该要移动的更快,而大的元素或者复杂的元素持续时间稍长一些看起来会更好。

在大小相同的对象中,移动距离最短的物体应该最先停止。小的对象与大的对象相比较,小对象移动速度显得更慢,因为会产生更大的偏移量。

5.gif

动画的持续时间取决于物体的大小和移动的距离

当对象发生碰撞时,根据物理原则,碰撞的能量必须在碰撞对象之间平均分布。而如果在界面中只能看到碰撞体的一部分回弹,往往会显得不够自然。因此,最好避免回弹效果,只在一些特殊情况下才用到它。

6.gif

避免使用弹跳效果,因为它会分散注意力。

物体的运动轨迹应该是清晰锐利的,所以尽量不要使用动态模糊(在AE中做动画效果除外)。即使是在现在最新的设备上也很难重现这些效果,不能把这种动态模糊的动画效果应用到界面中。

7.gif

动画中尽量不要使用动态模糊

列表项的出现应该只允许有一个短暂的延迟。每一个新列表项的出现间隔应该在20-25ms之间。元素出现太慢的话,会让用户感到很不爽。

8.gif

列表项出现的动画应该在20-25ms之间。

缓动

缓动可以让物体运动的更加自然。这是动画的基本原理之一,在 Ollie Johnston 和 Frank Thomas所写的《 The Illusion of Life: Disney Animation》书中有详细的解释。

为了让动画看起来不会觉得太过机械,物体的运动应该会同时伴有一些加速度,就像现实世界中的运动一样,不会有绝对匀速的运动形式。

9.gif

缓动的物体会比较线性运动的物体看起来更加自然

线性运动

不受任何物理因素影响的运动叫做匀速运动,这种动画在用户眼中看来是非常的机械和不真实的。

所有的APP动画都会用到动画曲线。我将试着去解释如何阅读它们并说明它们的含义。下面的例子中,运动就是匀速的,可以看到对象在相同的时间间隔中移动了相同的位置。

10.gif

线性运动

线性动画在什么时候会用到?举个例子,对象仅改变它的颜色和透明度的时候会用到。一般来说,当一个对象不改变它的位置而只是改变状态时,可以尝试用线性动画来改变状态。

缓入或者说加速曲线

我们可以在曲线上看到,在相同时间内,位置的变化会越来越大。这就说明一个物体是在进行加速运动。

11.gif

加速运动曲线

这种曲线一般应用在对象移出界面时,这些可能是系统通知,也可能只是界面中的卡片设计。但是记住,这种动画曲线只是会用在物体移出界面时,而反过来就不适用了。

12.gif

加速曲线应用在物体移出界面时

动画曲线有助于表达正确的情绪。在下面的例子中,物体动画的持续时间和位移大小都是相同的,但你会发现即使是曲线上一些微小的变化也会让你看动画的感受不同。

当然,通过改变曲线,可以让物体的运动显得更加真实自然。

13.gif

相同的持续时间和相同的位移变化,但是会有不同的感受

缓出或者说减速曲线

与缓入恰恰相反,物体的运动在开始时位移变化很大,但是后面会越来越小直到最后完全停止。

14.gif

减速曲线

这种类型的运动曲线通常是用在物体进入界面中时——快速进入屏幕然后再慢慢停下来,在不同卡片或对象从屏幕外进入界面时可以应用上。

15.gif

减速曲线在此时会让动画显得更加自然

缓入缓出或者说标准曲线

这种曲线使物体有加速和减速的过程。这种类型的动画在界面中是最常用的,当你还在迟疑该用怎样的动画曲线时,选择标准曲线准没错。

16.gif

标准曲线

根据谷歌规范,建议最好是用一些非对称曲线来使得物体运动的更加自然真实。动画的结尾会比动画的开头更加需要去强调,这样的结果是加速时间要小于减速时间。在这个情况下,动画能够引导用户更加关注元素的结束部分,以至于关注到其新的状态。

17.gif

注意观察对称与非对称曲线的区别

缓入缓出动画常被用在界面中对象从一个位置移动到另一个位置时。在这种情况下,动画的目的是为了不让人有过多不必要的关注。

18.gif

卡片的非对称曲线运动

同样的情况还适用于,元素在界面中消失后用户还能随时显示,抽屉导航就是这样的例子。

19.gif

抽屉导航的收起过程就是应用到了标准曲线

从很多例子中可以看出许多初学者都忽略了一个基本的规则——开始动画不等同于结束动画,应该分别去设置,比如在抽屉导航动效中——打开是一个减速动画但关闭时却是一个标准曲线动画。另外,根据谷歌设计规范,物体出现的动画持续时间应该略长,以吸引用户更多的注意力。

20.gif

侧边栏的动画是配合减速曲线和标准曲线一起来实现的

有一个立方贝塞尔函数常用来描述这种速度曲线。之所以叫立方是因为它是基于2个点来的。第一个点在坐标轴中是(0,0)(左下),最后一个点是(1,1)(右上)。

基于此,我们只需要描述图上的两个点,这是由贝塞尔函数的四个参数给出的:前两个是第一个点的坐标x和y,后两个是第二个点的坐标x和y。

为了便于实际工作,我建议使用2个工具网站来操作

https://easings.net/zh-cn

http://cubic-bezier.com

第一个包含一些最常使用的曲线列表,可以直接将其复制到原型工具中去。第二个是可以给你自己自定义动画的曲线,并能实时查看效果。

21.gif

不同类型的动画曲线以及他们不同的参数

动画在界面中的编排

就像芭蕾舞编排一样,主要思想是从一个状态到另一个状态的过渡引导用户注意力方向。

一般会有2种编排形式——同级动画和从属动画。

同级动画

同级动画意味着所有对象的外观都服从一个特定的规则。

在这种情况下,所有卡片都按一个相同的流程出现,引导用户注意力在一个方向上,即从上到下。如果我们不按照这个顺序,用户的注意力就会分散,如果所有元素同时出现也会很糟糕。

22.gif

用户的注意力应被引导在一个方向上

至于表格视图,就会略微有些复杂。这种情况下,用户往往是以对角线为焦点去看界面的,所以逐个出现的形式也比较糟糕。另外,逐个出现的动画在时间上也会过长,而且把用户的注意力引导成锯齿状,这是很不友好的。

23.gif

按对角线出现的表格视图动画

从属动画

从属动画是指有一个核心运动的元素,它吸引用户所有的注意力,其他元素也都跟随它的运动。这种类型的动画会显得更有秩序感,让用户更多的去关注到内容本身。

而在其他情况下,用户是很难知道他到底要去看哪个元素,注意力很容易被分散。如果要设置多个动画元素,一定要清楚的知道他的动画顺序,并尽可能的将其他动画元素弱化。

24.gif

只赋予一个中心对象生命是值得的,而所有其他的对象都服从于它。否则,用户就不知道到底应该注意哪个元素。

根据谷歌规范,当运动物体的大小不成比例地改变时,它们应该沿着弧线而不是直线运动。这有助于使动画更自然。所谓“不成比例”,是指物体的高度和宽度的增加/减少是不对称地进行的,即以不同的速度变化(例如,一个正方形变成一个矩形)。

25.gif

物体的运动如果不成比例,那应该按弧线变化。

当对象按比例改变其大小时,则此时直线运动的形式会更好。由于这种运动形式做起来容易得多,弧线轨迹运动的规律就往往被忽视。在现在很多应用中,我们都能找到这种例子。

26.gif

等比的物体运动轨迹应该使用直线

曲线轨迹运动也会有两种实现方式:第一种是开始水平移动,然后以垂直运动结束;第二种是开始垂直移动,然后以水平运动结束。

物体沿曲线移动的路径必须与滚动界面的方向重合。例如,在下面的例子中,我们可以上下滚动界面,相应地,卡片以垂直的方式展开更合适——先向右,然后向下。

27.gif

展开/折叠卡片的方向应与界面的轴线重合

如果物体的运动路径彼此相交,它们就应该不能穿过对方。物体应该通过减慢或加速自身的速度为另一个物体的运动留下足够的空间。另一种方式——只是推开其他物体。为什么要这么做?因为我们假设界面中的所有对象都位于一个平面上。(译者注:对于这一点我不是很认同,为了更加真实么?)

28.gif

在运动过程中,物体不应该互相穿透,而是为另一个物体的运动留下空间。

在另一种情况下,移动的物体可以通过抬高于其他物体,而不会以溶解或通过其他物体的形式来移动。为什么?因为我们相信界面上元素的行为应该要符合物理定律,在现实世界中没有任何实体能够做到直接穿透对方。

29.gif

物体可以被抬高于其他元素之上来移动

总结

如果我们总结上述所有的规律和原则,可以得出界面动画应该要反映物质世界的运动,例如我们都知道的,摩擦,加速等等。模仿现实世界的行为我们可以创建一个优秀的动画,满足用户的心理预期。

一个优秀的动画,应该是不会那么刻意,也不会分散用户对目标的注意力。如果是的话,就需要优化它,或者干脆把动画去掉。核心标准是动画不应该降低用户执行任务的效率。

但是不要忘记,用户对动画的好坏感受,是感性大于理性的。所以,最好是把做出来的动画给用户进行评鉴,然后再不断优化它。

 

 

文章来源:云端网

蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码蓝小助,报下信息,蓝小助会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。


微信图片_20210513163802.png


 



分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

 

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

UI设计原则:可视化层次结构(Visual Hierarchy)设计方法介绍

seo达人

 

这篇文章是一篇很实用的文章,与 格式塔心理学有异曲同工之处,而这篇文章是基于当前流行的手机UI体验去写的,对于移动互联网这个时代来说更接地气,更实用,希望对您有用,enjoy!

1.png

随着技术和用户界面的变化,对视觉设计设计技能的需求不断增长。通过每年出现的典型用户界面的新例子,我们对视觉层次,感知和构图的基本理解有所改变吗?

视觉感知的现代概念不仅植根于科学,也植根于心理学。因此,无论用户界面如何不断变化,我们看到和感知视觉信息的方式都将保持不变。考虑到这一点,当代交互设计是否有可能改进图形组合和视觉层次结构的基础?

视觉感知的基本规则对于任何视觉设计都是至关重要的,因为它们指示如何尽可能快地传达具有嵌入意义的信息。然而,由于视觉设计是图形设计的近亲,因此这些标准是针对印刷媒体而建立的,并且尚未被重新定义为数字化。

像“数字包豪斯学校”这样可能建立新设计原则的东西尚未形成。当人们以与印刷完全不同的方式体验 UI 时,视觉层次和组合的规则不仅仅是过时的,而且会在用户界面中崩溃。

在大多数情况下,设计师仍然倾向于将屏幕视为静态的二维对象,而交互设计师面临的挑战是创新,而不仅仅是将打印格式应用于他们的数字媒体项目。但在新设计发展之前,需要重新审视对视觉层次,感知和构图的基本理解。

 2.jpg

 

Web上的大多数设计层次结构最初来自基于印刷的设计,例如报纸布局。

可视化层次结构:对交互式接口的可视化合成的新理解

什么是视觉层次结构,为什么它很重要?视觉层次结构是在组合中布置内容,以便有效地传达信息和传达意义。可视层次结构首先将查看者引导至最重要的信息,然后引导至次要内容。

通过适当使用大小,颜色,形状,距离,比例和方向来建立,通过创造性地使用决定视觉层次的图形元素来传达构图的含义,概念和情绪。

3.png

设计师如何使用尺寸,颜色,形状和方向来传达设计中的意义和情绪?

视觉层次结构对于每种类型的视觉设计都至关重要,无论是需要引导访问者眼睛的登陆页面还是移动UI的导航。用户对每个元素的理解基于组合中的其他元素及其上下文。相应地处理组成元素以形成视觉关系,从而在整个设计中建立视觉层次。

可视层次结构中的颜色

视觉层次结构的许多规则可能看起来非常简单甚至是平庸的,但它们是良好视觉设计的重要基础。例如,颜色是视觉设计中最具影响力的创意元素。

考虑红十字与单色交叉的直接含义。几乎普遍,红十字标志着中立和保护。这样就可以与颜色的使用立即进行沟通。颜色也常用于识别群体,因为当三个单色群体中的一个红色交叉以某种方式突出显示为更重要时。

明亮,丰富的色彩比柔和的色彩更突出,因此具有更大的视觉冲击力。在界面中,颜色可用于呈现结构感并指向可用的交互。单色界面中的单色可以区分选择,甚至可以建议用户悬停在按钮之外的内容。

4.png

 

单色设计元素中的颜色或缺乏颜色可用于概述UI元素并在潜意识层面吸引用户。

颜色也被赋予了意义和情感,可以将明确的信息传递给观众的潜意识。在品牌推广方面,对色彩进行了大量的心理学研究,因为它在消费者与品牌进行任何有意义的互动之前就会产生内心的反应。例如,蓝色通常被认为是可靠的,安全的和平静的,而红色是刺激性的,并且已知会增加人们的心率。然而,取决于培养,颜色可能具有不同的重要性。

在网页设计中有意义的,The Names for Change 网站是结构化的颜色,运用的一个很好的案例。该网站通过使用颜色立即传达其结构; 组织默认是分散的,但可以按主题和/或颜色重新排列。

然而,所选择的音调有助于克服该站点意义的潜在困难之一。为袜子或卫生棉条等日常用品筹款并不足以让自己出售,因此该网站的激进图形基调提高了日常用品的感知价值,同时建立了必要的基础组织结构。

5.jpg

通过“名称更改”站点上的颜色使用视觉层次结构和结构。

可视层次结构中的大小

让我们想象一下坐在三个小鸟旁边的一只大鸟的插图。没有任何进一步的信息,这个简单的图形立即传达其元素之间的关系:父母和孩子,它们共同传达一个家庭。

在传统的图形设计中,典型的策略是使最重要的元素成为最大的元素,然后逐步缩小元素的尺寸。大小建立视觉层次结构,因为最大的元素首先引起注意,因此看起来是最重要的。

在文本主体中也经常使用不同的字体大小来指示显着的差异,例如标题,部分和引号。次要内容(例如图像标题)通常较小,以便不与文本主体竞争。

6.jpg

考虑一些最广泛使用的可视界面,例如Instagram。屏幕上没有任何内容与图像和视频竞争 – 它们占据了大多数屏幕的60%以上。 UI的目的是明确的。

在网页设计中颠覆视觉层次结构的典型结构的一个例子是艺术/设计工作室Ro / Lu的投资组合网站。他们个性的网站可能不是最直观的,但它挑战了典型的在线创意组合的视觉安排。由于各种项目的有意随机化,每次访问者访问该网站时,会有不同的项目在视觉中心展示,这使得每次访问都会有惊喜。

在大多数创意设计工作室的作品集中,作品没有按层次组织,因为每个项目都是独特的,并且被认为同样重要Ro / Lu网站的设计创造了一个动态的构图,每次访问都有不同程度的惊喜,并鼓励观众调查工作室的广泛组合。因此,设计工作室的折衷,跨学科性质由内容的随机显示。

7.jpg

艺术/设计工作室的网站Ro / Lu upgnds设计层次结构以产生巨大的效果。

可视化层次结构的排列

视觉层次中的对齐通过在空间上连接元素来传达秩序感。与非线性小说中的章节一样,想象一个在图形构图中脱颖而出的正方形。当单个元素破坏已建立的结构时,它从组合物中脱颖而出,从而获得相对于其余元素的含义。

除非元件从视觉网格突出,即从有序感中突出,否则刚性构图可能看起来是停滞的并且在视觉上不感兴趣。不对齐或“打破网格”是一种给予图形元素更多视觉权重的机会。这个概念是设计中视觉层次结构的基础。

根据传统视觉设计中的原理,放置在框架中心的元件看起来更重要。例如,主要内容或界面元素可以放在中心,而导航,菜单和其他次要内容通常保持在侧面。

但开创性的设计师喜欢挑战现状。当交互式设计应用基本的视觉层次原则,然后将界限推向创新的视觉组合时,就会产生有趣的新体验。通过使用不同的对齐,在元素之间建立新的关联和含义。

例如,DNA项目是一个使用一系列脱节层次结构来传达音乐家专辑创意结构的网站。该网站的结构很复杂,专辑的结构也是如此。

8.jpg

DNA项目的网站具有不寻常但清晰的视觉层次结构。

可视化层次结构中的图形

谈到形状时,让我们考虑一下简单的心形如何在大多数社交网络UI中传达其对“喜欢”的潜在用途。要确定重要性或群体,请考虑四个圈子中的一个心脏。几何形状就像颜色一样,形状带有某些内涵,赋予元素个性或意义。

在交互式设计中,几何形状对于有效沟通至关重要,因为它们比文本更快速,更普遍地传达意义。代替文本,图标(符号)(通常是简单的几何形状)已成为大多数导航系统和UI的模拟。

“喜欢”图像,下载文件,拨打电话或查看消息背后的目标简单直接地用图标(几何形状)传达。在全球市场中,这种有效的视觉通信形式变得越来越重要,其中数字产品通常为具有多种语言的广大国际受众提供服务

 

9.png

报纸必须迅速调整他们的设计以适应新技术。其他内容产业也纷纷效仿。

要突出传统印刷和数字媒体之间不同的互动模式,请考虑在艺术部分搜索实际报纸和在大多数应用中使用搜索图标之间的区别。直到最近,大多数报纸网站都将它们的页面布局与打印时相同,并且筛选内容的体验是笨拙和迷失方向。

Signes du Quotidien网站打破传统的网页布局,以微妙的方式使用基本的方形和圆形,呈现独特的视觉层次结构,引导访问者浏览内容。菜单位于页面的中心,当访问者点击它时,会出现代表网站四个部分的四个彩色圆点。访客然后将其中一个点拖入正方形以转到该部分。

10.jpg

日常生活的标志网站

可视化层次结构中的动画

移动元素将在一组停滞元素中承载更大的视觉重量,并且视觉层次中的运动是不可能在打印中使用的原则,但是肯定可以包括在视觉设计器的工具箱中。

除了自身的字面翻译之外,运动能够进行什么交流?通常在UI中使用Motion作为元素可以与之交互的线索。是否可以进一步推动运动的使用,并将其作为一种独特的交流方式?如果视觉层次不仅仅是关于沟通的效率,还关乎嵌入的意义,那么运动如何被用作必要的视觉交流工具?

对于I Remember网站,主界面(动画)立即引人注目,因为它邀请互动。虽然动作和界面是功能性导航工具,但视觉设计师利用这些元素的潜在损失作为传达网站潜在使命的方式:阿尔茨海默病。就像组织为其筹集资金的患者的褪色记忆一样,如果没有积极的互动,网站就会慢慢消失。

11.jpg

可视化层次结构中的声音

声音是另一种不可能在印刷媒体中使用的工具,但尚未在等级原则中发展。由于声音完全是非视觉的,因此没有规则可供参考。但声音也可以是一种有效传达内容,情感或意义的设计工具。携带某些声音的设计元素可以相对于彼此进行分组,而最大胆的那些可能看起来是最重要的或者可能表示与该组的分离。

附加到元素的声音质量应该能够快速识别,表征或帮助构建内容。与其相关视觉元素形成对比的声音如何传达新的含义?

声音本身可能非常复杂,以至于在感知到任何视觉之前,它们会建立整个情绪或设计信息。就像彩色背景建立一种情绪一样,声音可以放在背景中,或者在UI中提供反馈,例如响应移动设备上的按钮。该技术的原理是基本的,但它可以采用的创造力是魔法可以发生的地方。

由于其在集体的创造性工作中的重要性,为古根海姆德国艺术家组织ZERO展览创建的网站使用声音作为大气背景,并且作为导航网站时的反馈形式。大胆的铃声建立代表主题开头的部分,而第三级项目则在后台点击。

12.png

位于古根海姆的艺术家团体ZERO的网站,其中声音起着重要作用

可视层次结构的概念

视觉层次结构是一个简单的概念,理解理论实际上比设计者执行结构良好的组合的实际能力更容易。然而,在保持良好设计的同时在新介质中具有创造性是具有挑战性的。

新媒体一直出现,挑战性的情况不会减弱 – 恰恰相反。如今,有超过200种不同的屏幕尺寸在使用中。那只是二维的。首先,它是互联网,桌面浏览器,然后是移动设备和平板电脑,现在我们正在通过互动电视,物联网,可穿戴设备,虚拟和增强现实等技术进入新的领域。

真正推动数字媒体界限的设计仍处于起步阶段。希望视觉层次和良好设计的原则能够跟上技术的快速发展,使我们的数字媒体体验仍然充满意义和乐趣。

原文:Toplal
翻译:云端设计

文章来源:云端网

蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码蓝小助,报下信息,蓝小助会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

微信图片_20210513163802.png

 

分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

 

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

 

手把手教你利用js给图片打马赛克

前端达人

效果演示

在这里插入图片描述

Canvas简介

这个 HTML 元素是为了客户端矢量图形而设计的。它自己没有行为,但却把一个绘图 API 展现给客户端 JavaScript 以使脚本能够把想绘制的东西都绘制到一块画布上。

HTML5 标签用于绘制图像(通过脚本,通常是 JavaScript)

不过, 元素本身并没有绘制能力(它仅仅是图形的容器) - 您必须使用脚本来完成实际的绘图任务

getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性

本手册提供完整的 getContext(“2d”) 对象属性和方法,可用于在画布上绘制文本、线条、矩形、圆形等等

标记和 SVG 以及 VML 之间的差异:

标记和 SVG 以及 VML 之间的一个重要的不同是, 有一个基于 JavaScript 的绘图 API,而 SVG 和 VML 使用一个 XML 文档来描述绘图。

这两种方式在功能上是等同的,任何一种都可以用另一种来模拟。从表面上看,它们很不相同,可是,每一种都有强项和弱点。例如,SVG 绘图很容易编辑,只要从其描述中移除元素就行。

要从同一图形的一个 标记中移除元素,往往需要擦掉绘图重新绘制它。
在这里插入图片描述

知识点简介

  • 利用js创建图片
let img = new Image() //可以给图片一个链接 img.src = 'https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=826495019,1749283937&fm=26&gp=0.jpg' //或者本地已有图片的路径 //img.src = './download.jpg' //添加到HTML中 document.body.appendChild(img)  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

  • canvas.getContext(“2d”)

语法:
参数 contextID 指定了您想要在画布上绘制的类型。当前唯一的合法值是 “2d”,它指定了二维绘图,并且导致这个方法返回一个环境对象,该对象导出一个二维绘图 API

let ctx = Canvas.getContext(contextID)  
  • 1

  • ctx.drawImage()

JavaScript 语法 1:
在画布上定位图像:

context.drawImage(img,x,y);  
  • 1

JavaScript 语法 2:
在画布上定位图像,并规定图像的宽度和高度:

context.drawImage(img,x,y,width,height);  
  • 1

JavaScript 语法 3:
剪切图像,并在画布上定位被剪切的部分:

context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);  
  • 1

  • ctx.getImageData()

JavaScript 语法
getImageData() 方法返回 ImageData 对象,该对象拷贝了画布指定矩形的像素数据。
对于 ImageData 对象中的每个像素,都存在着四方面的信息,即 RGBA 值:
R - 红色 (0-255)
G - 绿色 (0-255)
B - 蓝色 (0-255)
A - alpha 通道 (0-255; 0 是透明的,255 是完全可见的)
color/alpha 以数组形式存在,并存储于 ImageData 对象的 data 属性中

var imgData=context.getImageData(x,y,width,height);  
  • 1

  • ctx.putImageData()

putImageData() 方法将图像数据(从指定的 ImageData 对象)放回画布上。

接下来跟着我一步一步做完这个小功能叭~
在这里插入图片描述

step-by-step

准备好我们的图片,并添加上我们的方法

<body> <img src="./download.jpg"> <button onclick="addCanvas()">生成Canvas</button> <button onclick="generateImg()">生成图片</button> </body>  
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
接下来写addCanvas方法

function addCanvas() { let bt = document.querySelector('button') let img = new Image(); //1.准备赋值复制一份图片 img.src = './download.jpg'; img.onload = function() { //2.待图片加载完成 let width = this.width let height = this.height let canvas = document.createElement('canvas') //3.创建画布 let ctx = canvas.getContext("2d"); //4.获得该画布的内容 canvas.setAttribute('width', width) //5.为了统一,设置画布的宽高为图片的宽高 canvas.setAttribute('height', height) ctx.drawImage(this, 0, 0, width, height); //5.在画布上绘制该图片 document.body.insertBefore(canvas, bt) //5.把canvas插入到按钮前面 } }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

成功在画布上得到图片:
在这里插入图片描述

嗯,我们已经成功走出了成功的一小步,接下来是干什么呢?…嗯,我们需要利用原生的onmouseuponmousedown事件,代表我们按下鼠标这个过程,那么这两个事件添加到哪呢?

没错,既然我们要在canvas上进行马赛克操作,那我们必然要给canvas元素添加这两个事件

考虑到我们创建canvas的过程复杂了一点,我们做一个模块封装吧!

function addCanvas() { let bt = document.querySelector('button') let img = new Image(); img.src = './download.jpg'; //这里放自己的图片 img.onload = function() { let width = this.width let height = this.height let { canvas, ctx } = createCanvasAndCtx(width, height) //对象解构接收canvas和ctx ctx.drawImage(this, 0, 0, width, height); document.body.insertBefore(canvas, bt) } } function createCanvasAndCtx(width, height) { let canvas = document.createElement('canvas') canvas.setAttribute('width', width) canvas.setAttribute('height', height) canvas.setAttribute('onmouseout', 'end()') //修补鼠标不在canvas上离开的补丁 canvas.setAttribute('onmousedown', 'start()') //添加鼠标按下 canvas.setAttribute('onmouseup', 'end()') //添加鼠标弹起 let ctx = canvas.getContext("2d"); return { canvas, ctx } } function start() { let canvas = document.querySelector('canvas') canvas.onmousemove = () => { console.log('你按下了并移动了鼠标') } } function end() { let canvas = document.querySelector('canvas') canvas.onmousemove = null }  
  • 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

测试一下我们的start()end()是否生效了
在这里插入图片描述
嗯,目前来看,我们的代码依然如我们所愿的正常工作

接下来的挑战更加严峻,我们需要去获取像素和处理像素,让我们再重写start()函数

 function start() { let img = document.querySelector('img') let canvas = document.querySelector('canvas') let ctx = canvas.getContext("2d"); imgData = ctx.getImageData(0, 0, img.clientWidth, img.clientHeight); canvas.onmousemove = (e) => { let w = imgData.width; //1.获取图片宽高 let h = imgData.height; //马赛克的程度,数字越大越模糊 let num = 10; //获取鼠标当前所在的像素RGBA let color = getXY(imgData, e.offsetX, e.offsetY); for (let k = 0; k < num; k++) { for (let l = 0; l < num; l++) { //设置imgData上坐标为(e.offsetX + l, e.offsetY + k)的的颜色 setXY(imgData, e.offsetX + l, e.offsetY + k, color); } } //更新canvas数据 ctx.putImageData(imgData, 0, 0); } } //这里为你提供了setXY和getXY两个函数,如果你有兴趣,可以去研究获取的原理 function setXY(obj, x, y, color) { var w = obj.width; var h = obj.height; var d = obj.data; obj.data[4 * (y * w + x)] = color[0]; obj.data[4 * (y * w + x) + 1] = color[1]; obj.data[4 * (y * w + x) + 2] = color[2]; obj.data[4 * (y * w + x) + 3] = color[3]; } function getXY(obj, x, y) { var w = obj.width; var h = obj.height; var d = obj.data; var color = []; color[0] = obj.data[4 * (y * w + x)]; color[1] = obj.data[4 * (y * w + x) + 1]; color[2] = obj.data[4 * (y * w + x) + 2]; color[3] = obj.data[4 * (y * w + x) + 3]; return color; }  
  • 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

嗯,我们离成功不远拉,最后一步就是生成图片

好在canavs给我们提供了直接的方法,可以直接将画布导出为Base64编码的图片:

function generateImg() { let canvas = document.querySelector('canvas') var newImg = new Image(); newImg.src = canvas.toDataURL("image/png"); document.body.insertBefore(newImg, canvas) }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

最终效果:
在这里插入图片描述

是不是无比轻松呢~,来看看你手写的代码是否和下面一样叭:

完整代码

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <body> <img src="./download.jpg"> <button onclick="addCanvas()">生成Canvas</button> <button onclick="generateImg()">生成图片</button> </body> <script> function addCanvas() { let bt = document.querySelector('button') let img = new Image(); img.src = './download.jpg'; //这里放自己的图片 img.onload = function() { let width = this.width let height = this.height let { canvas, ctx } = createCanvasAndCtx(width, height) ctx.drawImage(this, 0, 0, width, height); document.body.insertBefore(canvas, bt) } } function createCanvasAndCtx(width, height) { let canvas = document.createElement('canvas') canvas.setAttribute('width', width) canvas.setAttribute('height', height) canvas.setAttribute('onmouseout', 'end()') canvas.setAttribute('onmousedown', 'start()') canvas.setAttribute('onmouseup', 'end()') let ctx = canvas.getContext("2d"); return { canvas, ctx } } function start() { let img = document.querySelector('img') let canvas = document.querySelector('canvas') let ctx = canvas.getContext("2d"); imgData = ctx.getImageData(0, 0, img.clientWidth, img.clientHeight); canvas.onmousemove = (e) => { let w = imgData.width; //1.获取图片宽高 let h = imgData.height; //马赛克的程度,数字越大越模糊 let num = 10; //获取鼠标当前所在的像素RGBA let color = getXY(imgData, e.offsetX, e.offsetY); for (let k = 0; k < num; k++) { for (let l = 0; l < num; l++) { //设置imgData上坐标为(e.offsetX + l, e.offsetY + k)的的颜色 setXY(imgData, e.offsetX + l, e.offsetY + k, color); } } //更新canvas数据 ctx.putImageData(imgData, 0, 0); } } function generateImg() { let canvas = document.querySelector('canvas') var newImg = new Image(); newImg.src = canvas.toDataURL("image/png"); document.body.insertBefore(newImg, canvas) } function setXY(obj, x, y, color) { var w = obj.width; var h = obj.height; var d = obj.data; obj.data[4 * (y * w + x)] = color[0]; obj.data[4 * (y * w + x) + 1] = color[1]; obj.data[4 * (y * w + x) + 2] = color[2]; obj.data[4 * (y * w + x) + 3] = color[3]; } function getXY(obj, x, y) { var w = obj.width; var h = obj.height; var d = obj.data; var color = []; color[0] = obj.data[4 * (y * w + x)]; color[1] = obj.data[4 * (y * w + x) + 1]; color[2] = obj.data[4 * (y * w + x) + 2]; color[3] = obj.data[4 * (y * w + x) + 3]; return color; } function end() { let canvas = document.querySelector('canvas') canvas.onmousemove = null } </script> </body> </html>  
  • 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
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116

当然,你可以做更多创作,比如上面打的马赛克是正方形的,你可以利用你的数学知识让其变为圆形,以圆心为鼠标中心扩散

你也可以选择完善一些过程,例如马赛克位置打错了,可以选择将画布清空然后重新开始~
或者做一些善后处理,导出图片后隐藏canvas画布
点个赞吧

蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码蓝小助,报下信息,蓝小助会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

截屏2021-05-13 上午11.41.03.png


文章来源:csdn   作者: VGtime

分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

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


设计师必修课:如何最大限度满足顾客设计需求?

seo达人

 

这个问题不仅局限于日常的工作需求中,我认为这是一种很有趣的思维方式,我们可以运用这个思维模型,帮你Get“如何成为需求方眼里更受欢迎的设计师”、“如何做好晋级答辩”等问题。

要讲清楚这个问题,首先,我们要回顾一下用户体验的相关概念。

01、什么是以用户为中心的设计

用户体验这个词最早被广泛认知是在上世纪90年代中期,由用户体验设计师唐纳德·诺曼(Donald Norman)所提出和推广的。

用户体验,即用户在使用一个产品或系统之前、使用期间和使用之后的全部感受,包括情感、信仰、喜好、认知印象、生理和心理反应、行为和成就等各个方面。

UCD即user-centered design译为“以用户为中心的设计”。UCD 的核心思想非常简单:在开发产品的每一个环节,都把用户列入思考范围。通常会关注以下要素:可用性,用户特征,使用场景,用户任务和用户流程。

02、常规的UCD流程

1、确定场景:产品的主要用户是谁,驱动用户使用产品的动力是什么,用户有什么诉求以及用户在什么情况下使用产品;

2、确定需求:明确场景后,就可以确定详细的产品需求;

3、构建设计方案和开发:根据产品目标和用户需求,开始产品设计和开发的迭代过程;

4、评估产品:获得用户反馈是至关重要的一步,是产品迭代优化的主要驱动。

重复上述过程以进一步打磨产品

03、万能钥匙:用户>需求>方案>反馈

基于以上两个概念,我将UCD思维模型简化为:用户>需求>方案>反馈,这也是今天我要探讨的主题,下面,我会通过几个案例,来解释如何运用这个思维模式到我们的工作中。

04、实例与运用

· 场景一:做一名受需求方欢迎的设计师

产品经理:“设计图多久能看啊?这个需求时间我们着急上线,能快速出来看一版吗?”

设计师:“设计也是需要花时间的,那么短时间内完不成啊”

产品经理:“这个设计图设计的有问题啊,这里应该这么改XXX”

设计师:“那样改太丑了”

这个场景经常在我们身边发生,如果你也遇到过这样的情况,我们可以换一个视角想一想:设计师和产品经理是上下游的协同方,要共同去完成一个既定的任务。此时,设计师面对的其实有2类用户:对接的产品经理和该需求的实际用户,大多数设计师都会有意识考虑后者,所以,今天我来谈谈前者。

按照用户>需求>方案>反馈的思维模式,我们把对接过程拆分如下:

1、用户:设计师对接的产品经理PM。

2、需求:PM希望设计师能清晰的理解他的诉求,在技术资源有限且允许的周期内产出设计图,这样,他才能推进到下一个环节以保证上线。

3、方案:PM的诉求是产出和效率,也就是设计师需要高效高质量的完成需求,再次拆分一下。

如何产出高质量设计图呢?需要我们理解产品目标,用户需求进行分析、场景理解等,最后才是执行环节。执行就考验手活了,这里不多赘述。

如何提升效率?减少信息不对称、积极主动沟通是提升效率的关键,在产品目标及用户理解>场景分析>方案执行等环节都需要及时和产品积极沟通,达成共识。

4、反馈:定期找对接的需求方复盘协作问题,要有开放的心态,勇于面对双方的吐槽,做到有问题及时响应及时解决。除此之外,我也建议设计师要争取更多的机会贴近业务,了解各阶段业务的问题和痛点,真正做到帮助产品实现业务目标。

所以当我们把产品经理当做我们的用户,我们的协同流程理解为闭环的用户体验时,很多问题就迎刃而解了。

· 场景二:如何顺利通过晋级?

“我该讲点啥?”
“我做的项目都很散、碎,不知道怎么整合在一起”
“我的能力怎么才能展现给评委”
这是很多设计师面对晋级的困惑。

虽然不能在一篇文章里面一一解答清楚这些问题,但是我们仍然能将晋级过程思考成闭环的用户体验。接下来,我们继续拆解吧。

1、用户:评委 ,这里也可以做用户分层,包含:跨职能的评委,和设计团队的专业线评委。

2、需求:评委要在10-15分钟内,判断你能否达到目标职级的要求。

3、方案:帮助评委认可我真的达到目标职级的要求。大多数评委对答辩人其实都不太了解,我们应该站在不了解自己的角度去讲述。

所以需要我们:摆业绩、讲能力,把评委关心的事情(符合度)呈现出来,给他判断依据和线索。当然所有的讲述素材都是日常工作中,点点滴滴积累和沉淀的。

4、反馈:结合评委、直属leader的反馈,思考述职的表现。

05、总结

一流设计网(yiliusheji.com)提示以用户为中心、做好用户体验是一个很好的思维方式,今天我只是列举了两个常见的例子,我认为还能延伸到工作、生活中的方方面面。

比如做一个项目汇报,当我们面对的汇报对象不同时,我们讲述的内容和方式都要根据汇报对象,也就是用户需求进行设计。

同理,现在大家都在讲产业升级,深入线上线下体验,这其中的每一个环节触点,我们所面对的用户、场景也是多样化的,需要我们用颗粒度更细的视角去思考。

文章来源:搜狐网

蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码蓝小助,报下信息,蓝小助会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

微信图片_20210513163802.png

 

分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

 

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

 

Slick.js使用方法——幻灯片

前端达人

  
和Swiper.js一样

简介

slick 是一个基于 jQuery 的响应触摸式幻灯片插件,支持IE8+,Chrome, Firefox, and Safari,具有以下特点:

  • 支持响应式
  • 浏览器支持 CSS3 时,则使用 CSS3 过度/动画
  • 支持移动设备滑动
  • 支持桌面浏览器鼠标拖动
  • 支持循环
  • 支持左右控制
  • 支持动态添加、删除、过滤
  • 支持自动播放、圆点、箭头、回调等等

兼容

浏览器兼容:兼容 IE7+ 及其他主流浏览器,若要兼容 IE7,需修改 CSS(slick.css)。

jQuery兼容:兼容 1.7 及以上版本。

使用方法

1、引入文件

  
    
<link rel="stylesheet" href="style/slick.css">
<script src="script/jquery.min.js"></script>
<script src="script/slick.min.js"></script>

注意:需jQuery 1.7

2、HTML

  
    
<div class="slick">
    <div><a href="http://www.dowebok.com"><img src="images/1.jpg" alt=""></a></div>
    <div><a href="http://www.dowebok.com"><img src="images/2.jpg" alt=""></a></div>
    <div><a href="http://www.dowebok.com"><img src="images/4.jpg" alt=""></a></div>
    <div><a href="http://www.dowebok.com"><img src="images/3.jpg" alt=""></a></div>
    <div><a href="http://www.dowebok.com"><img src="images/5.jpg" alt=""></a></div>
</div>

3、JavaScript

  
    
$(function(){
    $('.slick').slick({
        dots: true
});
});

参数

参数 类型 默认值 说明
accessibility 布尔值 true 启用Tab键和箭头键导航
autoplay 布尔值 false 自动播放
autoplaySpeed 整数 3000 自动播放间隔
centerMode 布尔值 false 中心模式
centerPadding 字符串 ’50px’ 中心模式左右内边距
cssEase 字符串 ‘ease’ CSS3 动画
customPaging function n/a 自定义分页
dots 布尔值 false 指示点
draggable 布尔值 true 启用桌面拖动
easing 字符串 ‘linear’ animate() fallback easing
fade 布尔值 false 淡入淡出
arrows 布尔值 true 左右箭头
infinite 布尔值 true 循环播放
lazyLoad 字符串 ‘ondemand’ 延迟加载,可选 ondemand 和 progressive
onBeforeChange(this, index) method null 开始切换前的回调函数
onAfterChange(this, index) method null 切换后的回调函数
onInit(this) method null 第一次初始化后的回调函数
onReInit(this) method null 再次初始化后的回调函数
pauseOnHover 布尔值 true 鼠标悬停暂停自动播放
responsive object null 断点触发设置
slide 字符串 ‘div’ 滑动元素查询
slidesToShow 整数 1 幻灯片每屏显示个数
slidesToScroll 整数 1 幻灯片每次滑动个数
speed 整数 300 滑动时间
swipe 布尔值 true 移动设备滑动事件
touchMove 布尔值 true 触摸滑动
touchThreshold 整数 5 滑动切换阈值,即滑动多少像素后切换
useCSS 布尔值 true 使用 CSS3 过度
vertical 布尔值 false 垂直方向

方法

方法 Argument 说明
slick() options : object 初始化 slick
unslick()   销毁 slick
slickNext()   切换下一张
slickPrev()   切换上一张
slickPause()   暂停自动播放
slickPlay()   开始自动播放
slickGoTo() index : int 切换到第 x 张
slickCurrentSlide()   返回当前幻灯片索引
slickAdd() element : html or DOM object, index: int, addBefore: bool Add a slide. If an index is provided, will add at that index, or before if addBefore is set. If no index is provided, add to the end or to the beginning if addBefore is set. Accepts HTML String
slideRemove() index: int, removeBefore: bool Remove slide by index. If removeBefore is set true, remove slide preceding index, or the first slide if no index is specified. If removeBefore is set to false, remove the slide following index, or the last slide if no index is set.
slickFilter() filter : selector or function Filters slides using jQuery .filter syntax
slickUnfilter()   Removes applied filter
slickSetOption(option,value,refresh) option : string(option name), value : depends on option, refresh : 布尔值 Sets an option live. Set refresh to true if it is an option that changes the display

演 示 下 载



GitHub:https://github.com/kenwheeler/slick


蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码蓝小助,报下信息,蓝小助会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

截屏2021-05-13 上午11.41.03.png


文章来源:csdn   作者:cc蒲公英

分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

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

设计师的数据分析与场景化设计

雪涛

       随着互联网的发展,近这几年设计圈子里大家都在讨论UGD(User Growth Design),要向UGD转型等等,以用户为中心,以增长为导向,这个概念本身并没有问题,而且是对UED的一种非常棒的进化和升级,要求设计团队需要具备更综合的专业能力与视野。本着对团队的升级优化,我也以UGD的思路对团队有了新的更高的要求,然而在这个过程中却发现在很多问题。

       

       随着各种社交平台的传播普及,什么闭环、串联、颗粒度等等这些互联网黑语,满大街飞来飞去,设计师们的PPT、汇报资料是越来越丰富多彩,但项目效果却并不明显。数据、增长的概念确实是铺开了,但却成了PPT里的装饰,并没有真正落地生根。


       经过很长时间的摸索,我们终于有了一套适合团队自己的UGD思路,也一步一步的在不断的优化提升,下面以我们做过的一个项目(用户投资路径优化)为例来说说我们对UGD的思考,以及设计师对数据分析以及场景化设计的思路。


1. U user

       以用户为中心,就是关注用户的行为,串联数据,从点线面结合场景分析,提出问题所在。

 

       作为设计师,最常关注的用户数据就是转化率、点击率、停留时长、跳转路径等等,从单一数据来看,都是一些常见的简单的数据,但要真正能够分析用户,还需要结合实际场景来分析。


案例:

       我们在分析交易线的数据时发现了一些问题,并对数据做了对比分析。



项目列表页 ] 

用户的点击主要集中在前十个投资项目,占据整个页面点击的80%。



项目详情页 ] 

用户通过列表页进入到详情页,详情页的浏览率较高,但转化却很低,另外优惠券的点击率十分高,超过85%,意味着进入到详情页的用户,基本上都进入过优惠券页面,而最终促成成交却很低。


       以上是整个交易环节最初始的两个页面,也是最核心的页面,从单个页面的数据(点)来看都属于正常漏斗数据表现,接下来我们从用户路径(线)的角度来继续分析。

       


       我们从用户当中,抽取了部分最终完成了交易的用户,对整个交易路径的进行分析,结果发现用户在列表页——详情页——优惠券这三个步骤之间反复切换。

 

       不难看出,用户在列表页、详情页、优惠券选择页来回切换,即使最终产生交易,但整个路径耗时长,反复操作,跳转不合理,导致大量流失,这是目前数据所呈现出来的情况,也是问题的核心所在。


2. G growth

       以增长为导向,以数据为依据发现或提出问题所在,确定最终需要增长(优化)的数据指标,并以此为目标展开思考,提出解决思路。

案例:

这是最典型的购物交易场景,通过上面的分析,我们再结合场景化的思路进一步整理思考用户的操作行为目的。

以投资理财的角度,换位思考,其实就是:想投资——挑选——看看优惠——挑挑其他的——再看看优惠——再看看其他的——还看优惠。


       用户为何反复的从列表页进入详情,又跳转回列表页再进入详情页?这就是突破口了,想清楚这一点,解决思路也就清晰了

我们举一个现实生活中的购物场景来帮助思考分析(灵感来源于生活)。

购物路径1:想买东西-找到对应的货架-使用优惠券并买单;


购物路径2:有优惠券-到超市看看有没有想买的-使用优惠券并买单;



       在现实生活中,除了”有想买的东西”这一主观需求外,对交易产生一定决策作用的,就是优惠。

结合前面对投资用户路径的分析来看,用户交易路径如此反复,实际上就是在同样的资金投入的前提下,对比不同的项目、不同的优惠,如何搭配才能利益最大化,这就是用户的最核心需求。


       如何帮助用户快速完成相关数据的对比,缩短操作路径,降低交易耗时,从而减少流失提升成交率,这就是解决思路,也是我们需要增长(优化)的数据指标。


       基于场景化的分析明确用户的核心需求,确定需要增长(优化)的数据指标,我们提出来了两个解决方向。



[ A方案——详情页的快速切换(优化) ]

       ,在原有的路径上,保持用户的操作习惯,新增详情页左右滑动切换的功能,用户学习成本低,开发成本低,可快速上线,但对于路径优化、数据对比不够直接,治标不治本;



[ B方案—— 设计新的快速路径(创新)]

       结合前面分析的两种现实生活中的购物场景,在原有的路径上,针对平台老客对平台项目的规则详情已经清楚了解的特点,设置多一条快速通道,减少干扰,对比直接,加快老客的决策速度,但用户学习成本高,开发成本高,虽然治本但风险也大。



3. D design

       到此为止,我们就可以进入具体的解决方案的尝试了,设计师的方案,自然就是设计稿了。


案例:

       A方案直接开发上线即可,上线后就可以收集数据进行分析了,经过两周的时间,从数据表现来看,交易总时长稍有所下降但并不明显,约下降了2%,而交易率基本持平。


[ B方案最终UI稿 ]

       在此期间B方案完成设计开发后,协调产品运营推广等业务方,选择确定部分渠道进行ABtest,经过一个多月,持续收集数据反馈优化方案,多轮ABtest后,从数据反馈来看,B方案数据提升明显,有效的降低了用户的决策时长(降低了近20%) ,提升交易成功率(老客转化提升1%),说明方案的可行性强,随即全量更新。


       从随后的数据表现来看(总转化提升0.3%,总时长降低15%),整体方案对平台的整体效益产生了积极推动作用,说证明了设计团队对于产品与企业的价值(我们不是美工)。

       在后续工作过程中,持续根据数据表现,分析,发现并提出问题,提出解决方案,测试验证,不断的循环重复,持续提升用户体验,以数据为依据,以增长(优化)为目标,这就是我们对于UGD的一些思考跟尝试。


蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码蓝小助,报下信息,蓝小助会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

截屏2021-05-13 上午11.41.03.png



文章来源:站酷   作者:包大佬

分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

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



按钮的最佳尺寸到底是多少?

雪涛

很多设计师包括我在内对按钮尺寸有着颇多困惑。为什么很多产品甚至苹果本身并没有遵循 44pt 的标准规范?为什么有些场景下的 CTA 按钮那么小?按钮的最佳尺寸到底是多少?按钮规范背后到底是什么样的科学依据?这些依据可否量化?

emmmm,如果你和我一样有着这些困惑,本篇文章应该可以给你很多启发。

按钮尺寸对点击行为的影响

按钮的尺寸具体影响到的依旧是视觉和交互的两种能力。

视觉能力上很好理解。当一个元素尺寸越大,人眼就越容易抓捕到这个元素。所以那些越重要的东西,往往会给予更大的尺寸来强制用户注意到它,这也可以解释为什么甲方总喜欢不停地在背后指指点点嫌弃元素太小,就是因为这些元素对他们来说非常重要,只是他们没有我们那么专业,知道强调一个东西的手法不仅仅是放大一种策略。

因此,相对较大的按钮尺寸从视觉上,可以迅速捕获用户的注意力,对点击行为是有益的。

而在交互能力上,涉及到的依然是前篇提到的菲茨定律——目标尺寸越大,移动至目标所花费的时间就越短。所以,较大的按钮尺寸可以降低用户交互的交互成本,使得目标更加”易点“,对点击行为同样是有益的。

但是,按钮尺寸并非越大越好,一方面是避免视觉上的失衡,另一方面也会受到界面空间限制、以及场景差异等因素的影响。

规范中的定义

我们先来看下 iOS 的。苹果规定的最小点击区域是 44pt,这意味着一旦点击区域低于 44pt,将可能会出现点击失准的情况。当然,一些控件(标签栏图标、文字链)可以在视觉表现上只有 24pt*24pt,但是会在周围加入额外的填充使其达到 44pt。

但是,在实际的 iOS 原生产品界面中,很多按钮并未严格执行 44pt 这个数值。小于 44pt 的按钮比比皆是,比如信息页的发送、App Store 的获取、购买浮层的确认、添加 siri、导航类右上角的工具型按钮,它们的点击区域为按钮本身,但是均未达到 44pt。况且其中有一些还是非常典型的 CTA 按钮,比如 App Store 产品详情页中的获取按钮,它的高度仅仅是 27pt。

按钮的最佳尺寸到底是多少?这篇给你权威答案!

而 Android 中的按钮建议尺寸是 56dp,但是和 iOS 一样存在着大量低于这个尺寸的情况。其中不乏那些 CTA 按钮。

按钮的最佳尺寸到底是多少?这篇给你权威答案!

这些情况的发生其实也很好理解,每个按钮所对应的用户场景、业务诉求不同,因此并不能一招鲜用一个尺寸吃遍所有场景。但是,有没有一些科学的依据来可量化地解释按钮尺寸对点击的影响?

从 Apple Music 说起

著名产品设计师斯科特·赫尔夫就曾在他的文章《Using science to make truly tappable user interfaces》中提过,iOS9 的 Apple Music 在锁屏界面下的按钮过小,经常会发生无法准确点击的情况,他需要集中精力精确得点击才能完成任务。

不过苹果在 iOS10 之后,锁屏界面下的三个按钮、乃至进度、音量的控制球全部被显著地增大。这使得歌曲点击操作的错误率明显下降,不论是在什么场景下(你懂得,跑步、挤地铁这些不可控的场景下总是会有听歌的需求)都可以轻松地点击。

按钮的最佳尺寸到底是多少?这篇给你权威答案!

而他为了解释按钮尺寸所带来的变化,引入了历史上著名的两个实验。

第一次实验

2006 年,芬兰 Oulu 大学,Maryland 大学和 Parck 学院的研究人员组成一个研究小组。他们的研究目标是,确定在触摸屏幕上单手使用最容易的按钮尺寸。

按钮的最佳尺寸到底是多少?这篇给你权威答案!

他们进行了两组不同场景的实验。第一组让受试者执行一次性的任务,点击一个 CTA 按钮、复选框或者多选框;第二组让受试者执行多次连续的任务,比如输入电话号码。并且在实验期间,研究人员测试了每一种场景下按钮的尺寸。最终的实验结果表明,单个任务下,按钮尺寸小于 9.2mm 后错误率显著增加,而多次连续任务下,按钮尺寸小于 9.6mm 后的错误率显著增加。

特别的是,对于多次连续任务,9.6mm 到 11.5mm 之间的错误率基本不变。

按钮的最佳尺寸到底是多少?这篇给你权威答案!

看到这,来稍微总结一下,9.2mm 和 9.6mm 是两个关键的尺寸节点。在单次任务和多次连续任务下,按钮尺寸分别小于 9.2mm 和 9.6mm 会导致错误率的攀升。这个结果和 MIT Touch Lab 研究得出的最佳热区尺寸 10mm 很接近。

第二次实验

当然,这还不算完。5 年后,德国两所大学的研究人员又进行了一项类似的研究,目的是确定触摸屏幕按钮的最佳大小。

他们的实验方法相对就很潮了。他们专门开发了一款安卓游戏,游戏玩法也很无脑:玩家必须要精准地点击到屏幕中任何地方飘动的任意尺寸的圆圈,游戏才能继续。并且速度越快,得分也就越高。

按钮的最佳尺寸到底是多少?这篇给你权威答案!

这款游戏在上线之后被下载了 10w 次,并且悄咪咪得暗中记录了用户所有的点击行为,记录总量约为 1.2 亿次。

最后根据统计分析,得出了错误率和圆圈尺寸的图表关系。你可以看到,和 5 年前的实验同样,呈现类似的指数关系。研究人员根据图表发现:

在圆圈尺寸小于 12mm 后,错误率开始逐步提升。在尺寸小于 8mm 之后,错误率高达 40%以上。并且研究还发现,在圆圈尺寸超过 12mm 之后,玩家的正确率并没有得到显著的提升。

按钮的最佳尺寸到底是多少?这篇给你权威答案!

结论

由上述的两个实验,我们可以概括出一些有用的结论。

  • 根据各自的实验,在目标尺寸分别小于 9.2mm、9.6mm 或者 12mm 后,均会导致错误率的攀升;
  • 当目标尺寸增加到一定程度之后,正确率基本保持不变。

那么,按钮的最佳尺寸到底是多少呢?

斯科特将实验得出的关键尺寸与苹果、谷歌和微软三大规范进行结合,发现了一些有意思的现象——

  • iOS 的 44pt 对应到实际尺寸为 6.9mm,约 7mm;
  • Android 的 56pt 对应到实际尺寸为 8.8mm,约 9mm;
  • 而微软的 9mm+两边 2mm 的热区,对应的实际尺寸为 13mm。

可以看到 Android 和微软的尺寸,基本对应到了这两项实验得出的关键尺寸。

按钮的最佳尺寸到底是多少?这篇给你权威答案!

最后,再来看下开头 iTunes 的锁屏界面的按钮。可以看到从 iOS9 到 iOS10,苹果将按钮可点范围由 7mm(44pt)扩大至 12mm(82pt),结果也正好符合了微软的规范。看到这里,你肯定更困惑了——按钮的最佳尺寸到底是多少?

其实,并不存在什么按钮的最佳尺寸。

不论是 iOS 的 44pt,Android 的 56dp,还是微软的 82pt,都需要具体情况具体分析。界面布局、用户场景、业务诉求等等,都属于按钮尺寸的影响因素。

比如下面这些 iOS 端产品的 CTA 按钮,它们的尺寸最小到 26pt,最大到 87pt,而且每个产品内部的 CTA 按钮也存在差异。你能说出这些按钮哪一个是最佳尺寸吗?

按钮的最佳尺寸到底是多少?这篇给你权威答案!

当然,我们起码可以去界定一些相对可控的范围。

这里我简单根据斯科特文章中的结论,结合市面主流产品的情况划分出按钮的几类尺寸:

1. 常规场景、局部模块

比如 App Store 的产品详情页的获取,知乎中个人主页的关注,都属于当前页的局部模块,点击之后通常是状态的变化或者出现新的弹层。这些按钮的尺寸我建议控制在 28pt~40pt 之间。

按钮的最佳尺寸到底是多少?这篇给你权威答案!

2. 常规场景、全局模块、强业务属性

比如微信个人页的添加好友、各大电商商品详情页的加购、登录注册页的登录注册等等。这些页面的 CTA 按钮隶属于页面全局,所以可以给它极高的权重、甚至全局吸底展示(如详情页),以更快地促进点击。通常,这类按钮在常规场景下具备了最大尺寸。我个人的建议是保持在 40pt~60pt 之间。

按钮的最佳尺寸到底是多少?这篇给你权威答案!

3. 不可控场景

不可控场景的意思就是,用户点击按钮时所处的场景可能比较特殊,并且这种特殊的场景很可能给用户带来一系列无法掌控的风险。

比如 keep 在跑步场景下的按钮,就需要充分考虑到跑步时不稳定的状态,如果按钮和常规场景一样,那很容易发生无法准确点击的情况,增加意外事故发生的概率;包括来电场景、地图导航场景、快递取件场景等等,都属于不可控的场景。各位可以自己代入脑补一下,这些场景中无法准确点击时容易产生什么样的后果。

所以这些场景中的按钮就得够大,以尽可能覆盖到那些极端的不可控情况。我个人的建议保持在 60pt~90pt 之间。

按钮的最佳尺寸到底是多少?这篇给你权威答案!

当然,这仅仅是很粗略的参考区间值,如何结合现有业务诉求、用户场景需求等因素去合理地界定才是重中之重。如果为了追求最佳效果或者尺寸的一致性,反而有些舍本逐末的意思。

其实从知乎去年 10 周年的大改版可以看到一些有意思的细节。很多按钮的高度比以往更高了。比如盐选会员的续费按钮,由之前的 36pt 提升到了 40pt。

按钮的最佳尺寸到底是多少?这篇给你权威答案!

个人主页的关注按钮也由 28pt 提升到了 32pt,你仔细看的话,按钮的宽度也发生了变化,从之前的 90pt 提升到了 100pt。

按钮的最佳尺寸到底是多少?这篇给你权威答案!

邀请回答界面中的写回答按钮,也由原本的文字链,提升到了实心按钮,高度则直接复用了关注按钮的尺寸——32pt。哦,不好意思,这应该是按钮设计形式上的改变。

按钮的最佳尺寸到底是多少?这篇给你权威答案!

总之一句话,知乎这次的改版,CTA 按钮的尺寸更大了。我们从尺寸对点击行为的影响可以推导出,这次改版背后更为明确的业务目标——促进UGC内容生产、促进关系链沉淀(一旦沉淀了复杂的关系链,用户也就更难以离开平台)以及会员付费转化。



蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码蓝小助,报下信息,蓝小助会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

截屏2021-05-13 上午11.41.03.png



文章来源:优设   作者:转行人的设计笔记

分享此文一切功德,皆悉回向给文章原作者及众读者.
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

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




日历

链接

blogger

蓝蓝 http://www.lanlanwork.com

存档