<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>

          首頁

          以一個實例說明如何定制整套UI圖標

          周周


          一套 UI 界面當中,核心的 APP 圖標是用戶每天都要接觸、經常使用的視覺組件和交互對象。設計圖標的時候,要用到大家最熟悉的元素才能貼合用戶認知,要醒目、統一,也要足夠「隱形」,避免喧賓奪主。今天這篇文章,來自著名的 Tubik Studio 團隊,他們為華為旗下的 EMUI 10 系統設計了核心的圖標系統,來看看他們的設計過程吧。

          Tubik Studio 是怎么為華為定制整套 UI 圖標的?

          我們總不會低估一個操作系統基礎圖標,對于產品的可用性和合意性的影響?;A圖標雖然小巧,但是對于整個操作系統而言,總是極具影響力的,因為他們是用戶界面的核心元素,幫助用戶快速直觀地在系統中定位、瀏覽、導航。但是,對于設計師而言,圖標的設計始終是挑戰,它看起來最為簡單,但實則為最為艱難的工作。

          圖標需要高效,讓人一目了然,但是也要具備良好的可識別性,在傳統和創新之間達到平衡。這一次,Tubik Studio 設計團隊將要給華為的 EMUI 10 來設計圖標,而這篇文章將會為你揭示背后的設計過程。

          這次的項目主要是由 Sergii Valiukh 、Arthur Avakyan 和 Polina Taran 來負責。這次的設計項目從最初的探索構思入手,逐漸開始繪制草圖,探索樣式,一直到最后打磨,完成設計。

          Tubik Studio 是怎么為華為定制整套 UI 圖標的?

          項目內容

          為華為 EMUI 10 系統的用戶界面設計基礎的圖標

          客戶介紹

          我們在 2019 年夏季,收到了來自華為的邀約,這次的項目要重新設計 EMUI 這套基于 Android 系統的用戶界面基礎圖標,這套圖標會用來適配華為旗下的旗艦手機,這些圖標將會隨著新版的系統部署到這些手機產品當中。我們的任務,是創建總計 54 款符合當下潮流趨勢的圖標,這些圖標要能夠貼合品牌和已有用戶的偏好,并且能夠吸引新的用戶。

          這個圖標設計項目如今已經在當下的華為旗下手機產品中應用且部署好了,最早使用這套圖標的智能手機型號為 Mate 30 ,緊接其后的是 P40。

          Tubik Studio 是怎么為華為定制整套 UI 圖標的?

          設計過程

          在整個操作系統中,這些圖標是始終位于用戶視野以內、最基礎的最核心的交互元素,通常用戶每天都會同這些核心的基礎 APP 進行交互,有時候一天多達幾十次,因此它們應當具備良好的功能性,還應該足夠美觀,給用戶帶來滿足感。同時,這套圖標的設計,也應當足夠統一,以協調的體驗切入到整個 EMUI 的設計系統當中,貼合整體的樣式特征。 

          所以,我們使用了一整套圖標網格系統,應對不同需求,在設計的過程中,這套網格有助于確保所有圖標外部尺寸的一致性,也保證了內部元素的統一性。

          Tubik Studio 是怎么為華為定制整套 UI 圖標的?

          為了發掘全新的視角,我們決定從傳統的手繪圖標開始,尋找重新塑造圖標設計的方法。這些圖標所涉及到的元素,早已為全球數百萬用戶所熟知,要重新設計圖標外觀,并且還要成套且統一,這本身就是一個巨大的挑戰。

          Tubik Studio 是怎么為華為定制整套 UI 圖標的?

          比如「電話」圖標所對應的聽筒元素、「信息」圖標所對應的氣泡對話框這樣的元素,是不可能完全拋棄重新創造的,所以我們的真正的切入點是在形態和色彩上尋求解決方案。

          越是簡單的東西,重塑起來就越難。

          在實際的設計過程中,我們嘗試了數以百計的造型變體,從完全放飛、非常規的的外部造型,到極其常規,大家熟知的造型解決方案,我們都逐一試過。而在色彩上的嘗試相對會顯得更加具有實驗性:我們嘗試使用明亮的紫羅蘭色、栗色和淺綠色來進行混搭。

          當然,我們很清楚,這樣的實驗性的工作是探索過程中的一小步,但是它是必須的,是創造新設計的種子,是尋求正確答案的必經之路。

          Tubik Studio 是怎么為華為定制整套 UI 圖標的?

          在設計過程在,有一件有趣的事情發生在設計「相機」圖標的過程中。我們嘗試過很多不同的圖標造型,不同的元素,不同的樣式,但是其中始終有一個細節是不變的,那就是右上角的小紅點。這是為了暗示用戶,華為的攝像頭模組來自徠卡,這個紅色的小點就是向其致敬的標識。

          Tubik Studio 是怎么為華為定制整套 UI 圖標的?

          而下面的概念設計,則是強化了圖標之間的幾何輪廓的差異,從而提升圖標在智能手機屏幕上的對比度和識別度。

          Tubik Studio 是怎么為華為定制整套 UI 圖標的?

          下一步,我們基于幾何圖形外觀差異性,設計了多種造型不同但同樣優雅的圖標。在基于這種風格概念進行延伸的過程中,我們會優先考慮圓形的元素。而「天氣」圖標明顯既不適合圓形也不適合方形來呈現,所以我們使用的是云和太陽兩種元素的組合。「錢包」圖標使用的是矩形,然后搭配卡片的組合。盡管造型整體上是相對自由的,但是所有的圖標都是遵循圖標網格,并且在視覺權重上盡可能統一。

          Tubik Studio 是怎么為華為定制整套 UI 圖標的?

          在色彩和樣式上,我們則更加傾向于漸變。沒有色彩漸變,純扁平的圖標顯得過于幼稚和「古早」,沒有足夠的品質感,所以,我們在新的圖標設計上,開始加入漸變色彩,提升質感。

          Tubik Studio 是怎么為華為定制整套 UI 圖標的?

          不過,在最終版本當中,我們還是保留了圖標外部的圓角矩形的外輪廓,然后將圖標元素的內徑進行了適當地縮減,漸變和核心的簡約幾何特征依然是整套設計的最高優先級。

          Tubik Studio 是怎么為華為定制整套 UI 圖標的?

          這套設計方案展現了在整套 UI 界面中,圖標這個小元素的設計上所需要投入的精力和潛在的難度。想要圖標足夠協調、美觀、易用還要貼合品牌特征、還要區別于以往,是一件相當不容易的事情。

          Tubik Studio 是怎么為華為定制整套 UI 圖標的?

          細節里藏著魔鬼,任何細小的元素、線條輪廓、色彩的變化都可能會在屏幕上放大、被感知到。


          文章來源:優設網     作者:Tubik Studio


          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務



          體系化表單設計-5步打造令人愉悅表單體驗

          資深UI設計者

          表單作為平臺與用戶聯系最為緊密的一環,良好的表單設計可以帶給用戶流暢自然的用戶體驗,保證用戶情緒的正向增長,而混亂無序的表單則會引起用戶的負面情緒,影響甚至阻礙用戶操作的完成,降低用戶對品牌好感度和信賴度。對于我們這樣的金融產品而言,產品內存在著如開戶表單、出金申請表單、調整杠桿申請表單等形形色色的表單,如何將這些表單整理歸納形成一套完整的表單設計體系,帶給用戶統一、高效且優質的填寫體驗,是我們這次表單優化的主要的任務。


          系列文章中關于表單設計部分我將分為上下兩期來向大家分享,體系化表單設計(上期)主要介紹在項目中總結出的表單設計中的方法論,下期則是介紹方法論在我們項目中實際的應用,希望這次的分享能為你今后的表單設計提供思路與參考。



          1 認識表單


          1.1 表單的歷史


          表單在我們工作、生活中的使用由來已久,在還沒有互聯網的年代,表單就已經是人們收集和存儲數據、信息的重要手段,并一直沿用至今。如體檢時填寫的體檢表、入職時填寫的入職登記表、銀行開戶時填寫的開戶表都是使用的這種印刷的紙質表單。它們身上有很多設計可以作為重要的參考,幫助我們優化 UI 中的表單元素。


          表單是 UI 界面中最為常見的元素,它通常是用來搜集和呈現一些數據、信息和特定的字段。表單的應用極為廣泛,比如登錄應用時填寫賬號密碼、網上購物時完善訂單信息、OA系統中提交休假審批、修改個人中心信息時……都是在和表單發生互動。



          1.1 表單的構成


          表單的目的、內容、大小等雖然各有不同,但是表單的基本構成元素是相對固定的,在設計過程中,設計師需要合理組織這些元素,幫助用戶在填寫表單時,輕松愉快的完成,表單主要組成部分如下圖。



          1.標簽:告訴用戶此處相應的輸入元素是什么;

          2.輸入區:可交互的輸入區域,根據字段類型使用相應的交互組件;

          3.占位符:對當前項進行額外的信息描述;

          4.前置圖標(可選):描述文本所需的輸入類型和特征;

          5.后置圖標(可選):對輸入內容進行控制,如:下拉的展開與收起、清空;

          6.幫助(可選):提供表單內容的注釋或輔助類容,如:說明、注意事項;

          7.反饋(可選):告知用戶當前操作可能或已出現的問題,如:提交成功、錯誤提示、網絡問題;

          8.鍵盤(可選):在文本編輯時需要使用鍵盤,如:設備系統鍵盤、應用內置鍵盤;

          9.操作按鈕:操作按鈕是在表單的結尾,如:提交、下一步、清空所有信息。


          2 如何打造令人愉悅表單體驗


          在如今這個互聯網時代,我們幾乎每天都會接觸到形形色色的表單,作為用戶與產品鏈接的樞紐,表單設計的好壞會直接的影響產品的實際數據表現。好的表單結構清晰,交互合理,用戶能夠高效愉悅的完成表單填寫,為用戶節省了時間,同時也提高了自身產品的轉化。而差的表單往往信息邏輯混亂,填寫效率低,且容易讓人產生挫敗感而中途放棄,在無形中浪費掉了很多潛在商業機會。是什么造成了不同表單之間出現如此大的體驗差異,我們又該如何做才能設計出令用戶愉悅的表單呢?在實際項目過程中,總結出一套適用于移動端表單設計的路徑圖-通過做好五個步驟,設計出令人愉悅的表單。



          2.1 表單框架選擇


          合理的表單框架選擇是打造用戶友好型表單的基礎,在進行表單設計時,我們首先需要依照表單的使用場景和復雜程度,選用最為恰當的表單框架。確定好表單框架,也就決定了后續設計中表單信息如何組織以及呈現。我們將表單框架劃分為“錄入方式”、“標簽布局”和“按鈕邏輯”三個部分,在表單設計時通過對這三個部分的選用來確定最終的表單框架形態。



          2.2.1 錄入方式


          按照表單錄入方式的不同我們大體上可以將表單錄入方式分為“單步錄入”、“分步錄入”和“分級錄入”三種,在進行表單設計時需要根據實際情況選擇與使用場景匹配的錄入方式。


          1 單步錄入


          單步錄入是表單中最為常見的錄入方式,在一個頁面內呈現所有的錄入項,結構簡單,快速錄入、快速提交,適用于錄入項較少的表單。



          2 分步錄入


          相對于PC端而言,移動端手機屏幕尺寸較小,一份在PC端1-2屏就能完全展示的表單在移動端往往需要7-8屏。將一個需要7-8屏才能展示完整的表單放在一個頁面內讓用戶填寫,用戶容易產生抵觸情緒會造成表單完成率的降低。


          為了提高用戶填寫效率,減少用戶的抵觸情緒,我們可以將一個冗長的表單拆分成多個步驟,分步錄入。通過拆分成一個個步驟,讓表單信息呈現更為清理有條理,并且能引導用戶逐步填寫完成表單錄入。



          當表單處于以下4種場景時選擇建議選用分步錄入模式:


          1.表單錄入項過多,在一個頁面內已經不能合理清晰的組織傳遞信息。

          2.表單內容的錄入方式存在較大差異,不適宜在一個頁面內進行展示。

          3.表單錄入項在業務上存在先后順序,只有先完成上一步字段錄入,才能夠進入下一步。

          4.在業務上很重要的表單,為了讓用戶能夠沉浸、快速的完成表單填寫時。


          分布錄入模式下步4種步驟導航選擇:


          1.文字導航:當表單為2步錄入表單時,我們展示步驟條帶給用戶的引導意義并不大,通常這種情況下我們會選擇省略掉步驟條,只展示當前步驟名稱,給予用戶提示。


          2.步驟條導航:當表單錄入步驟為3-4步時,我們可以在頁面頂部放置步驟條顯示所有步驟內容標題,用戶通過步驟條能夠對表單有一個清晰的預期。


          3.雙層步驟導航:當表單錄入步驟大于4步時,受限于移動端屏幕尺寸,橫向上不夠容納步驟數太多的步驟條,這時我們可以其中某些關聯的步驟歸納為一個大步驟,形成雙層步驟導航。


          4.進度條導航:當表單錄入步驟大于4步,又擔心雙層導航給用戶傳遞出表單極端復雜的印象,勸退用戶。這時我們可以使用進度條導航,用百分比進度條來展現表單填寫進度。



          3 分級錄入


          分級錄入大家可能相對較為陌生,分級錄入在B端產品中會有相對多見,一般運用于有明顯上下級關系的表單,如項目管理工具中新建任務表單,在新建任務的同時還能新建下屬子任務。又如客戶關系管理軟件中,新建訂單的同時新建下屬的訂單明細。我們可以將使用分級錄入模式的表單視為兩張表單,子表單添加的數據會回顯到主表單上。



          2.1.2 標簽布局


          標簽用于提示用戶需要輸入的是什么信息。合理的標簽布局結構,能夠提高用戶的閱讀效率,還能降低信息填寫時的錯誤率。常見的標簽布局形式有:左右結構、上下結構和浮動結構。不同的標簽布局都有各自的優點和缺點,我們需要根據項目實際情況來選擇最合適的標簽形式。


          1 左右結構


          左右結構是目前最為常見的標簽布局形式,左右結構中標簽和輸入區域在一行內排布,其中標簽位于左側且居左對齊,輸入項位于右側有居左和居右對齊兩種對齊方式。


          優點:節省縱向頁面空間,在移動端有限的頁面空間內能展示更多的錄入項。


          缺點:標簽的長度無法確定,視覺上顯得參差不齊,表單的信息瀏覽和填寫效率一般,標簽橫向展示空間有限,對于多語言適配場景不太友好。



          2 上下結構


          上下結構也是我們能夠經常在表單中見到的標簽布局形式,上下結構中標簽位于上方且居左對齊,輸入區域位于下方也為居左對齊。


          優點:用戶的視覺瀏覽路徑相對于左右結構來說較短,擁有較強的信息瀏覽和填寫效率,標簽橫向展示空間充足,對于多語言適配場景友好。


          缺點:占據縱向空間多,一屏內能展示的錄入項較少。



          3 浮動結構


          Material Design中文本錄入的標簽形式就是選用的浮動結構,在浮動結構中標簽和提示文字合二為一,正常狀態下,標簽位于輸入區域內部原本提示文案的位置,當用戶輸入時,內部的標簽就會上移為文本輸入讓出空間,完成填寫后標簽和輸入文案上下排列展示。


          優點:結構簡單,視覺干擾少,信息瀏覽和填寫效率高。


          缺點:填寫項過多時,表單信息傳遞不夠清晰。



          4 內部結構


          內部結構相對于前面3種結構較為少見,比較長出現在登錄場景,在浮動結構中標簽和提示文字合二為一,正常狀態下,標簽位于輸入區域內部原本提示文案的位置,當用戶輸入時,內部的標簽就會消失,完成填寫后只展示輸入文案。


          優點:結構簡單,視覺干擾少,聚焦于操作。


          缺點:只適用于如登錄等錄入項極少的場景,一旦錄入項變多,由于錄入后不展示標簽,將導致用戶后續很難判斷輸入的信息是否準確。



          2.1.3 按鈕邏輯


          按鈕作為表單的重要組成部分之一,合理的按鈕邏輯能夠為用戶順暢完成表單填寫提供幫助,表單的按鈕邏輯主要由按鈕的位置和按鈕的點亮邏輯兩部分組成。


          1 按鈕位置


          按鈕在頁面中的位置情況主要有以下3種:


          1.頂部按鈕:以文字的形式固定在頂部導航欄的右側,頂部按鈕尺寸較小,因為它所占空間有限,因此在操作上相對來說不便于點擊。所以這類頂部按鈕更適用于「編輯頁面」,需要用戶謹慎操作。


          2.表單底部:按鈕跟隨表單放置于表單的最下方,根據表單內容縱向空間的大小而上下移動。因為表單內容較多時,容易下沉過多而導致按鈕不可見,所以將按鈕放置于表單底部更適用于當表單錄入項較少不足半屏的場景。


          3.設備底部:操作按鈕常駐在設備底部展示,適用于表單錄入項過多的情況,在表單設計時可以盡量將必填項放置在表單前面,用戶填完必填項后就可以點擊操作按鈕提交或者進入下一步,而不用滑動到表單底部再進行操作。



          2 按鈕點亮邏輯


          1.當表單錄入項較少時,且有明確預期按鈕何時可用,可以先置灰主按鈕,完成必填項填寫后再點亮主按鈕。


          2.當表單錄入項較多時,且用戶不清楚為什么按鈕不可以用,此時按鈕可以常亮,并在用戶點擊時給予反饋,告知錯誤原因。



          2.2 表單信息梳理


          在確定好表單框架以后,對于表單內容信息的進行有效的組織也尤為重要,特別是對于一些結構復雜、錄入項多的表單,如果不對信息進行組織,很容易顯得繁雜混亂,容易讓用戶在一開始就產生抵觸的情緒,甚至選擇放棄。那么如何合理有層次的組織信息呢?



          2.2.1 簡化表單,聚焦核心


          我們在設計表單時潛意識里都想要從用戶那里獲取到更多的信息,表單中因此出現很多必要性較低的錄入項,表單也因此變得冗長,讓人第一眼就生出「好多信息需要填,好麻煩」的沉重感,在填寫表單之前就萌生退意。我們在進行表單設計時需要保持克制,聚焦于表單的核心任務,讓表單盡量短而美。那么我們要如何為表單減負,可以嘗試以下方法。


          1 減少表單中的多余字段


          表單中每多一個錄入項需要填寫,都有可能會失去一部分用戶好感度甚至流失一部分用戶。在設計時我們需要判斷某個字段信息對于用戶來說是否有必要在表單中進行填寫,盡可能的刪減掉額外的無用字段。例如注冊表單,如讓用戶使用郵箱注冊,那么用戶的姓名字段是否是注冊的必選項?如果不是必選項是否可以在之后的信息完善中進行填寫。


          2 合并表單中的同類字段


          在表單中時有一些信息他們本身緊密相關,我們完全可以視情況將其合并為一個錄入項,來減少不必要的錄入操作,達到簡化表單,提升錄入效率的目的。合并錄入項要結合實際的使用場景以真實的提升表單體驗為目的,而不是一味的追求表單的最簡化。


          3 隱藏表單中的低頻字段


          根據用戶使用數據,適當將使用頻次不高、或者提供給專業用戶的高級表單項隱藏起來。例如一份表單中有一個填寫項,90%的用戶都不需要填寫,那么默認收起。保持表單的簡潔,讓絕大多數用戶快速完成,避免大量的表單給用戶的焦慮,而又滿足了小眾用戶的需求。



          2.2.2 先易后難,循序漸進


          根據沉沒成本的定義:人們在做決策時,受到了自己過去所投入的時間、金錢、精力等因素的干擾,對于先前付出了投資的事情有更強的忠誠度和繼續投資的意愿。進行流程設計時也可以遵循這個原理,將容易完成的表單放在前面,這樣做有3個好處:


          1.簡單的表單更容易激起用戶的填寫欲望,用戶會迫不及待地去完成。相反,用戶一開始就看到過于復雜的表單,很容易被嚇到,從而放棄整個任務。

          2.用戶通過完成簡單的表單,可以增加自信心,即使后面的表單變復雜了,用戶也更有耐心去完成。

          3.當用戶將前面簡單的表單完成后,放棄整個表單的機會成本就變高了,即使后面碰到較難的任務,用戶放棄的幾率也會降低。



          2.2.3 信息分組,一目了然


          當我們我們設計的表單字段內容較多時,需要合理的對字段信息進行分組,這樣整體看起來更加有組織性。接近性(格式塔原理)原則告訴我們: 相互靠近的物體被認為比相互距離較遠的物體更有關聯性,這樣能使設計界面層次有序,視覺清晰,減少視覺噪音。分組時需要注意:


          1.內容屬性相近或有關聯性的放在一組。

          2.根據信息的重要性及難易程度排列分組,將選填的表單內容靠后



          2.3 錄入操作提效


          在表單錄入設計階段,我們需要明確認識到一點,用戶在面對一份表單時往往沒有我們想象中的那么有耐心,復雜繁瑣的錄入操作可能會直接勸退用戶。我們需要做的就是化繁為簡,思考如何給用戶減負,讓用戶簡單高效的完成表單錄入。表單錄入操作提效有一些切實可行的方法,下面請我將一一向分享。


          2.3.1 設置默認值


          對于用戶而言,填寫信息永遠都不是一件有趣的事情,在對用戶足夠了解的前提下,我們可以選擇為表單中的部分錄入項提前設置合理的默認值,節省用戶的操作時間。默認值的設置不是一個隨性發揮的過程,而是基于用戶行為和數據的理性判斷,并且也不是每個字段都適合設定默認值。關于如何設置合理的默認值,什么字段適合設定默認值,下面幾點可供大家參考:


          1 自動填入已有信息

          在一些業務場景,會使用到用戶之前在其它表單中已經錄入的信息,此時在填寫新表單時,可以默認帶入之前的數據。


          2 自動填入關聯數據

          如果用戶正在填寫的內容有相關的關聯數據,可以默認帶入。如我們在填寫訂單時可以默認帶入該訂單關聯的商品基礎信息。


          3 系統自動獲取數據

          基于移動端設備的能力,我們可以在用戶開放權限的情況下獲取一定的用戶信息(位置信息、電話區號、運動數據等),在特定情況下默認填寫,如滴滴通過GPS定位自動幫用戶填入上車位置。


          4 經驗預判填入信息

          像電話區號、證件類型、國籍等用戶錄入結果相對固定的字段,可以根據情況提設置合理的默認值。



          2.3.2 減少手動輸入


          相較于PC端而言,移動端設備屏幕尺寸較小,虛擬按鍵的輸入效率遠不及實體鍵盤,在移動端手動輸入的成本較高。因此,為了打造便捷優雅的操作體驗,移動端表單需要盡量減少用戶的手動輸入。以下方法可以減少手動輸入。


          1 聯想輸入

          聯想輸入是給予用戶輸入字段的自動補全功能,用戶少量輸入后進行選擇。錄入方式由原來的輸入變成半輸入后選擇,減少用戶的輸入成本,提高用戶操作效率。


          2 替代輸入

          對于表單填寫過程中可以固化選擇的信息,應讓用戶進行選擇操作以代替手動輸入,盡可能地讓用戶減少輸入成本。


          3 歷史記錄

          一份用戶可能會多次填寫的表單,我們可以提供用戶的歷史輸入項供其選擇,如滴滴的打車頁面會將我的常用目的地放置在目的地輸入框的旁邊供我快速錄入。


          4 新型組件

          一些新型的交互組件的使用能夠簡化信息錄入的操作,例如滑塊組件等。



          2.2.3 減少頁面跳轉


          在填寫表單時如果填寫項需要頻繁的頁面跳轉會使得整體的填寫效率變低,增加用戶的操作成本。在進行表單設計時應盡量規避這種頻繁的頁面跳轉,選用更流暢靈活的交互方式。


          1 選項露出

          在網頁端表單設計中,用戶在表單填寫中需要對選項進行選擇時,常用的交互形式是在選擇器的下拉列表中進行選項的二次點擊。而在移動端設計中,觸發選擇器后的二次點擊會增加用戶的填寫成本。所以在設計時,當選項少于8時,在表單中直接顯示所有可選項,當選項超出過多時則在列表浮層中進行選擇。


          2 減少跳轉

          在表單填寫中我們期望用戶保持專注,盡量避免產生引導用戶離開當前頁面的填寫交互,這種交互跳轉很容易打斷用戶固有的行為軌跡。因此運用浮層、彈窗等交互來完成輔助信息的采集是我們較為推崇的交互形式。



          2.3.4  智能錄入


          1 OCR識別文件內容

          對于一些標準證件類信息的錄入,可以通過OCR識別文件內容。當用戶上傳圖片后,運用圖像識別技術提取關鍵信息并自動填入結果。值得注意的是,如果圖片不清晰或存在水印,將大大降低識別準確度。此時應提供修正渠道,讓用戶可以逐一校對并修改文本內容。


          2 號碼認證

          短信驗證碼升級方案。直連三大運營商,一步校驗手機號與當前SIM卡號一致性。優化注冊/登錄/支付等場景驗證流程,有效提升拉新轉化率和用戶留存率。不做數據加工與號碼精準營銷,保護用戶隱私。



          2.3.5  聯動鍵盤


          為了避免讓用戶頻繁的跳入跳出相同類型的輸入項,首先整合表單的信息字段,將同類型的字段進行合并,同時結合輸入控件,設計聯動式組件,讓用戶在表單輸入時更加高效。



          2.4 設計細節把控


          設計不是簡單的元素拼湊,深入下去,有很多細節需要推敲,細節應該是含蓄的,包含在整體之內。好的細節設計不容易被用戶的眼睛直接發現,但是會讓用戶與產品的交互過程變得通順、舒適,概括來說就是潤物細無聲。對應到表單設計上,我們需要通過表單設計中的細節把控,讓表單錄入這件事變得簡單、高效。


          1 必填與選填

          當表單中同時出現必填項和選填項時我們需要對其做出區分,避免用戶不知道哪些字段必須填寫、哪些字段可以選擇性填寫。沿用通用符號習慣,在表單中我們往往使用 * 號來標記必填項。但是當表單中的必填項多于選填項時,大量的 * 號會增加用戶的認知負擔,面對這種情況,我們可以使用暗提示來標記選填項幫助用戶識別。



          2 號碼組合規律

          如電話號碼、銀行卡號這類有數字組合規律的號碼字段,我們可以沿用它們在線下的數字組合規律,通過空格對號碼字段進行劃分,幫助用戶校驗和閱讀。



          3 密碼保護

          出于保護用戶賬號安全考量,我們在進行密碼輸入時通常使用隱暗文字的方式來保護用戶賬戶安全,但是暗文字的顯示方式會讓用戶無法確認密碼信息。因此我們可以在輸入時,讓輸入字段短暫顯示,保持1秒然后再轉變為暗文字,這樣既可以讓用戶明確內容,也保證了用戶的賬戶安全。



          4 符合心理預期

          我們在進行表單設計時,輸入區域的長度要符合心理預期,需要預判填寫內容長度來確定輸入區域的長度。這樣不僅在體驗上一致,而且在視覺體驗上更加愉悅。



          5 對指令有明確的稱謂

          用戶應該對他們的操作所帶來的結果非常自信,使用“提交”、“注冊”、“立即支付”、“創造賬戶”等確定性文案來描述用戶將采取的操作。



          6 錯誤信息就近反饋

          報錯信息應當一目了然,從用色、圖標到文本都應當起到高亮的效果,而且報錯信息應當靠近輸入框,而非表單的底部或者頂部或者按鍵旁邊。



          7 防止輸入框的遮擋

          在設計主要由文本輸入框構成的表單頁面時,要考慮鍵盤出現可能會遮擋輸入框的情況,我們需要把控件放在scrollView上,當鍵盤會遮擋輸入框時,則表單滾動。



          8 指導性錯誤反饋

          對于異常情況不能只是冷冰冰的告知失敗,這樣容易給用戶帶來挫敗感,且缺少下一步操作指引。錯誤反饋不應該只著眼于結果,錯誤反饋的闡述角度應該是引起用戶關注、讓其快速了解出錯情況,并指導如何處理。



          2.5 整體體驗提升


          經過前面幾個步驟,表單整體形態已經確定,最后一步我們需要從整體體驗的角度對表單進行完善和調整。包含表單的容錯性考量、表單流程閉環的打造、視情況而定的趣味性設計。


          2.5.1 表單容錯性考量


          即便你的產品90%的時間都運行良好,但是如果在用戶需要幫助時置之不理,他們是不會忘記這一點的?!禛etting Real》


          容錯性概念源于計算機領域,容錯性是指計算機系統在發生故障的情況下,依然能夠保證系統正常運行。計算機這種保證系統正常運行的能力也被稱為容錯能力。延伸到互聯網產品設計領域,容錯性的范疇更為寬泛,包括降低用戶操作的出錯率、及時提供糾錯幫助、提供解決方案等內容。


          容錯設計與用戶體驗息息相關,我們在表單頁面設計時也需要進行容錯性考量,盡量避免用戶錯誤操作的出現。當用戶出現錯誤操作時,幫助用戶識別、診斷,及時反饋問題所在,并提出有效的解決方案,幫助用戶快速從錯誤中恢復。讓表單填寫流程更順暢,給用戶帶來更優的用戶體驗,關于表單容錯性設計可以從以下幾個方面來進行。



          1 引導與提示

          引導和提示要突出表現,從而引起用戶關注,確保用戶在操作前能注意到引導或提示信息。引導與提示用語要簡單且易于理解,當重要或操作不可逆時,要詢問用戶讓其知道這樣操作的后果。


          2 限制操作

          如何從設計上避免用戶出錯,限制是一種非常必要的方式,可以通過限制用戶的某些交互操作或者增加某些操作的難度來對用戶操作進行限制避免用戶出錯。


          3 反饋與幫助

          當用戶出現填寫錯誤時,及時的反饋錯誤并提供糾錯幫助,出錯信息應當用清晰準確且用戶易于理解,能夠對用戶解決當前問題提供建設性幫助。


          4 錯誤恢復

          允許用戶犯錯,操作者能歸夠撤銷以前的指令,幫助用戶在犯錯以后能夠快速回到正確狀態。


          2.5.2 表單填寫流程閉環


          表單的終點并不是提交,一個好的表單設計需要兼顧考慮用戶填寫前的引導、填寫時的及時校驗與幫助、還有填寫后的整體流程體驗,為用戶提供完整的、形成閉環的表單填寫體驗。


          舉個例子,當我們設計的表單需要用戶準備如身份證、銀行卡這類的證件時,需在表單填寫前告知用戶,避免用戶填寫途中才發現證件未準備,導致用戶填寫流程中斷。再如,用戶在填寫完證券開戶表單后,其實還需要通過審批后用戶才能進行入金交易等操作,這時我們需要一個結果頁來告知用戶表單提交的結果狀態和下一步的操作指引。



          2.5.3 最后,再增加一點愉悅度吧


          表單設計并不一定需要是嚴肅且正式的,在表單設計時可以嘗試引入一些趣味性的元素,研究表明,更大的文字輸入框、適度的留白空間、優雅的動畫效果、趣味性界面設計會讓人心情愉悅更有填寫的欲望。


          例如bilibili的登錄頁面,在用戶輸入賬號時上方的卡通形象是睜眼的,當切換到輸入密碼或者驗證碼時卡通人物會有一個捂住雙眼的動作十分有趣,這樣的趣味性設計能夠在一定程度上緩解用戶在填寫表單時的焦慮情緒,并增加對于bilibili保護賬號安全的信賴感。



          總結


          以上就是我對于移動端表單設計的一些歸納和總結,過往的項目中自己設計大量的表單頁面,走了不少彎路犯了不少錯誤,但也通過項目不斷的反思總結,收獲不少的關于表單設計的經驗。在這里將項目中關于表單的一些思考和經驗分享出來,總結出自己的一套關于表單設計的方法論,也是希望能夠對正在進行表單設計或者即將進行表單設計的你提供一點點參考與幫助。


          表單設計我將分為上下兩期來向大家分享,體系化表單設計(上期)主要介紹在項目中總結出的表單設計中的方法論,下期則是介紹方法論在我們項目中實際的應用,也希望你能夠持續關注。



          文章來源:站酷  作者:
          Yone楊

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

          不同場景下【用戶提示】的設計原則

          資深UI設計者

          不同場景下用戶提示的設計原則


          什么是提示?提示,指給予題型和解釋。提示指啟示;提起注意。映射到現實生活中,教學樓“請保持安靜”、廁所的標示提示、飯店里禁止吸煙的牌子都是提示,是用來提醒人們注意自己的語言、行為


          根據不同到使用場合這里梳理了5中提示操作的使用控件:分別是彈框提示、常駐提示、通知、全局提示、徽標提示,這五種提示方式承載的信息量、優先級和用戶操作場景各有不同


          下面分別介紹這5種提示控件的使用場景:


          一、彈框提示Modal


          使用場景:

          需要用戶處理事務,又不希望跳轉頁面以致打斷工作流程時,可以使用在當前頁面正中打開一個浮層,承載相應的操作。

          另外當需要一個簡潔的確認框詢問用戶時,能夠讓用戶清晰的知道自己的操作,并且進行二次確認



          設計原則:

          聚焦:使用戶集中注意力確保任務得到解決,對話框一旦出現,應當呈現在頁面上方的視覺層。

          清晰:對話框應直接展示信息,并帶有相關或上下文信息響應用戶任務或操作。


          控件類型:

          1、功能對話框:

          • 除標題、純文本內容和按鈕外,還需要承載更多復雜信息時

          • 可配置單選框、復選框、列表、穿梭框、圖片、頭像、插畫、視頻等

          2、通知對話框:

          • 用于警示、緊急、或簡單的二次彈窗確認。

          • 按鈕文案需承接上下文表述,并準確引導用戶行為,如“確定”、“取消”、“刪除”。

          • 簡單的消息提醒時或不可返回的操作,只提供一個按鈕用于關閉,如“知道了”“刷新”。

          3、選項對話框

          • 內容不足以構成單獨頁面或不希望跳轉新頁面的對話框,多使用于搜索、設置、內容選擇;

          • 需要完成的一系列任務操作,被選擇后立即生效,無需進行確定反饋; 



          二、常駐提示 Notice


          使用場景:

          常駐提示是一種非阻礙式的信息展示,它不打斷用戶的當前操作,一般停留至頁面某個位置(優先頂部),非浮層的靜態展現形式,始終展現,不會自動消失,用戶可以點擊關閉。


          設計原則:

          直接:當前頁面需要向用戶顯示需要關注的信息時,常駐提示顯示,要求用戶立即注意;

          重點:常駐提示引起用戶注意,以確保其內容得到解決。


          控件類型:

          常駐提示屬性包括常規提示、成功提示、警示提示、錯誤提示四種。

          普通提示:建議用于展示背景條件、政策信息、規范要求、當前狀態等客觀內容。

          成功提示:建議用于展示已完成操作的成功狀態。

          警告提示:建議用于展示可能會導致某種后果的警示性文本。

          錯誤提示:建議用于展示一個信息組的報錯文本,如表單中同時滿足幾個條件時觸發整體報錯,可用此樣式。



          三、通知Notification


          使用場景:

          在系統四個角顯示通知提醒信息。經常用于以下情況:

          • 較為復雜的通知內容。

          • 帶有交互的通知,給出用戶下一步的行動點。

          • 系統主動推送。

          設計原則:

          提示文本內容以及交互方式盡量準確、清晰、簡明,保證用戶在其消息自動消失前了解提示信息或做出交互。


          控件類型:

          1、基礎樣式:分為基礎文字通知、基礎文字通知(帶操作)

          2、根據業務需要在區域內填充內容或操作類組件的通知。



          四、全局提示toast/ Message


          使用場景:

          通常出現時顯示幾秒后自動消失,或者數據正在加載時顯示,提醒用戶已經完成的動作,或者已經達成的目的,是用戶完成動作后或者異常情況下的提示(pc端叫 Message,移動端叫toast實質上都是全局提示是一個控件)


          設計原則:

          在不跳轉頁面打斷用戶工作流程的前提下,提供成功、警告和錯誤等反饋信息。不打斷用戶操作


          控件類型:

          1、刷新頁面時,提示更新的條數:

          2、收藏或者其他操作,提示用戶操作成功:



          五、徽標提示 Badge


          使用場景:

          紅點、數字或文字,一般出現在通知圖標或頭像的右上角,用于顯示需要處理的消息條數,通過醒目視覺形式吸引用戶處理。


          設計原則:

          跨平臺:可適用于 Windows/macOS/iOS/Android 平臺的所有套件產品,為產品提供一致的設計體驗,使用戶在不同端使用產品時,都可以擁有流暢高效的使用體驗。

          直觀:通過清晰醒目的視覺形式告知用戶狀態,吸引用戶關注和處理。


          控件類型

          1、點狀徽標

          當功能模塊更新、信息狀態為未讀、人員在線協同、信息量變化且無需告知具體數量或性質時,使用點狀徽標突出狀態

          2、字符徽標

          內容的信息量發生變化,且需要明確告知新增數量時

          3、圖標徽標

          在某些功能場景中,作為特殊狀態提示使用

          4、角標徽標

          通常出現在列表、卡片上,強調和突出其特殊狀態,其主要作用是標記,或吸引用戶的注意力,提示用戶關注該事物或事件



          總結

          簡單的總結,并不是非常全面,還有很多需要繼續挖掘的技巧,還有很多需要學習的東西;有一點能夠肯定的是,要從實際的用戶場景中去考慮問題,用戶體驗就必須站在用戶的角度,不能為了設計上的美感,而讓增加用戶學習成本,好的體驗應該就是用戶一眼就能看懂,操作簡便。




          文章來源:站酷  作者:郭大毛


          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務



          小米商城APP首頁設計全面解析!

          ui設計分享達人

          前言 



          互聯網產品首頁是與用戶進行交流的第一步,首頁設計不僅代表著一家企業的形象,還會直接影響公司的業務營收和口碑。


          本文將深度解析“小米商城”APP的首頁設計,分析B2C模式下的自營電商是如何通過設計打造品牌感,增加用戶參與感,從而促進產品的銷售轉化。



           產品定位 



          了解一款APP產品首先要了解它的產品定位,從小米商城的slogan“讓每個人都能享受科技的樂趣”不難看出小米的產品定位是性價比高的科技類產品。

           

          另一方面,從商業模式來看,小米商城是B2C自營電商,與其他B2C自營電商平臺不同的是,小米主打高性價比,以好口碑深入大眾,撬動市場,以互聯網思維賣產品,把硬件產品當互聯網軟件產品賣。

           

          由此可見,科技、高性價比是小米商城產品定位的兩大關鍵詞。



           目標用戶 


          目標用戶是產品模式和功能制定的重要考慮因素,小米商城的目標用戶可以分為三類人群:


          1、米粉用戶


          這類用戶是小米的忠實粉絲,也或許是雷總的粉絲,他們認同小米文化,喜愛小米產品,熱衷購買和傳播小米產品,是小米商城最有價值的用戶群體。


          2、科技發燒友


          這類用戶本身就是科技愛好者,喜愛探索新鮮前沿的科技產品,熱衷購買科技類創新性的產品,對于深度發燒友還會專研參數配置,并會在論壇探討分享。


          3、追求小資用戶


          這類用戶追求品質,喜愛有設計感的產品,如果了解到小米有什么產品好看又好用,他們會為了保證品質和服務,選擇從官方購物平臺購買。



           全品類商城與自營商城設計差異 


          雖然了解了小米商城的定位與目標用戶,但還需要從產品的商業模式上去推導設計,比如淘寶與小米商城的首頁設計大有不同,原因就是因為商業模式不同,致使產品的設計存在差異。


          1、全品類與自營首頁設計區別


          自營類商品其實是全品類商城的一個分支,全品類商城首頁衍生了很多獨立平臺,所以全品類商城首頁設計形式上更注重流量分發,而自營類是垂直領域,所以會更突出商品,并且創造商品賣點,打造爆款。



          全品類電商產品因為品類眾多,用戶長時間使用會形成“逛”的習慣,從運營的角度,首頁運營板塊就會以千人千面的形式出現各類產品,所以首頁在設計上需要放置更多的產品,甚至要不停的變化產品,以覆蓋到用戶的需求點。 

          而自營類電商產品,因為品類較少,用戶很難逛起來,也是因為用戶使用自營類產品本身就是帶有目的性的,這樣用戶通常會是“找”的行為,所以首頁的功能上通常會推薦主題產品和打造爆款。 




          2、自營類商城設計上注重品牌


          自營類商城運營的是品牌,能發展壯大的自營電商都成功塑造了品牌形象,所以在產品設計上突出品牌,會與用戶建立信任感,提高轉化,同時也能做到與其他電商的差異化設計。


          下圖所示,小米商城、小米有品、網易嚴選三款產品,為了能快速與用戶建立品牌認知,導航欄都放了自家的logo。


          另外,還可以從色調,板式,服務等等各個緯度突出品牌形象,總之在產品設計上要與品牌形象貼合,讓用戶處處能感知到品牌。


          導航欄設計注重品牌


          了解產品定位和目標用戶以及平臺的商業模式,對我們分析一個產品非常重要,這樣更容易從正確的方向理解產品的設計,下面我們帶著對產品定位和目標用戶的理解,開始對小米商城APP首頁設計的全面解析。



           小米商城-首頁解析 



          B2C模式下的品牌電商,首頁設計需要做到可以讓任何一款產品成為爆品,也不會讓任何一款產品出現庫存滯銷。 

          小米商城首頁的設計與運營緊密聯系,有帶貨能力超強的模塊,如小米眾籌、小米秒殺,也有能快速推廣新品的模塊,如小米新品、新品發布,這些都是品牌電商重要的組成部分。 


          接下里我們從品牌DNA、布局體驗設計、金剛區設計、登錄前后設計、參與感設計等方面對小米商城首頁進行解析。


          1、品牌DNA


          當前小米公司有著非常強大的品牌勢能,給人們留下了性價比高、高端、簡約、科技、堅持的好印象,這些都可以看作是小米的品牌DNA,因此在設計小米商城APP時,設計需要貼合小米品牌DNA,讓用戶使用產品時能感受到小米的品牌力。


          打開小米商城APP,處處能感受到小米的品牌元素,橘色的品牌色、小米的產品圖標等,都在傳遞著小米的符號,整體UI的設計秉承了小米硬件產品的一貫風格,如簡約的風格、高質感元素等,細節上體現品質。



          2、布局體驗設計


          用戶瀏覽電商產品首頁,第一屏流量最高,隨著往下走第二屏、第三屏...跳失率會越來越高,根據數據統計通常產品第三屏之后流量會大打折扣。



          雙十一期間截圖 



          上圖的數據并不能代表所有產品的數據,好的設計形式可以影響數據的變化。


          如何減少跳失率,要從用戶在當前位置的所思所想出發,做好第二屏到第三屏的功能制定和引導設計非常重要。


          小米商城首屏最后的位置可以看到第二屏的內容標題,能夠起到引導性作用,并且放的是最有吸引力“小米秒殺”和“新品發布”雙十一期間增加了運營模塊,雖然這兩塊在第二屏,但看到的同樣是最有吸引力的雙11促銷信息。


          引導用戶查看內容


          另外在不增加運營板塊時會發現,小米商城重要板塊不會放到第三屏,在第二屏下面已經開始出現精選(猜你喜歡)閑逛區,因為是太多板塊用戶會感覺首頁很亂,不容易對各板塊功能形成認知,其次就是隨著跳失率的增加,重要板塊也會失去好的轉化效果。


          打造沉浸式體驗


          多數用戶在第三屏時會失去再向下探索的動力,這時系統通過算法給用戶推薦用戶喜歡的內容,會再次吸引到用戶,重塑用戶向下探索的好奇心。


          用戶在“猜你喜歡”版塊心態是無目的的閑逛,當用戶不想再向下探索時,隨時可以側滑屏幕切換到其他品類,這樣也大大減少了用戶首頁閑逛的跳失率,營造出了一種沉浸式的交互體驗。



          閑逛區(猜你喜歡)沉浸式體驗


          同時因為用戶在此版塊是“逛”的心態,所以設計上采用瀑布流,也可以稱為Feed流,這樣的設計形式重點突出的是圖片,也就是商品本身,參數配置會弱化或不出現,因為用戶閑逛時是沒有目的的,當一個商品對他吸引后,用戶才會主動點擊查看詳情。


          如果用戶是有目的搜索某個或某個品類商品時,此時列表流更為合適,因為用戶是有目的性的查找商品,他是認識這款或這類產品的,所以必定會開始關注產品的參數配置等,列表流的左右結構,能非常合理的呈現出參數配置等信息。




          總結:當用戶無目的“逛”時會關注產品本身,所以這時需要重點突出產品圖,使用瀑布流更合適;當用戶有目的查找商品時,因為已對商品有一定的認識,所以不僅希望看到圖片,同時也希望能夠直觀看到產品的參數配置,這點對科技類產品的展示尤其重要。


          3、金剛區設計



          小米商城-金剛區


          金剛區的圖標設計直接用產品來代替,真實的手機、電腦、筆記本等,這樣不僅能與眾多電商平臺的金剛區有差異化,更加能夠把入口功能表現的有識別性、直觀性,能夠使用產品模型作為圖標元素,這本身形成了一種優勢。


          “觸碰想象,感受真實”金剛區的圖標設計符合小米的設計理念,設計師從圖標的設計營造出了貼合目標用戶認知的氛圍,讓用戶感受到了歸屬感。


          金剛區圖標的布局設計與產品定位和用戶特征非常吻合,第一個圖標是“小米新品”,對于米粉來說,這應該是最關注的功能入口,關注新品的用戶也是最容易購買新品的人群,從產品的角度來講,新品也是需要大力推廣宣傳的,所以新品入口放置首位無可厚非。


          第二個是“小米眾籌”,此功能入口對于追求性價比的用戶是最有吸引力的,因為眾籌價低于零售價,符合性價比屬性,此模式是先付錢再生產,解決了庫存、物流成本等。


          第一排剩下的是三個手機圖標,其中位于中間位置的“至尊新品”是動效展示,也是因為要強調和推廣新款手機。


          “小米秒殺”放在第二排第一個,是因為此模塊也非常重要,是一大流量入口,秒殺功能板塊是利用時間的緊迫感來刺激用戶轉化,走量能力極強,正因如此,在頁面的下方有專門的“小米秒殺”板塊。剩下的四個圖標是小米生態鏈中四個類別的產品入口,代表了大多數產品。



          4、登錄前后設計


          新人首次打開產品,促進第一單購買


          小米商城新用戶第一次打開產品時,會直接彈出“新人專享福利”彈窗,點擊查看都是性價比極高,且生活中常用的物件,性價比高是為了促進與新用戶的第一筆交易,推薦常用物品是為了讓用戶在生活中看到用到這些常用物品時,可以物品的購買渠道,從而提高復購。


          新人登錄前,首頁內容促進第一單購買


          如果用戶不小心關閉了彈窗,沒關系在首頁最重要的位置也會看到“新人福利”板塊,如果享受新人福利,那在購買前一定要做的是要注冊登錄的,所以新人福利,不僅可以促成與新人的第一筆訂單,而且也有助于引導新人成為注冊用戶。


          新人登錄后,繼續促進第一單購買


          從下載小米商城到登錄后,會有三次提示有新人福利,上面介紹了前兩次,第三次是當登錄后會直接跳轉到“新人專享福利”,目的還是促成一單有性價比的交易,給用戶留下第一次好的購物體驗,最終變成有價值的用戶。






          不包郵是用戶最大的痛點
           

          據調查電商購物,用戶最大的痛點就是不包郵,同樣一件商品,99元包郵比90元+8元快遞費組合更容易讓人接受。


          上圖小米商城的新人福利,都在強調包郵,消除用戶痛點,讓用戶的首次購物真正的感受到小米商品的性價比。


          個人中心登錄前后有意思的設計


          小米商城登錄前后在個人中心有個地方的設計非常有意思,看下圖未登錄前的5個圖標設計,相信身為設計師的你一眼就能看出“錢包”的圖標偏小,這是為什么呢?



          登錄后才發現,較大的四個圖標都會換成數字,數字的大小正好與錢包圖標的大小視覺上一致,設計師似乎很淘氣。


          登錄后數字與圖標大小視覺上一致



          5、參與感設計



          小米商城的商品具有低頻購買的屬性,如手機、家電等,好在商品的種類相對較多,小米也在不斷的研發新品,為了促活,小米商城在設計上有很多參與感的設計。 

          小米商城有“星球”板塊,可以理解為是一個基于產品討論為導向的社交平臺,這樣的功能就是讓用戶有參與感。 

          當對比華為商城和OPPO商城后,發現華為與OPPO只是把產品呈現出來,卻很少有讓用戶有參與感的設計,而小米商城處處都在打造參與感設計,如游戲化設計、互動平臺等等,當然這些功能的設計與小米主打性價比和粉絲屬性的用戶有關。 


          在小米商城的首頁用戶可以打開紅包雨游戲功能、答題領紅包功能、智取盲盒機功能等,這些雖然都是營銷策略,但因為趣味性、游戲化的設計也大大提高了用戶參與感,從而增加了銷售機會。




           最后 



          對于負責流量分發的首頁,不僅要引導用戶瀏覽和購買商品,給用戶創造優秀的產品體驗,首頁也是體現公司品牌形象的關鍵點位,品牌形象能夠讓用戶了解你、信任你、感受到價值,從而促成購買轉化,這些都可以用設計助力表現。 

          以上講的是UI設計前的探索工作,也是非常有必要的工作,產品設計者只有真正了解了產品的底層架構,才能精準的把控設計,在各方面掌握好平衡。

          文章來源:站酷 作者:吳星辰

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

          設計師要懂的用戶習慣

          ui設計分享達人


          前言:


          前些天對用戶習慣進行了總結,這兩天重新優化了一遍。我們在互聯網產品的設計過程中,有時會聽到一個詞:用戶習慣。設計師希望嘗試更多新穎的交互方式、視覺效果,卻常常容易被其他人挑刺指出不符合用戶習慣,建立在用戶習慣上的創新才是好的體驗。


          盡管設計師經常將用戶習慣掛在嘴邊,但是卻很難有人說出用戶習慣究竟是什么?我們如何判斷所做的設計是否符合用戶習慣?用戶習慣是否始終不能打破?道理我都懂,就是不會做,實際上確實是這樣,因為很大程度上取決于設計師對用戶習慣的理解深度。


          用戶習慣本身很難被量化,但是不代表就是一個模糊的概念,你仍然能從用戶反饋、操作行為數據對比等分析中一窺究竟,用戶習慣是可以隨著設計師的學習、經驗、眼界等的提升而提升的。



          什么是用戶習慣?


          心理學上認為,習慣是人在一定情境下自動化地去進行某種動作的需要或傾向?;蛘哒f,習慣是人在一定情境中所形成的相對穩定的、自動化的一種行為方式。 習慣形成是學習的結果、是條件反射的建立、鞏固并臻至自動化的結果。

           

          所以,習慣有兩大特點:


          需要注意的是,“長期”本身是是沒有明確時間界限的,更強調多次的重復。這里的習慣,側重于描述“習得性”,即人們通過經歷、學習、刻意練習等方式形成的,所以這種習慣理論上是可以被改變的。


          此外,習慣還有一種潛藏特性,區別于上面描述的“習得性”,是天生的、物種特有的行為模式。比如人空腹狀態下,聞到香的食物會產生強烈食欲。這種特性習慣是刻在基因里的,幾乎無法被改變。



          試想,我們在使用 App 時,是否遇到過因為習慣的問題而感覺到不適應的場景?


          舉個最常見的例子,Windows 與 Mac 系統的軟件關閉方式。使用 Windows 的電腦時,我們形成了關閉操作在右上角的自然習慣。后來開始使用 Mac 電腦,關閉方式都在左上角,在一段時間內,每次關閉時都感覺到格外不習慣。而 Mac 的關閉方式沒有比 Windows 產生顯而易見體驗升級,改變操作習慣成本高,部分用戶可能會認為 Mac 的關閉操作不好用。


          當然,假如最開始接觸的是 Mac 電腦,再使用 Windows 電腦,也會自然認為 Windows 不好用,這是先入為主的觀念,一旦產生習慣,改變習慣將產生一定的學習成本。

           


          用戶習慣的產生


          設計師需要思考用戶行為的本質,而盡量減少主觀判斷。產品是給人使用的,所以了解人們的行為特征很重要,而只要涉及到對人本身的了解,就是極其復雜的,人類對自身的行為特征了解遠遠不足,但這不妨礙我們以現有知識去做一些分析和判斷。


          用戶行為習慣的產生,與記憶的特點有很大關聯,我們可以把記憶劃分為外顯記憶和內隱記憶。


          外顯記憶大家比較習慣和容易感知到,比如我們在學校學習時背誦的課文、公式法則等,可以用語言、文字等顯性方式描述出來的記憶。


          內隱記憶也叫非陳述性記憶,我們無法用行為描述而又確實存在,比如騎單車,學會之后很難會遺忘。剛開始學習時,會需要意識的介入,經過多次練習,行為會逐漸“自動化”,比如學習開車時,我們會注意力很集中,而習慣開車后,可以一邊開車一邊聊天。

          我們平時說的肌肉記憶、條件反射也和內隱記憶息息相關,而且一旦形成,不太容易改變。需要注意的是,肌肉記憶只是一種簡單描述,負責此記憶的是小腦,其實肌肉沒有記憶。


          所以有時候,我們感覺體驗某個 App 時,會習慣性在某頁面尋找某功能,或者覺得體驗和其他 App 有區別,都可能是內隱記憶的用戶習慣引起的。舉個例子,某天你剛使用一個沒用過的 App ,這時你想要找設置功能,那你大概率會不自覺的點擊 App 的最后一個主 Tab (如“我的”),因為大部分 App 的設置功能都在這個場景,用戶自然也就形成了習慣。


          這里我且采用由心理學家基思·斯坦諾維奇(Keith Stanovich)和理查德·韋斯特(Richard West)率先提出的術語,用以說明大腦中的兩套系統,即系統 1 和系統 2。


          ·系統1的運行是無意識且快速的,不怎么費腦力,沒有感覺,完全處于自主控制狀態,也叫快系統。

          ·系統2將注意力轉移到需要費腦力的大腦活動上來,例如復雜的運算。系統2的運行通常與行為、選擇和專注等主觀體驗相關聯,也叫慢系統。


          而這兩個系統,是可以互相轉化的,慢系統通過刻意練習,把新的習慣注入快系統,而這時快系統就是習慣的表現,這樣快系統可以在日常生活中完成大部分工作,這就是我們常聽說的熟能生巧,習慣經常能幫我們節省思考的精力,這又讓慢系統進一步通過刻意練習,向快系統不斷注入更多好習慣。


          舉個例子,你剛用一個 App 時,可能需要先體驗一下你要的功能在 App 的哪個位置,但你用久之后,就會不假思索地找到它。就像你用微信,最常用的功能可能是回復信息、看朋友圈,所以一定會形成習慣。但是假如有人讓你找一下微信里面“生活服務”的入口,你可能會先想一下可能出現在什么入口,這就是因為平時比較少用導致的。假如你常用這些入口,也會形成習慣,下次要使用這些功能的時候,就能夠快速找到。



          避免改變用戶習慣


          1、挑戰用戶習慣的風險


          既然說到用戶習慣的特點是“長期養成”且“不易改變”,那么挑戰用戶習慣一定會造成不適,甚至引起強烈反感。幾年前 Ins 的 logo 改版,將 logo 由擬物化改成了扁平化,顏色也發生了變化。暫且拋開視覺效果不說,從用戶視覺記憶上,已經習慣了下圖左側的效果,而右側新版效果很難與左側產生記憶上的關聯。


          許多用戶反饋桌面上找不到這個應用、許多用戶吐槽很丑甚至不想再使用。所以我們比較容易理解,為什么有時候 App 改版容易反而引起用戶的反感,這很大程度上是用戶習慣的影響。



          2、如何避免挑戰用戶習慣


          產品的用戶是誰?


          了解產品的用戶是誰、用戶的行為特點是什么。不同產品由于定位不同,所以用戶群體也不相同,用戶群體的不同自然代表用戶行為特點的不同。如果設計師知道用戶群體,但是不清楚具體行為習慣特征,可以嘗試讓你身邊的用戶幫你體驗。


          舉個例子,B 站的整體用戶畫像相對而言更偏年輕化,所以產品設計上,無論是代表形象、UI 風格、交互體驗都更顯年輕化。而“小年糕”小程序的用戶群體主要為中老年人,所以設計上不會顯得很年輕,而是以操作明確、字號偏大、去除多余信息為主。


          關注競品的體驗


          關注主流產品的用戶體驗很重要,這些競品的操作往往代表用戶的習慣操作(或被培養出來的習慣操作)。大多數情況下,你需要了解競品能做到什么程度,用戶容易將習慣從一個場景帶到另外一個相似場景。


          比如點外賣,有的用戶可能會下載美團和餓了么,盡管平臺不同,但是在用戶習慣中,操作模式是相似的,所以如果你要讓用戶的體驗不突兀,那就往往遵循相似的操作邏輯。當然這些不是為了讓一個產品去抄另外一個產品,而是要追尋更好的使用體驗,你的產品比競品體驗更優,就更能吸引用戶的青睞。


          了解人類的行為/閱讀模式


          每個人本身都會具有相對穩定的行為、操作、信息閱讀習慣,我們能見到的體驗好的產品,都是符合用戶的基本行為習慣、信息閱讀習慣的,要想了解這些習慣,需要了解深層次的交互行為特征。


          從操作而言,需要了解用戶與界面交互的行為習慣,比如用戶的操作(手勢操作、信息布局如何才能便于操作),比如尼爾森可用性原則等。


          從信息閱讀角度而言,需要考慮人們眼睛觀察事物的規律,比如格式塔原理:接近性原則、相似性原則、連續性原則、閉合性原則、主體/背景原則、簡單對稱性原則、共同命運原則。


          了解平臺設計規范


          就移動互聯網產品的領域而言,大家都是與手機互動,目前手機系統的兩大平臺:iOS 和 Android 也都各自有提供關于人機界面設計有清晰的指導,尤其是 Android 的 Material Design ,對于設計師快速了解設計規范、設計原則有很大作用。


          iOS 與 Android 的人機界面規范鏈接:

          iOS:https://developer.apple.com/

          Android:https://material.io/



          培養新的用戶習慣


          1、何時培養新的用戶習慣?


          我們提到挑戰用戶習慣會有風險,但用戶習慣并非是永遠不可改變的,有時我們需要培養新的用戶習慣,也就是大家常說的“教育用戶”,否則世界可能一直很難進步。


          移動互聯網興起之前,大家都是線下打車,但是滴滴打車顛覆了傳統線下打車的用戶習慣;以前大家都是現金支付,但是微信支付顛覆了現金支付的用戶習慣。


          《設計心理學》里面有這么一段話:“如果用新的方式做一件事只比原來好一點,那么最好與以前保持一致。如果必須做出改變,那么每個人都得改變。新舊混雜的系統會讓每個人困惑。當新的做事方式明顯優于舊的方式,那么因改變而帶來的價值會超越改變本身所帶來的困難。不能因為某樣東西與眾不同就認為它不好。如果我們故步自封,我們將永遠不會進步?!?


          改變的價值大于改變的困難


          這里的價值包括但不限于用戶價值、商業價值(短期價值、長期價值)等,當新習慣會需要用戶改變舊習慣時,這個設計帶來的價值有多大,值不值得讓老用戶付出學習成本。有時候,明知改變會引起用戶的強烈抵觸,仍然改變用戶習慣,可能因為改變的價值大于改變的困難。


          剛才提到的 ins 的例子中,有的人不知道 ins 為什么要改版,創新咨詢公司 IDEO 的溝通設計主管 Remy Jauffret 說:“當品牌、組織超越了最初的商業意圖,或擴展業務提供不同的產品,或領導希望吸引新的客戶,這些情況都可能需要新的品牌視覺。變化總是大家不舒服,然后又平息,我認為時間才是檢驗真理的唯一標準?!?


          改變帶來明顯的體驗升級


          我們在設計中,有時候會遇到自己的產品某個功能體驗比較差,但是延續了很久,而市面上其他同類產品在相同功能的體驗上已經做的很好,我們可以往主流交互體驗上改版嗎?這時需要權衡改變之后是否能帶來明顯的體驗升級,還是說對于用戶來說是不痛不癢的變化,可改可不改?


          以安卓為例,在幾年前,安卓手機的底部有 3 個實體鍵,后面手機更新迭代,變成了虛擬三鍵設計,因此底部存在3個不同功能的熱區。而在 Android 4.0 設計規范中,為了避免底部標簽欄與已經存在的底部虛擬鍵產生交互上的沖突,安卓明確說明了不要使用底部標簽欄。


          但這種規則,在使用體驗上、開發者的適配上都發生了問題,用戶更接受 iOS 的體驗,后面谷歌在 Material Design 中,允許了底部標簽欄的存在。這相當于和原來的用戶習慣不一致,但卻帶來了更好的用戶體驗。



          2、如何培養新的用戶習慣?


          這里結合上癮模型的觸發、行為、多變的酬賞、投入進行闡述,這四個步驟是一個循環,當用戶越沉迷于這個循環,說明你的產品對用戶的吸引力越強,用戶習慣也就越強,這里會側重于從培養用戶習慣的角度進行拆解。



          觸發:外部觸發和內部觸發 


          外部觸發說白了就是加強產品曝光,讓用戶一下子就能想起你。舉個例子,“充電五分鐘”下一句是什么?你大概率會想到“通話兩小時”,這種經過外部的長期觸發,最終已經轉變成了內部的習慣,會讓你記憶深刻。


          外部觸發的類型主要有4類,通過將信息滲透進用戶生活,吸引他們采取下一步行動:


          付費型觸發:做廣告、搜索引擎推廣都是付費型觸發,爭取新用戶;

          回饋型觸發:公關和媒體等領域的觸發,比如對產品做正面報道、推薦等;

          人際型觸發:熟人之間的口碑傳播是一種極其有效的外部觸發,可以為產品帶來“病毒式增長”;

          自主型觸發:以驅動用戶重復某種行為作為重點,讓用戶形成習慣,比如新聞訂閱、每天早晨的鬧鐘等。


          內部觸發是用戶心理產生的使用動機,內在情緒驅動自己去使用一款產品。


          當某個產品與你的思想、情感或者是原本已有的常規活動發生密切關聯的時候,那一定是內部觸發在起作用。對于習慣刷朋友圈的人來說,拿起手機就不會自覺打開微信;對于習慣刷微博的人來說,拿起手機就會刷起微博,甚至自己都沒有意識到。一再重復這種場景,會用戶就會對此形成一種穩定的聯系,進而形成習慣。


          行動


          斯坦福大學福格博士曾提出“福格公式”,福格行為模型可以用公式來呈現,即 B = MAT。B 代表行為,M 代表動機,A 代表能力,T 代表觸發。只有動機、能力 、觸發三者皆備,才能跨過“行動線”。


          觸發:即上面所提到的外部觸發與內部觸發。


          動機:動機決定你是否愿意采取行動。福格博士認為,驅使我們采取行動的核心動機主要是三種:追求快樂,逃避痛苦;追求希望,逃避恐懼;追求認同,逃避排斥。


          能力:這里要詳述的是能力,所謂習慣,是指人們在幾乎無意識的情況下做出的舉動。一種行為的復雜程度越低,無論是體力上的還是腦力上的,被人們重復的可能性就越大。越簡單的操作成本,記憶成本越低,越容易形成用戶習慣。


          舉個例子,刷抖音就是用戶行為成本極低的場景,你在刷抖音時,不需要多余的交互行為,切換視頻甚至不需要點擊,只需要向上滑動。除開抖音算法的精準推薦不說,從交互層面而言,也是足夠簡單并且形成習慣了。


          如果改變會打破認知習慣,要讓用戶能快速了解新設計的使用方式。最好的方式是能夠讓用戶快速與已其他競品的操作習慣產生關聯。比如采用其他主流應用成熟的交互方式。


          如果改版會很大程度上改變用戶行為,也可以考慮嘗試以下的方式。


          · 改版操作指引:這種方式較為常見,但是仍應注意避免繁瑣的操作指引,切勿把操作指引當作體驗差時的解決方案。


          · 兼容多種用戶習慣:這種方式可以讓不同用戶選擇適合自己的交互方式,最大程度考慮到所有用戶,但同時也可能造成了功能冗雜的情況。比如安卓底部三大金剛鍵,后面手機全面屏時代,新增了全面屏手勢??紤]到安卓老用戶的使用習慣,三大金剛鍵(底部虛擬按鍵)始終被保留下來;


          · 允許切換新舊版本:這種方式一般是改版變化過大,用戶一時間不容易接受新的體驗方式,常見于網站,如站酷早期的大改版,但是僅適用于過渡期。


          當然,除上述方式外,肯定還有一些其他讓改變行為習慣更舒服的方式,這里不一一列舉。


          多變的酬賞


          多變酬賞主要表現為:社交酬賞,獵物酬賞,自我酬賞。這幾種酬賞會加強用戶對產品的使用習慣。


          社交酬賞:人們從產品中通過與他人的互動而獲取的人際獎勵,比如被認同、重視、喜愛等。比如人們喜歡發朋友圈、微博等,期望得到回饋,某種程度上都是為了獲得社交酬賞。

          獵物酬賞:人們從產品中獲得的具體資源或信息。比如瀏覽信息流,豐富的信息流內容為用戶提供了資訊,比如刷抖音,人們追求視頻的新鮮感、追求內容的豐富性都是屬于獵物酬賞。

          自我酬賞:人們從產品中體驗到的操控感、成就感和終結感。在目標驅動下,我們會去克服障礙,即便僅僅是因為這個過程能帶來滿足感。就像你玩游戲,希望贏過對面,或者期待將游戲玩通關,本質上屬于自我酬賞。


          投入


          如果希望繼續培養用戶習慣,與產品產生更緊密的聯系,就需要鼓勵用戶進行一些投入,以增加他們使用產品的可能性。行動只是用戶使用的第一步,促使用戶對產品的投入,才會真正增強用戶與產品之間的聯系,形成更強的用戶習慣。但是如果用戶自身沒有投入,即替換成本低,那么隨時都可能有被其他產品取代。


          舉個例子,移動互聯網時期,微信早早入局,人們的關系鏈都在微信里面沉淀,即人們越使用微信,關系鏈沉淀越多,就越難以更換其他產品,所以兩年前想要挑戰微信的多閃、馬桶 MT 和聊天寶這三款社交 App 不可避免的失敗了。


          用戶越愿意投入,就證明用戶粘性越高,在此過程中,用戶習慣也會不斷加強。



          結語:


          現階段,人人大談用戶習慣,但是用戶習慣不以自身為標準,而是需要考慮產品用戶的行為特征,以及人們在使用產品時更加深層的、甚至用戶本身都沒有發現的習慣,這就需要設計師對習慣的產生、習慣的判斷、習慣的培養有深入的認識。


          一般情況下,產品不適合貿然改變用戶習慣,但是在有特殊需要的情況下,還是不可避免的改變產品的用戶使用習慣,當然我們需要如何讓用戶更加容易接受。大多數產品,都希望用戶能夠形成對自己產品的習慣,所以需要了解用戶如何對產品產生習慣、加強習慣,使產品擁有更強的吸引力,但是良好、正向的用戶習慣一定是基于用戶體驗的。


          文章來源:站酷 作者:熱風_

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務



          JavaScript控制語句與異常處理

          前端達人


          一、if 控制語句

          1. 簡單if語句
           if(條件表達式){ 表達式成立時執行的代碼段 } 
          
          • 1
          • 2
          • 3

          注意 : 除零值以外,其他值都為真

          特殊寫法 : { }可以省略,一旦省略,if語句只控制其后的第一行代碼

          var a = 10; if(a<5){ console.log('成立'); //如果if不成立則不運行 } if(a<5)console.log('成立'); //如果if不成立則不運行 console.log('測試'); 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          1. if - else結構
          if(條件表達式){ //條件成立時執行 }else{ //條件不成立時選擇執行 
          
          • 1
          • 2
          • 3
          • 4
          1. 多重分支結構
          if(條件1){ //條件1成立時執行 }else if(條件2){ //條件2成立時執行 }else if(條件3){ //條件3成立時執行 }...else{ //條件不成立時執行 } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9

          示例:

          var bmi=23.5; if(bmi>23.5){ console.log('肥胖') }else if(bmi>=18.5){ console.log('正常') }else{ console.log('偏瘦') } //正常 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9

          二、switch 選擇控制語句

          語法:

          switch(value){ case1 : //value與值1匹配全等時,執行的代碼段 break; //結束匹配 case2 : //value與值2匹配全等時,執行的代碼段 break; case3 : //value與值3匹配全等時,執行的代碼段 break; default: //所有case匹配失敗后默認執行的語句 break; } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14

          使用 :

          1. switch語句用于值的匹配,case用于列出所有可能的值;只有switch()表達式的值與case的值匹配全等時,才會執行case對應的代碼段

          2. break用于結束匹配,不再向后執行;可以省略,break一旦省略,會從當前匹配到的case開始,向后執行所有的代碼語句,直至結束或碰到break跳出

          3. default用來表示所有case都匹配失敗的情況,一般寫在末尾,做默認操作

          4. 多個case共用代碼段

            case 值1:

            case 值2:

            case 值3:

            以上任意一個值匹配全等都會執行的代碼段

          注:case表示一個條件,滿足這個條件就會進入該內部,遇到break則會跳出,若未寫break則直到遇到下一個break才會停止。

          var gameScore = 'better'; switch(gameScore){ //case表示一個條件 滿足這個條件就會走進來 遇到break跳出。如果某個條件中不寫 break,那么直到該程序遇到下一個break停止 case 'good': console.log('玩的很好') //break表示退出 break; case 'better': console.log('玩的老牛逼了') break; case 'best': console.log('恭喜你 吃雞成功') break; default: console.log('很遺憾') } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17

          三、while 循環控制語句

          語法:

          定義循環變量; while(循環條件){ 條件滿足時執行的代碼段
             更新循環變量; } 
          
          • 1
          • 2
          • 3
          • 4
          • 5

          示例:

          //循環變量 var i = 1; var sum=0; while(i<101){ //循環體 console.log(i); sum+=i; //更新循環變量 i++; } console.log(sum); 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11

          四、do-while 循環

          語法:

          do{ 循環體; 更新循環變量 }while(循環條件); 
          
          • 1
          • 2
          • 3
          • 4

          示例:

          //循環輸出一百次 var i = 101; do{ console.log('python'); //更新循環變量 i++; }while(i<101); 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7

          do-while與while循環的區別:

          • while循環先判斷循環條件,條件成立才執行循環體
          • do-while循環不管條件是否成立,先執行一次循環體

          五、for 循環控制語句

          語法:

          for(定義循環變量;循環條件;更新循環變量){ 循環體; } 
          
          • 1
          • 2
          • 3

          循環控制 :

          1. break 強制結束循環
          2. continue 結束當次循環,開始下一次循環

          循環嵌套 : 在循環中嵌套添加其他循環

          示例:

          /*控制循環體的執行:break/continue*/ for(var i=1;i<10;i++){ console.log(i); if(i==5){ console.log('--------') //一旦執行break,循環體中后面的代碼都不執行 break; } } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9

          注:循環的是獲取的每一個DOM元素值,for...in...是用來循環對象的所有屬性,DOM元素包括了輸出的屬性,因此不推薦使用for...in...


          六、三元運算符

          var a = 1 var b =2 var c = a>b ? a:b //如果a>b成立返回a,否則返回b console.log(c) 
          
          • 1
          • 2
          • 3
          • 4

          七、異常處理

          語法:

          try{ 這段代碼從上至下運行,其中任何一個語句拋出異常該代碼塊即結束運行。 }catch(e){ 如果try代碼塊中拋出異常,catch代碼塊中代碼就會被執行;
              e為一個局部變量,用來指向Error對象或者其他拋出的對象。 }finally{ 無論try中代碼是否有異常拋出(甚至是try代碼塊中有return語句)finally代碼塊中始終會被執行。 } 
          
          
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8

          注:主動拋出異常:throw Error("xxx")


          轉自:csdn 論壇 作者:PPPsych


          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服



          我勸你學一下TypeScript(TypeScipt有這篇就夠了)

          前端達人

          TypeScript

          一 概述

          1.1 基本介紹

          • 以JavaSrcipt為基礎構建的語言
          • 一個JavaSrcipt的超集
          • 可以再任何支持JavaSrcipt的平臺運行
          • TypeScript擴展了JavaSrcipt,并添加了變量類型
          • TS不能被JS解析器中直接執行,需要通過編譯轉換為JS

          1.2 安裝TS編譯器

          • 安裝
          npm i -g typescript 
          
          • 1
          • 驗證
          tsc 
          
          • 1

          在這里插入圖片描述

          • 測試

            • 先建hello.ts
            console.log("你好啊,TS") 
                    
            • 1
            • 編譯
            tsc hello.ts 
                    
            • 1

          在這里插入圖片描述

          二 基本語法

          2.1 總體介紹

          JavaScript 的類型分為兩種:原始數據類型(Primitive data types)和對象類型(Object types)。

          原始數據類型包括:布爾值、數值、字符串、null、undefined 以及 ES6 中的新類型 Symbol 和 BigInt。4

          • 類型聲明

            • 類型聲明是TS非常重要的一個特點;

            • 通過類型聲明可以指定TS中變量(參數、形參)的類型;

            • 指定類型后,當為變量賦值時,TS編譯器會自動檢查值是否符合類型聲明,符合則賦值,否則報錯;

            • 簡而言之,類型聲明給變量設置了類型,使得變量只能存儲某種類型的值;

            • 語法:

              • let 變量: 類型;
                
                let 變量: 類型 = 值;
                
                function fn(參數: 類型, 參數: 類型): 類型{
                    ...
                } 
                                        
                • 1
                • 2
                • 3
                • 4
                • 5
                • 6
                • 7
          • 變量:

          //申明一個變量 let 變量名:類型
          // number
          let a:number;
          a=1;
          // string
          let b:string;
          b="哈哈";
          // boolean
          let c:boolean=false; 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 函數:
          // 函數 function 函數名(變量:類型,變量:類型):返回值類型 {
          //     return a+b;
          // }
          function sum(a:number,b:number):number {
              return a+b;
          }
          sum(1,3) 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 自動類型判斷
            • TS擁有自動的類型判斷機制
            • 當對變量的聲明和賦值是同時進行的,TS編譯器會自動判斷變量的類型
            • 所以如果你的變量的聲明和賦值時同時進行的,可以省略掉類型聲明

          2.2 基本數據類型

          類型 例子 描述
          number 1, -33, 2.5 任意數字
          string ‘hi’, “hi”, hi 任意字符串
          boolean true、false 布爾值true或false
          字面量 其本身 限制變量的值就是該字面量的值
          any * 任意類型
          unknown * 類型安全的any
          void 空值(undefined) 沒有值(或undefined)
          never 沒有值 不能是任何值
          object {name:‘孫悟空’} 任意的JS對象
          array [1,2,3] 任意JS數組
          tuple [4,5] 元素,TS新增類型,固定長度數組
          enum enum{A, B} 枚舉,TS中新增類型
          • number
          // number let a:number; a=1; 
          
          • 1
          • 2
          • 3
          • string
          // string
          let b:string;
          b="哈哈"; 
          
          • 1
          • 2
          • 3
          • boolean
          // boolean
          let c:boolean=false; 
          
          • 1
          • 2
          • 字面量
          // 字面量 |:或 &:與
          let d:'man'|'woman';
          d="man";
          d="woman";
          let e:number|boolean;
          e=1
          e=false; 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • any
          //any 一切類型變量與js沒啥區別
          let f:any;
          f=1
          f=false; 
          
          • 1
          • 2
          • 3
          • 4
          • unknown
          // unknown 不知道什么類型,實際上是一種安全的any
          let a:unknown;
          a=1;
          a=false;
          a="哈哈哈"; 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • void
          // 函數返回值,默認返回值any,空值
          function add(a,b) {
          return a+b;
          }
          // 沒有返回值,空值
          function adds():void {
          return null;
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • never
          // never:永遠沒有返回值
          function hh():never {
          throw new Error("錯誤了");
          } 
          
          • 1
          • 2
          • 3
          • 4
          • object
          // object 對象 常用:{屬性:屬性值}
          let  b:{name:string,age:string,sex:boolean};
          b={name:"小米",age:"12",sex:false}
          // ?可選屬性
          let c:{name:string,age?:string,sex?:boolean}
          c={name:"雷軍"}
          // 任意類型的屬性 [propName:string]:any
          let d:{name:string,[propName:string]:any}
          d={name:"哈哈",a:1,b:2}
          // 限制函數結構 語法:(形參:類型......)=>返回值
          let e:(a:number,b:number)=>number;
          e=function (n1,n2):number {
          return n1+n2;
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • array
          // 數組,同一類型的數組 類型[], array<類型>
          let a:string[];
          a=['h','b','c','d']
          let b: Array<string>;
          b=['h','b','c','d'] 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • tuple
          // 元組:固定長度的數組
          let c:[string,string,number]
          c=["哈哈","哈哈",1] 
          
          • 1
          • 2
          • 3
          • enum
          // 枚舉
          //性別枚舉類
          enum sex {
              male,
              female
          }
          let d:{name:string,sex:sex}
          d={
              name:"李磊",
              sex:sex.male
          }
          alert(d.sex===sex.male) 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 別名
          //別名
          type mytype=string;
          let  e:mytype; 
          
          • 1
          • 2
          • 3

          三 編譯選項

          3.1 自動編譯文件

          • 如果直接使用tsc指令,則可以自動將當前項目下的所有ts文件編譯為js文件。
          • 但是能直接使用tsc命令的前提時,要先在項目根目錄下創建一個ts的配置文件 tsconfig.json
          • tsconfig.json是一個JSON文件,添加配置文件后,只需只需 tsc 命令即可完成對整個項目的編譯

          3.2 具體配置

          { //指定需要TS編譯的文件路徑 /**:任意路徑 /*:任意文件 "include": ["./編譯選項/src/**/*"], //指定不需要TS編譯的文件路徑  /**:任意路徑 /*:任意文件 ,默認路徑: "exclude": ["./編譯選項/test/**/*","./基本數據類型/**/*"], //繼承:配置文件的重復引用 // "extends": "", //具體需要編譯的文件 //"files": [], //編譯器選項 "compilerOptions": { // target 指定被TS編譯的ES版本 "target": "ES3", // module 模塊化 "module": "system", // 指定項目需要的庫 "lib": ["dom"], // 編譯完后的js文件路徑 "outDir": "./編譯選項/js", // 將代碼合并為一個文件 "outFile": "./代碼/1.js", // 是否對js文件進行編譯 "allowJs": true, // 檢查js是否符合規范 "checkJs": false, // 是否移除注釋 "removeComments": true, // 不生成編譯后的文件 "noEmit": false, // 當有錯誤時不生編譯文件 "noEmitOnError": true, // 是否是嚴格模式 "alwaysStrict": true, // 是否允許出現隱式的any "noImplicitAny": false, // 是否允許出現隱式的this "noImplicitThis": false, // 嚴格使用空值 "strictNullChecks": false } } 
          
          • 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
          • 其他配置:https://www.w3cschool.cn/typescript/typescript-compiler-options.html

          四 打包選項

          通常情況下,實際開發中我們都需要使用構建工具對代碼進行打包;TS同樣也可以結合構建工具一起使用,下邊以webpack為例介紹一下如何結合構建工具使用TS;

          4.1 初始化項目

          進入項目根目錄,執行命令 npm init -y,創建package.json文件

          4.2 下載構建工具

          命令如下:

          npm i -D webpack webpack-cli webpack-dev-server typescript ts-loader clean-webpack-plugin 
          
          • 1

          共安裝了7個包:

          • webpack:構建工具webpack
          • webpack-cli:webpack的命令行工具
          • webpack-dev-server:webpack的開發服務器
          • typescript:ts編譯器
          • ts-loader:ts加載器,用于在webpack中編譯ts文件
          • html-webpack-plugin:webpack中html插件,用來自動創建html文件
          • clean-webpack-plugin:webpack中的清除插件,每次構建都會先清除目錄

          4.3 配置TS編譯選項

          根目錄下創建tsconfig.json,配置可以根據自己需要

          { "compilerOptions": { "target": "ES2015", "module": "ES2015", "strict": true } } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7

          4.4 修改package.json配置

          修改package.json添加如下配置

          { ... "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "webpack", "start": "webpack serve --open chrome.exe" }, ... } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9

          4.5 項目使用

          在src下創建ts文件,并在并命令行執行npm run build對代碼進行編譯;

          或者執行npm start來啟動開發服務器;

          4.6 Babel

          除了webpack,開發中還經常需要結合babel來對代碼進行轉換;

          以使其可以兼容到更多的瀏覽器,在上述步驟的基礎上,通過以下步驟再將babel引入到項目中;

          雖然TS在編譯時也支持代碼轉換,但是只支持簡單的代碼轉換;

          對于例如:Promise等ES6特性,TS無法直接轉換,這時還要用到babel來做轉換;

          安裝依賴包:

          npm i -D @babel/core @babel/preset-env babel-loader core-js 
          
          • 1

          共安裝了4個包,分別是:

          • @babel/core:babel的核心工具
          • @babel/preset-env:babel的預定義環境
          • @babel-loader:babel在webpack中的加載器
          • core-js:core-js用來使老版本的瀏覽器支持新版ES語法

          修改webpack.config.js配置文件

          ...
          module: {
              rules: [
                  {
                      test: /\.ts$/,
                      use: [
                          {
                              loader: "babel-loader",
                              options:{
                                  presets: [
                                      [
                                          "@babel/preset-env",
                                          {
                                              "targets":{
                                                  "chrome": "58",
                                                  "ie": "11"
                                              },
                                              "corejs":"3",
                                              "useBuiltIns": "usage"
                                          }
                                      ]
                                  ]
                              }
                          },
                          {
                              loader: "ts-loader",
          
                          }
                      ],
                      exclude: /node_modules/
                  }
              ]
          }
          ... 
          
          • 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

          如此一來,使用ts編譯后的文件將會再次被babel處理;使得代碼可以在大部分瀏覽器中直接使用;同時可以在配置選項的targets中指定要兼容的瀏覽器版本;

          • 總結
          // 導入包 const path = require("path"); // 導入HTML插件 const HtmlWebpackPlugin = require("html-webpack-plugin"); // 導入清除插件 const { CleanWebpackPlugin } = require("clean-webpack-plugin"); //webpack打包配置文件 module.exports={ // 關閉代碼壓縮,可選 optimization:{ minimize: false }, //入口 entry: './src/index.ts', //指定打包文件所在目錄 output: { //打包文件所在目錄 path: path.resolve(__dirname,'dist'), //打包文件名 filename: "bundle.js", // 關閉webpack的箭頭函數,可選 environment: { arrowFunction: false // 關閉webpack的箭頭函數,可選 } }, //指定打包需要的模塊 module: { //規則 rules: [ { // 指定規則生效的文件 test: /\.ts$/, // 要使用的loader加載器 use: [ // 加載器一 { loader: "babel-loader", // 選項 options:{ //預設 presets: [ [ //指定環境插件 "@babel/preset-env", { // 兼容的瀏覽器信息 "targets":{ "chrome": "58", "ie": "11" }, //  指定corejs版本 "corejs":"3", // 使用core的方法 usage:按需加載 "useBuiltIns": "usage" } ] ] } }, // 加載器二 { loader: "ts-loader", } ] , // 排除的模塊 exclude: /node_modules/ } ] }, //配置Html插件 plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ //標題 //title: "小米" // 模板 template: "./src/index.html" }) ], // 用來設置引用模塊 resolve: { // 以 js ts 結尾 extensions: ['.js','.ts'] } } 
          
          • 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

          五 OOP

          要想面向對象,操作對象,首先便要擁有對象;

          要創建對象,必須要先定義類,所謂的類可以理解為對象的模型;

          程序中可以根據類創建指定類型的對象;

          舉例來說:

          可以通過Person類來創建人的對象,通過Dog類創建狗的對象,不同的類可以用來創建不同的對象;

          5.1 定義類

          class 類名 {
              屬性名: 類型;
          
              constructor(參數: 類型){
                  this.屬性名 = 參數;
              }
          
              方法名(){
                  ....
              }
          
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12

          示例:

           class Person{
                  name: string;
                  age: number;
          
                  constructor(name: string, age: number){
                      this.name = name;
                      this.age = age;
                  }
          
                  sayHello(){
                      console.log(`大家好,我是${this.name}`);
                  }
              } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13

          使用類:

          const p = new Person('孫悟空', 18);
          p.sayHello(); 
          
          • 1
          • 2

          5.2 構造函數

          可以使用constructor定義一個構造器方法;

          注1:在TS中只能有一個構造器方法!

          例如:

          class C{
              name: string;
              age: number
          
              constructor(name: string, age: number) {
                  this.name = name;
                  this.age = age;
              }
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9

          同時也可以直接將屬性定義在構造函數中:

          class C {
              constructor(public name: string, public age: number) {
              }
          } 
          
          • 1
          • 2
          • 3
          • 4

          上面兩種定義方法是完全相同的!

          注2:子類繼承父類時,必須調用父類的構造方法(如果子類中也定義了構造方法)!

          例如:

          class A {
              protected num: number;
              constructor(num: number) {
                  this.num = num;
              }
          }
          
          class X extends A {
              protected name: string;
              constructor(num: number, name: string) {
                  super(num);
                  this.name = name;
              }
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14

          如果在X類中不調用super將會報錯!

          5.3 封裝

          對象實質上就是屬性和方法的容器,它的主要作用就是存儲屬性和方法,這就是所謂的封裝

          默認情況下,對象的屬性是可以任意的修改的,為了確保數據的安全性,在TS中可以對屬性的權限進行設置

          • 靜態屬性(static):
            • 聲明為static的屬性或方法不再屬于實例,而是屬于類的屬性;
          • 只讀屬性(readonly):
            • 如果在聲明屬性時添加一個readonly,則屬性便成了只讀屬性無法修改
          • TS中屬性具有三種修飾符:
            • public(默認值),可以在類、子類和對象中修改
            • protected ,可以在類、子類中修改
            • private ,可以在類中修改

          示例:

          public:

          class Person{
              public name: string; // 寫或什么都不寫都是public
              public age: number;
          
              constructor(name: string, age: number){
                  this.name = name; // 可以在類中修改
                  this.age = age;
              }
          
              sayHello(){
                  console.log(`大家好,我是${this.name}`);
              }
          }
          
          class Employee extends Person{
              constructor(name: string, age: number){
                  super(name, age);
                  this.name = name; //子類中可以修改
              }
          }
          
          const p = new Person('孫悟空', 18);
          p.name = '豬八戒';// 可以通過對象修改 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23

          protected:

          class Person{ protected name: string; protected age: number; constructor(name: string, age: number){ this.name = name; // 可以修改 this.age = age; } sayHello(){ console.log(`大家好,我是${this.name}`); } } class Employee extends Person{ constructor(name: string, age: number){ super(name, age); this.name = name; //子類中可以修改 } } const p = new Person('孫悟空', 18); p.name = '豬八戒';// 不能修改 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24

          private:

          class Person{ private name: string; private age: number; constructor(name: string, age: number){ this.name = name; // 可以修改 this.age = age; } sayHello(){ console.log(`大家好,我是${this.name}`); } } class Employee extends Person{ constructor(name: string, age: number){ super(name, age); this.name = name; //子類中不能修改 } } const p = new Person('孫悟空', 18); p.name = '豬八戒';// 不能修改 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24

          5.4 屬性存取器

          對于一些不希望被任意修改的屬性,可以將其設置為private

          直接將其設置為private將導致無法再通過對象修改其中的屬性

          我們可以在類中定義一組讀取、設置屬性的方法,這種對屬性讀取或設置的屬性被稱為屬性的存取器

          讀取屬性的方法叫做setter方法,設置屬性的方法叫做getter方法

          示例:

          class Person{ private _name: string; constructor(name: string){ this._name = name; } get name(){ return this._name; } set name(name: string){ this._name = name; } } const p1 = new Person('孫悟空'); // 實際通過調用getter方法讀取name屬性 console.log(p1.name); // 實際通過調用setter方法修改name屬性  p1.name = '豬八戒'; 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22

          5.5 靜態屬性

          靜態屬性(方法),也稱為類屬性。使用靜態屬性無需創建實例,通過類即可直接使用

          靜態屬性(方法)使用static開頭

          示例:

          class Tools{ static PI = 3.1415926; static sum(num1: number, num2: number){ return num1 + num2 } } console.log(Tools.PI); console.log(Tools.sum(123, 456)); 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10

          5.6 this

          在類中,使用this表示當前對象

          5.7 繼承

          繼承時面向對象中的又一個特性

          通過繼承可以將其他類中的屬性和方法引入到當前類中

          示例:

          class Animal{ name: string; age: number; constructor(name: string, age: number){ this.name = name; this.age = age; } } class Dog extends Animal{ bark(){ console.log(`${this.name}在汪汪叫!`); } } const dog = new Dog('旺財', 4); dog.bark(); 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19

          通過繼承可以在不修改類的情況下完成對類的擴展

          5.8 重寫

          發生繼承時,如果子類中的方法會替換掉父類中的同名方法,這就稱為方法的重寫

          示例:

          class Animal{ name: string; age: number; constructor(name: string, age: number){ this.name = name; this.age = age; } run(){ console.log(`父類中的run方法!`); } } class Dog extends Animal{ bark(){ console.log(`${this.name}在汪汪叫!`); } run(){ console.log(`子類中的run方法,會重寫父類中的run方法!`); } } const dog = new Dog('旺財', 4); dog.bark(); 
          
          • 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

          在子類中可以使用super來完成對父類的引用

          5.9抽象類(abstract class)

          抽象類是專門用來被其他類所繼承的類,它只能被其他類所繼承不能用來創建實例

          abstract class Animal{ abstract run(): void; bark(){ console.log('動物在叫~'); } } class Dog extends Animals{ run(){ console.log('狗在跑~'); } } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12

          使用abstract開頭的方法叫做抽象方法,抽象方法沒有方法體只能定義在抽象類中,繼承抽象類時抽象方法必須要實現;

          5.10 接口

          接口的作用類似于抽象類,不同點在于:接口中的所有方法和屬性都是沒有實值的,換句話說接口中的所有方法都是抽象方法;

          接口主要負責定義一個類的結構,接口可以去限制一個對象的接口:對象只有包含接口中定義的所有屬性和方法時才能匹配接口;

          同時,可以讓一個類去實現接口,實現接口時類中要保護接口中的所有屬性;

          示例(檢查對象類型):

          interface Person{ name: string; sayHello():void; } function fn(per: Person){ per.sayHello(); } fn({name:'孫悟空', sayHello() {console.log(`Hello, 我是 ${this.name}`)}}); 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10

          示例(實現):

          interface Person{ name: string; sayHello():void; } class Student implements Person{ constructor(public name: string) { } sayHello() { console.log('大家好,我是'+this.name); } } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13

          5.11泛型

          定義一個函數或類時,有些情況下無法確定其中要使用的具體類型(返回值、參數、屬性的類型不能確定);

          此時泛型便能夠發揮作用;

          舉個例子:

          function test(arg: any): any{
              return arg;
          } 
          
          • 1
          • 2
          • 3

          上例中,test函數有一個參數類型不確定,但是能確定的時其返回值的類型和參數的類型是相同的;

          由于類型不確定所以參數和返回值均使用了any,但是很明顯這樣做是不合適的:

          首先使用any會關閉TS的類型檢查,其次這樣設置也不能體現出參數和返回值是相同的類型;

          5.12 泛型函數

          5.12.1 創建泛型函數

          function test<T>(arg: T): T{
              return arg;
          } 
          
          • 1
          • 2
          • 3

          這里的``就是泛型;

          T是我們給這個類型起的名字(不一定非叫T),設置泛型后即可在函數中使用T來表示該類型;

          所以泛型其實很好理解,就表示某個類型;

          那么如何使用上邊的函數呢?

          5.12.2 使用泛型函數

          5.12.3 方式一(直接使用):
          test(10) 
          
          • 1

          使用時可以直接傳遞參數使用,類型會由TS自動推斷出來,但有時編譯器無法自動推斷時還需要使用下面的方式

          5.12.4 方式二(指定類型):
          test<number>(10) 
          
          • 1

          也可以在函數后手動指定泛型;

          5.12.5 函數中聲明多個泛型

          可以同時指定多個泛型,泛型間使用逗號隔開:

          function test<T, K>(a: T, b: K): K{
            return b;
          }
          
          test<number, string>(10, "hello"); 
          
          • 1
          • 2
          • 3
          • 4
          • 5

          使用泛型時,完全可以將泛型當成是一個普通的類去使用;

          2.12.6 泛型類

          類中同樣可以使用泛型:

          class MyClass<T>{
            prop: T;
          
            constructor(prop: T){
                this.prop = prop;
            }
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7

          2.12.7 泛型繼承

          除此之外,也可以對泛型的范圍進行約束

          interface MyInter{
            length: number;
          }
          
          function test<T extends MyInter>(arg: T): number{
            return arg.length;
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7

          使用T extends MyInter表示泛型T必須是MyInter的子類,不一定非要使用接口類和抽象類同樣適用;


          轉自:csdn 論壇 作者:Eason~IT


          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服


          如何通過推廣增加網站流量

          seo達人

           

            做SEO的朋友都知道網站流量尤為重要,所以對于網站的推廣也是非常重要的,網站推廣可以增加網站流量是任何seo優化人員都應該考慮的問題,如何推廣網站,讓流量快速上升?下面就帶大家來看一看。

          如何通過推廣增加網站流量

            1、推廣QQ群

            QQ群是聚集大量行業相關員工的最佳場所,其成員比其他社區論壇活躍得多,你只需要成為群的一員,最好是成為群的管理員或一名群主,只有你有權發布你的內容。因此,QQ群推廣應該知道如何處理人與人之間的關系,以及如何建立這樣的關系。

            可以通過定期交流行業知識或幫助團隊成員回答問題來建立權威。

            (1)QQ空間推廣。首先你必須有大量的朋友,然后在空間里不斷更新行業的技術文章或用戶需求,然后你可以在這些文章中推薦你的網站。

            (2)QQ郵件推廣,發送的郵件必須是用戶感興趣和需要的內容,標題要有吸引力,內容要簡潔,最終的結果是引導用戶進入網站。

            2、軟文廣告

            你需要知道一些寫作技巧,結合行業知識和營銷知識,讓用戶在閱讀你的文章時輸入你的營銷理念,引導用戶瀏覽你的網站。

            (1)購買軟文,聯系管理員在不同行業的網站上購買軟文,購買的軟文可以由他人書寫,也可以自己書寫,便于排名。

            (2)A5、CHINAZ等網站的進行投稿,這樣會有更多的人會看到并轉載文章。

            3、分類信息平臺發布

            到目前為止,大部分五金、辦公、住宅、機械產品的購買者仍在到分類信息平臺尋找銷售商,更多的生產商和貿易商也在到分類信息平臺發布產品信息。長尾字排名作為公司站長尾字排名很大程度上取決于上面的說法,這樣的一方也能給主站帶來一些流量和權重。

            4、微博微信推廣

            微博和微信是粉絲的生態,所以推廣微博和微信的前提是增加大量的朋友和行業相關人士,他們是為了好玩而分享,如果你的內容不是很搞笑,廣告效果就不是很好。

            美圖、服裝、旅游、食品、化妝品、互聯網等行業適合在微博推廣,機械、化工等行業則不適合。

           

          作者:曦曦SEO來源:成都seo

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

           

           

          如何優化軟文本鏈的發布?

          seo達人

           

           

          要想快速提高網站的流量和優化效果,需要多方面的合作,其中外部環節不可忽視。外鏈分為多種形式,哪一種比較好,那么如何釋放軟文本的外鏈呢?現在讓我們來看看。

          1、 軟文外鏈釋放技巧

          所謂優化網站進行軟文鏈發布,必須發布一些內容和網站本身比較大,關鍵詞匹配的主題鏈接URL,搜索引擎近對用戶體驗度的要求越來越高,所以要注意網站內容與網站本身的相關性。

          發布軟鏈接要根據關鍵詞寫原創文章,這樣的鏈接更有利于百度抓取,只有軟鏈接地址收錄網站本身帶來的好處更多,所以本文包含的直接方法,就是發布原文。

          在軟文連鎖發布中,要注意軟文外鏈平臺。如果我們要找的平臺是垃圾鏈,不僅不能給網站帶來流量,更有可能受到搜索引擎的懲罰,那么我們必須選擇一個正規的平臺。

          2、 軟件鏈發布過程

          通過一定的渠道找到合適的軟發布平臺,大致可以分為以下幾種類型:軟件論壇、站長論壇、貼吧、博客和高質軟文本發布平臺。要針對不同類型的網站選擇不同的軟件發布平臺進行文章發布。

          外鏈軟文,必須寫外鏈軟文,那么外鏈軟文標題應該寫哪個方面比較好?我們可以根據長尾關鍵詞來確定軟文標題,SEO優化寫這篇文章有點難度,當然,我們也可以從百度下拉框、相關競爭對手的網站、追逐工具中尋找用戶需求,比如長尾詞、時間、文章結構、編輯寫用戶需求自由度等,推廣我們的網絡品牌,用戶需求自由。

          當我們發布軟文本鏈接時,首先要確保發布的外部鏈接的內容是搜索引擎的,并且文字要恰當。我們發布軟文鏈是為了讓搜索引擎快速收錄,做給網站自身帶來更快的好處。一般來說,一篇好文章就是副標題。字數由頻道的性質決定。排字很好。在文章的前面加上你網站的品牌詞,在文章底部加上一個鏈接。

          文章來源:優幫云SEO 

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

          如何快速增加百度收錄量,跟我學!

          seo達人

           

          增加百度收錄可以說是SEO從業人員最為關注的一個問題,甚至很多公司把百度收錄作為業績指標,所以如何增加百度收錄就成了SEO最熱門的話題。

          如何增加百度收錄

          隨著今年百度搜索機制的改進完善,尤其是近兩年接連發布算法,很多網站的收錄量幾乎停滯不前,那么到底如何增加百度收錄量呢,劉少慶今天跟大家聊聊這個話題。

          劉少慶從新網站和老網站的角度進行分析,兩者之前可能存在一些相同之處,鑒于大家各取所需,所以該羅嗦的地方小編還是會羅嗦。

          一、新網站

          周所周助,新網站在百度存在著一個考察期(雖無正式文件說明,但已是共識),通常情況下,新網站的首頁會在一周內被百度收錄,快點的當天或隔天。但是對于內容則需要較長的時間才能放出,已經抓取但是沒有放出,從最表面上看,可以理解為沒有被收錄。

          那么新網站如何增加百度收錄呢?小編認為對于新網站來說,內容是關鍵,前期應該盡可能的創造原創內容,目的是給百度留下好印象,這能夠縮短考察期。

          另外,可以使用百度官方提供的一些工具,比如說百度熊掌號。關于全新網站如何增加百度收錄小編建議大家詳細閱讀這兩篇文章:新網站如何加快頁面收錄,百度熊掌號是否能提升收錄,里面解說得比較詳細。

          本站上線時間為4月15號,正是開放robots是20號,目前共計收錄40篇。截止昨天本站總文章數為60篇,已經被收錄40篇。由于其他原因無法提交到百度熊掌號,所以沒有享受到優先抓取待遇。當然,因為原創難度相對較大,本站每天產生的內容少,所以從整站的收錄量看,百度收錄得并不多。

          有人會說,百度的工具都是做樣子的,提交了也不一定會收錄!小編這里要說兩點:一是不要聽別人說,自己去試試才能知道真假;二是把內容做好,不要想著蒙混過關。

          總之,新網站要增加百度收錄也不是不可能的,關鍵是怎么操作。

          二、老網站

          老網站因為有了一定的內容基礎,所以要增加百度收錄的方式也就多一些,下面從幾個方面來具體說說老網站如何增加百度收錄。

          ① 創造新內容增加百度收錄

          這點對于新網站還是老網站都是可行的。如果可能,盡量生產原創內容,最起碼也得經過整合加工處理。

          ② 處理沒有收錄過的頁面

          對于老網站而言,總有些頁面是沒有被百度收錄的,我們可以對這些頁面采取措施,讓他們盡可能多的被收錄。

          如何做呢,方法包括且不限于提交鏈接、增加內鏈、增加外鏈等。

          ③ 設置tag聚合頁,生產更多內容

          這原本可以歸在第一點里,但為了讓大家看的更清晰,所以單獨列出來。

          對于已經有內容基礎的網站來說,設置tag頁無疑是增加頁面收錄最好的方式之一,因為tag頁面本身就是高質量頁面,容易被收錄,同時還能帶動標簽下的文章,增加文章頁的收錄量。

          ④ 提升權重

          高權重的網站所產生的內容更容易被百度收錄,這是不爭的事實,所以,想要增加百度收錄,提升權重便是手段之一。

          那么如何提高權重以達到增加收錄的目的呢,事實上前面提到的各種操作對網站權重的提升都有幫助,除此之外,還可以通過交換友情鏈接來提升。

          ⑤ 內鏈

          內鏈對應新網站和老網站同樣適用,但因為老網站本身有了內容基礎,所以如果能妥善操作的話,作用更明顯。

          為什么說內鏈建設能增加百度收錄呢,原因有三:一是內鏈可以提高目標頁面的權重;二是能夠為目標頁面提供鏈接入口;三是合理的內鏈能夠提高整站權重。

          如何操作內鏈,在網站內鏈怎么做一文中有詳細解說,大家不妨移步看看。

          ⑥ 利用百度工具

          比如提交sitemap,提交熊掌號等,這里不過多羅嗦。

          最后,以上就是如何快速增加百度收錄量的解決方法,從新網站和老網站兩個大的方面說了說如何增加百度收錄,其實很多方面都是相通的,都可以使用。

          文章來源:玩物派
          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務
           

          日歷

          鏈接

          個人資料

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

          存檔

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