<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          首頁

          app界面賞析+圖標分享 ——— 北京藍藍設計 移動端UI設計資源分享(二十三)

          前端達人

          App界面設計對于設計師而言一直是盛久不衰的話題,尤其是如今越來越多的流量轉移到了移動平臺,使得更多的UI設計師涌入移動端領域,甚至出現了市場飽和的言論,對于從事移動端的UI設計師來講,充滿壓力的同時又面臨無限機遇,唯有不斷的學習才能滋生出源源不斷的設計靈感,站穩腳跟。

          摹客想在這方面給各位設計師朋友做點什么,除了提供簡單好用的設計工具,我們也整理了非常多的優秀設計案例,希望可以對設計師朋友有借鑒意義。這將會是一個系列的專題,我們以月為單位,整理了國內外設計師的優秀APP界面設計案例,我們是搬運工,更是好設計的傳達者,希望你會喜歡。



          接下來為大家分享精美的app UI設計案例:




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




          --手機appUI設計--

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的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 ><img src="images/1.jpg" alt=""></a></div>
              <div><a ><img src="images/2.jpg" alt=""></a></div>
              <div><a ><img src="images/4.jpg" alt=""></a></div>
              <div><a ><img src="images/3.jpg" alt=""></a></div>
              <div><a ><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.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

          設計師的數據分析與場景化設計

          資深UI設計者

                 隨著互聯網的發展,近這幾年設計圈子里大家都在討論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.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務



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

          資深UI設計者

          很多設計師包括我在內對按鈕尺寸有著頗多困惑。為什么很多產品甚至蘋果本身并沒有遵循 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.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務




          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合