<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設計分享達人

          好的用戶體驗是不會讓用戶注意到并毫無察覺的一種體驗。表面上看似非常簡單,但實際上設計師已經做出了非常多的設計思考。用戶越少的去思考界面,用戶就越能專注他們要完成的目標。在瀏覽頁面時,用戶的注意力不應該停留在界面和設計上,他們更應該關注的是如何達成他們的目的。所以作為設計師的首要工作就是通過事先清除障礙,為用戶提供直達目標的途徑。


          “通常,飛速行駛的貨車不可能輕松地停下來。因為運用更多的動能去改變運動狀態是非常困難的。與其強迫人們從他們的主任務上轉移注意力,不如直接帶他們去他們想去的地方?!?

          ——Luke Wroblewski,谷歌產品總監


          換個思路來看。復雜和混亂的界面會迫使用戶去尋找解決問題的方法,而通常情況下,這些方法并不是一目了然的。用戶會因為過多的選項、界面、導航等感到困惑,用戶可能會在思考過程中感到不知所措。即便是很短暫的停頓,也足以讓用戶離開。

          這種過度的思考就被稱為認知過載,在這篇文章里,我們將為你解釋如何避免認知過載。首先,我們需要明白我們大腦中存在過載風險的原因。

          Image title

          認知超負荷的科學根源
          認知過載是指工作記憶中腦力處理的信息總量過多。當你的工作記憶接收到的信息超出其可以輕松處理的信息時,就會發生認知過載,從而產生挫敗感。
          但這究竟意味著什么?工作記憶到底是什么?針對這些我們又應該怎樣進行設計呢?那就讓我們先來了解一下認知負荷理論的起源吧。


          JOHN SWELLER和認知負荷理論
          雖然對認知的研究可以追溯到幾個世紀,但直到20世紀80年代,澳大利亞教育心理學家約翰·瑞勒才將這項研究應用于教學設計當中。Sweller試圖為每一種類型的學習者找出最適合他們的學習方法,讓他們可以記住他們學到的所有知識。換句話說,怎樣的課程設計才是最佳的呢?
          Sweller在1988年出版了“ 認知負荷理論,學習難度和教學設計 ”,這使他的研究工作達到新的高峰,于1994年重新修改并重新發表。他的研究中運用了數據組織結構中的圖表數據庫,講述了有效和無效的教學方法,而他對于工作記憶負荷極限的研究結果才是設計師們找到的最有用內容。
          Sweller的研究在許多方面擴展了George Miller的信息加工理論。George Miller是一位認知心理學家和語言學家,他在20世紀50年代測試出短期記憶的極限。Miller的研究在于數字化設計,尤其是分塊技術方面,這將在后面討論。另外,Miller還創作了論文“ The Magical Number Seven, Plus orMinus Two“,這個理論促使許多設計師將菜單項的數量限制在5和9之間。
          雖然這些理論最初是針對教育領域的,但它們同樣適用于用戶體驗(UX)設計。


          工作記憶
          如果你每次打開冰箱,都必須回答一個像謎語一樣的問題,“什么東西小的時候四只腳走路,長大了以后兩只腳,而老了以后有三只腳?”這是一個老段子。但是,根據認知負荷理論,使用這種讓人無奈的用戶體驗設計會讓用戶產生挫敗感。

          Image title

          要理解認知負荷理論,你必須要了解什么是工作記憶,大腦在短時間內用于完成任務的過程便是工作記憶。工作記憶必須借助外部刺激和短期記憶,并在需要時從長期記憶中抽取。通俗一點說,工作記憶相當于計算機內存,而長期記憶則相當于硬盤驅動器。
          工作記憶和短期記憶通??梢曰Q使用,但它們略有不同。工作記憶是處理信息的過程,而短期記憶更像是一個信息的便簽本,它雖然重要,但卻沒有長期記憶重要。
          讓我們看看這篇文章是如何解釋這些差異的。在你閱讀的時候,你可能會遇到一個用藍色字體書寫的陌生概念。你的工作記憶需要知道藍色文本是什么意思,才能夠理解文章更深層的含義。你的長期記憶知道藍色文本表示鏈接,因此你的工作記憶知道點擊該鏈可以獲得更多信息。與此同時,你的短期記憶會記住你在文章中的位置,這樣當你從外部頁面返回時你不會迷失,但到了第二天早上,該位置就會被遺忘掉。

          Image title

          設計中的應用
          Steve Krug(史蒂夫·克魯格)是一位很有影響力的作家,他在網頁設計中極力推崇認知負荷理論。他的書《Don’t make me think》被許多設計師認為是有巨大影響力的著作。
          書中記錄了許多寶貴的經驗,下面就列舉一些的:
          1、每一個頁面都要清晰明了。
          2、用戶傾向于“滿意” - 也就是說,采取一個最簡單的解決方案來解決他們的問題,而不是最好的解決方案。此外,作為習慣的生物,用戶將一遍又一遍地使用相同的方法解決問題,而不會刻意尋找一個更好的選擇。
          3、當新用戶可以熟練使用該系統來實現他們的目標時,系統的可用性就足夠了。
          4、用戶使用網絡的絕大部分是想要節省時間。因此,用戶的行為通常會像鯊魚一樣“保持移動,否則就會死亡”。
          5、后退按鈕是Web瀏覽器最常用的功能。
          6、屏幕上顯示的主頁按鈕即使從來不被用戶使用,但也能讓用戶感到放心。
          總之,用戶在瀏覽網站過程中哪怕是一瞬間的思考,也會對他們的工作記憶造成負擔。例如 “這個可以點擊嗎?“首頁按鈕在哪兒?”和“我怎么保存?”等等問題,都會不同程度破壞用戶體驗。


          認知超負荷最常見的原因
          許多設計元素都有可能對用戶的大腦造成超負荷,外界環境中會有更多的因素它們超出了設計師的控制范圍。例如:一個用戶瀏覽網站的同時會擔心第二天的工作報告,或者被窗戶外裝修的噪音所打擾,此時,無論你的網站設計多么簡單,這些都會耗盡他們的工作記憶。
          我們要知道每個用戶的工作記憶能力都不同。隨性的用戶比那些對每一件小事都無比關注的用戶更能專注于你的網站。不經常上網的用戶往往比經驗豐富的網絡用戶思考的更多。
          雖然我們無法量化所有的認知過載,但我們可以盡量的去避免他的產生,下面,我們對網頁設計中最常見的類型以及避免它們的最佳方法進行了分類說明。
          1.不必要的操作
          用戶的每一步操作都會增加他們的認知負擔。過多不必要的操作會打斷用戶的思路或者會讓用戶抓狂。因為用戶的工作記憶都集中在完成特定的目標上,所以多余的操作將迫使用戶投入更多的精力,這樣就需要更多的工作記憶才能完成任務,所以,那些不必要的操作步驟很考驗用戶的耐心。
          速度和節奏是讓認知負荷最小化的基本因素。用戶希望以輕快,目的性很強的步驟來完成任務,所以應該提前消除一切延遲。
          Image title

          用戶希望在他們提交郵箱地址之前就知道他們將要進入什么網站,但Touch of Modern卻要求用戶在使用之前必須進行注冊!這個強制而又多余的行為將會嚇跑很多的潛在用戶。
          解決方案
          下面這個方法,可以幫助我們找到不必要的操作有哪些:列出用戶要完成任務必須要去做的步驟。例如發送電子郵件:
          1、點擊電子郵件圖標。
          2、點擊“發送到”輸入框。
          3、輸入電子郵件地址。
          4、點擊“主題”輸入框。
          5、等等....
          現在,重新審視列表并且找出可刪減的操作步驟,想到什么了嗎?你可以通過將光標一開始就自動定位在“發送到”字段就可以刪除步驟2.這將減少用戶的操作,雖然很微小,但你消除的每一步對于用戶來說都是友好的。

          Image title

          我們來看看谷歌的主頁。光標一開始就在搜索輸入框當中,因此用戶所要做的就是開始輸入文字。這些微小的交互提升了整體的用戶體驗,所以不要忽視它們。
          2.過度刺激
          雜亂無章的頁面會分散用戶的注意力,使用戶無法專注他們想要完成的目標。就像有好幾個人同時與你交談時你會很難集中注意力,當頁面上太多的圖片、動畫、圖標、廣告、文本類型和鮮艷的顏色奪取你的注意時,就會很難集中注意力。
          記住,每個人的工作記憶在完成目標的過程中,會因為外界的刺激對每一步工作重新排序。每一次分心,尤其是視覺上的強烈刺激,都需要消耗用戶的一部分注意力。

          Image title

          LINGsCARS就是個極端的例子,你可以看到有強烈對比的顏色和絢麗的動效沖擊著人們的感官。在屏幕上,即便在兩個不同位置同時進行的動效依然會對用戶造成過度刺激。
          解決方法
          首先,減少一切不必要的元素。僅保留必要的內容通常是最佳的選擇,減少加載時間并簡化體驗。用戶更喜歡視覺簡單的網站,而不是視覺上復雜的網站。
          你還可以進行內容區分以達到平衡的效果。太多相同的內容(比如文字或圖像)會讓用戶感到厭煩。所以,視覺內容要進行合理的組合,圖像、視頻、信息圖表等,能夠使頁面和諧,并便于用戶理解。
          影視網站IMDb本可以在很大程度上輕松地只依靠圖片進行排版,但它反而運用同量的文字內容來平衡網站頁面。

          Image title


          在抽取出一個頁面上必須要展示的元素之后,你應該采用一種讓用戶立即能夠理解的方式組織這些元素。對稱或者不對稱的信息布局顯示都可以很快的被用戶所理解,也就是說,用一種方式,盡可能的減少大腦的工作。這樣不僅對稱和不對稱都能讓眼睛感覺很舒適,而這樣的結構也能讓界面交互更容易。
          下面來看一下Groupon是如何布置頁面的吧。左中是文本類的垂直菜單,右中是一個有特色的凍酸奶交易文本描述,插在文本中間的照片和色塊的使用,分分鐘創造出一個讓人喜愛的沙漏結構。
          下面來看看Groupon是如何將它的垂直菜單(中間偏左)和描述凍酸奶的文字(中間偏右)進行布局的吧。大圖居中被文字包圍著,這樣就打造了一個舒適自然的沙漏形狀。

          Image title

          對稱不僅僅是在屏幕的兩側應用相同的布局,它是視覺重心和視覺方向的平衡。通過這種方式,非對稱頁面也能看起來很有組織性,如下圖的OTHR所示。

          Image title

          將你的頁面內容精減到只包含簡單的和非競爭性的元素,這只是完成了預防過度刺激工作的一半。。不要忘記要以簡單的布局呈現這些元素。
          3、太多選項(??硕桑?/strong>
          這有點自相矛盾:用戶需要更多的選擇,但是往往太多的選擇會使他們的大腦超負荷。


          席克定律(選擇困難癥)為我們揭示出了一種現象:用戶擁有的選擇越多,他們做出決定的時間就越長。


          作為設計師要去理解庫克定律,可以把每個選項看作是明亮的閃光燈,如下所示,太多的閃光燈會過度刺激用戶。

          Image title

          甚至像Rakuten這樣的知名網站也會犯類似的錯誤,因為他們沒有真正的理解這個設計原則。給用戶需要的而不是給他們認為他們需要的。
          解決方案
          假如你已經解決了不必要的和多余的選項,你可以將他們分別放入不同的組進行分類,你可以在百貨商店的網站上看到很多例子,這些網站擁有廣泛的產品選擇。
          它不一定是太多的選擇, 只是一次有太多的選擇。如果你可以用隱藏菜單,抽屜和拉出其中的一種方式隱藏一些選項,那么你將獲得兩全其美的效果,這些超級菜單雖然為用戶提供了許多選項,但一定程度上不會給用戶帶來很大的負擔。

          Image title

          但是,隱藏式的導航欄不利于發現,因此電子商務和新聞等行業的設計人員應該注意。你可以通過放置其他類似產品的鏈接使缺點最小化(比方說亞馬遜的“相關購買”)從而最大限度地減少隱藏菜單的缺點。或者你可以歸納導航菜單的類別,將它們精簡為單行導航(如Apple和CNN那樣)。

          Image title

          你還需要注意應該如何組織整個網站的導航。許多與庫克定律有關的問題可以通過管理信息架構(IA)來處理,我們將在下面的“難以查找的頁面和功能”部分中討論。
          4.太多內容
          就像過度刺激和選項過多的問題一樣,提供過多的內容會將用戶的工作記憶拉向不同的方向。
          顯然,你希望展現的只是重要的內容,但對于一些網站來說,一切都是重要的,如果你的網站也有非常多的內容,為了避免讓用戶產生困惑,應該對內容信息進行和里的組織規劃。

          Image title

          Arngren的問題并不是它展示了很多的產品,而是它同時展示了太多的產品。在組織結構上的調整將會給網站帶來更好的體驗。
          解決方案
          如上所述,George Miller的解決策略是“分塊”,將需要展示的大量內容以可管理的方式組合起來,以便于記憶,電話號碼分為國家代碼,區號,一組三位數和兩組四位數字便于記憶,而一連串的11個數字會很難被記住。
          你想在商店主頁上放大量產品的圖片嗎?比起將它們全部羅列出來,不如通過他們的類型將他們分組羅列。Etsy通過根據不同的店鋪將產品進行分組展示。

          Image title

          還有文本組塊,文本組塊包括簡短的自然段,合理利用標題和副標題以及足夠的留白。
          對于需要大量數據的長表單字段,可以嘗試采用多步驟表單。長表單可能會令人生畏,有時會導致用戶流失。你可以將表單的信息分在不同的頁面里,減少信息過量給用戶帶來的影響。記得一定要有一個進度標記來讓用戶知道還剩下多少頁。(可以總結為復雜的頁面簡單化)

          Image title

          購買機票總是涉及填寫大量的信息,其中沒有一項是多余的。Virgin Atlantic通過將其分解在多個單頁面上填寫來改善其繁瑣的體驗:選擇航班,填寫乘客信息,輸入付款詳細信息等。將所有這些信息放在一個長頁面上會對用戶造成負擔,也有可能會放棄購買。
          5.模棱兩可的界面
          認知超負荷的罪魁禍首先就是用戶界面混亂。永遠不要讓用戶花費大量的時間來弄清楚他們如何才能完成想要的目標,以及花費時間來弄清楚圖標的含義是什么。

          Image title

          并非所有用戶都是經驗豐富的,從而可以理解SpeedCrunch這種含義模糊的圖標。即使他們能夠識別代表Windows系統和Mac OS X系統的符號,那么位于右下角的那兩個圖標也會讓用戶迷茫。
          解決方案
          使用用戶已經熟知的視覺提示。用戶通常會用他所熟悉的符號來進行操作,即便是在以前從未使用過的網站上也是這樣。如果你覺得沒有新意,可以融合品牌特征巧妙的結合成為用戶所熟悉的形式。Home Depot雖然運用了較為普遍的圖標,但同時也賦予了他們品牌獨有的橙色。

          Image title

          標準標簽(如“聯系人”和“提交”)的按鈕比非傳統標簽(如“地址”或“開始”)更容易識別。通常已知的標簽可以提高用戶的瀏覽體驗,而不常見的標簽會讓用戶暫停以了解按鈕的功能。不要為了個性化而喪失了識別性。
          另外,你如果真的需要一個從未見過的圖標該怎么辦呢?如果這樣,可以運用現實生活中的場景展示來讓圖標進行自我解釋,這種做法是連接現實和虛擬的橋梁。例如:早期的互聯網先驅選擇了一個信封來代表電子郵件,因為信封是郵件系統的明顯標志。
          此外,要避免含義模糊的圖標,特別是可能還會被誤認為是其他含義的圖標,就像下列Issuu的圖標,有些是被人熟知的,但有一些卻不是。如果用戶必須通過點擊這個圖標來發現它的功能,這就會中斷他們的操作進程。

          Image title

          任何一個表意不清的圖標都應該附帶說明,告訴用戶怎樣操作。新的并且不常見的用戶界面,就需要更多的分步教程。例如,Slack就給出了一個完整的視頻引導來說明界面的操作流程。

          Image title

          6.難以查找的頁面和功能
          即使用戶已經擁有他們所需要的一切,但他們可能還是不知道如何去尋找它。這樣就會讓用戶費盡腦力去尋找他們所需要的。作為用戶體驗中不可或缺的元素,導航應該放在明顯的地方,給用戶信心去任意瀏覽網站而不會迷失。

          Image title

          如果你覺得漢堡包圖標不好,那可以在看看Mojo Yogurt,它會要求你將鼠標懸停在左上角的徽標上以顯示導航菜單。

          Image title

          雖然圍繞著Logo有個小的動效,但對于整個屏幕的顏色和動效來說,它并不夠明顯。
          解決方案
          根據用戶的偏好理順你的信息架構。你的目標用戶群可能并不認可你的做法。因此,要想他們學習如何組織網站,卡片分類試驗會告訴你你的用戶將會如何對頁面和話題進行分類。

          Image title

          如果你還希望通過組合頁面和菜單項來消除多余的頁面。設計工作室Waaark通過將其工作室的簡介,團隊成員簡介和聯系信息這三個頁面合并到一個頁面來簡化他們的導航。

          Image title

          如果某些功能或特征比其他功能或特征更重要,可以運用視覺手段來吸引他們的注意,增加大小,添加動畫以及使用對比色以此來吸引用戶的眼球。

          Image title

          PayPal期望有更多的老用戶而不是新用戶,并通過設置登錄按鈕與吸引注意力的白色塊背景來迎合前者。
          7.內部不一致
          假設網站的主頁使用標準的藍色和帶下劃線的文本來表示鏈接,但另一個頁面僅使用藍色而沒有下劃線。當用戶瀏覽其他頁面時就會停下來去想,“它沒有下劃線,這還是個鏈接么?”他們甚至可能不會再去關心鏈接,而會被其他頁面的不統一分散注意力從而影響整體的用戶體驗。
          要記住,最好的用戶體驗是不會被用戶所察覺的,而像上面這樣通常都會被注意到。
          總結
          1、認知過載是影響工作記憶的因素。當過多的信息阻礙決策和整體經驗時,就會發生認知過載。
          2、使用不同的內容類型和結構化頁面組合,可以避免視覺混亂。
          3、隱藏式菜單可以幫助用戶一次管理可用選項的數量,但降低了可發現性。
          4、“分塊”和“步驟”等的方式可以防止認知過載。
          5、UI元素和圖標應該基于用戶現有的認知上,這樣他們就不需要過多的思考,新的獨特的功能要加上解釋說明。
          6、圍繞用戶的實際思考方式構建你的信息架構。卡片分類等可用性測試可以為你的目標群體揭示最直觀的導航方案。
          7、視覺和功能的不一致,以及打字錯誤和語法錯誤,都會分散用戶的注意力。
          8、盡可能減少冗余。另外,請留意如何最大限度地減少用戶操作步驟量和他們必須花費的精力。


          文章來源:UI中國

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

          字面量方式和new方式的區別及用法

          seo達人

          一 - 字面量方式和new方式

          ?每次創建數組或對象的時候,都能用以下兩種方法創建:咦?有什么區別呢?還有哪些可以有這兩種方法呢?我到底用哪一種呢?



          var arr = [];//字面量方法創建數組

          var arr = new Array();//實例化構造函數方法創建數組



          var obj = {};//字面量方法創建對象

          var obj = new Object();//實例化構造函數方法創建對象



          二 - 哪些對象可以new?

          ?只要存在構造函數的都可以new出來。



          var num = new Number();

          var boo = new Boolean(); 

          var str = new String(); 

          var arr = new Array(); 

          var obj = new Object(); 

          var fn = new Function();

          var reg = new RegExp();

          var date = new Date();



          基本上來說 js中對象,除了null ,undefined,其他的都是可以用new出來的。



          三 - 字面量是什么?

          字面量表示如何表達這個值,一般除去表達式,給變量賦值時,等號右邊都可以認為是字面量。



          JavaScript支持字面量,允許使用一種簡潔而可讀的記法來創建對象、數組



          字面量分為:字符串字面量(string literal )、數組字面量(array literal)和對象字面量(object literal),另外還有函數字面量(function literal)等等。



          var num = 1;

          var boo = true;

          var str = "a";

          var arr = [];

          var obj = {};

          var fn = function(){};

          var reg = /\s/g;



          四 - 兩種的區別

          字面量語法簡單,直接,優雅

          也沒有必要去使用new去調用構造方法,減少代碼,減少代碼運算量。

          那new這個操作符到底做了什么?

          var arr = new Array();

          /

          new:

                 1:var obj = {};

                 2:obj.proto = Array.prototype;

                 3:Array.call(obj);

          /



          五 - 使用哪一種?

          字面量比new

          比如:{}是字面量,可以立即求值



          而new Object()本質上是方法(只不過這個方法是內置的)調用, 既然是方法調用,就涉及到在proto鏈中遍歷該方法,當找到該方法后,又會生產方法調用必須的堆棧信息,方法調用結束后,還要釋放該堆棧。

          ————————————————


          JS實現xml與json互轉且基本保持原樣

          seo達人



          如果非要代碼實現的話,github上一個不錯的js庫(X2JS):https://github.com/abdolence/x2js

          自己寫了demo測試了一下:



          <!DOCTYPE html>

          <html>

          <head>

          <meta charset="utf-8">

          <title></title>

          </head>

          <body>

          </body>

          <script src="js/xml2json.js" type="text/javascript" charset="utf-8"></script>

          <script type="text/javascript">

          var xmlText =

          '<mxGraphModel><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="2" value="" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1"><mxGeometry x="220" y="90" width="120" height="80" as="geometry"/></mxCell><mxCell id="3" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1"><mxGeometry x="410" y="110" width="80" height="80" as="geometry"/></mxCell></root></mxGraphModel>';

          console.log("原始數據xml:"+xmlText);

          var x2js = new X2JS();

          var jsonObj = x2js.xml_str2json( xmlText );

          console.log(jsonObj);

          var xmlAsStr = x2js.json2xml_str( jsonObj );

          console.log(xmlAsStr);

          </script>

          </html>

          效果如下:







          基本能還原,只是""變成了'',這個應該問題不大的。






          關于「撤銷」設計

          資深UI設計者

          關于「撤銷」有很多設計細節可以講,所以我花了兩周時間,將其濃縮成 3000 字,幫助各位產品設計師更好理解撤銷的設計細節。

          撤銷的目的是幫助用戶取消當前的操作行為。

          撤銷可以對用戶使用產品起到一種安全保障作用,讓用戶在界面中自由地探索而無需擔心操作所可能導致的嚴重后果。

          或者用戶刪除了一個視頻,撤銷可以幫助用戶恢復他所刪除的內容;以及用戶進行了一步操作,覺得不太好,就通過撤銷來回退到上一步操作。

          與之對應的叫「重做」,就是當用戶撤銷了當前的操作,但是想了想,還是行進到剛才已經操作的步驟好了。既給了用戶安全感,還給了用戶反悔的余地。

          類似于下象棋的時候,你覺得這一步走得不好,所以悔棋了,雖然對家沒說什么,但是你心里又覺得過意不去,畢竟落子無悔真君子,所以你又把棋子放回去了(真是不怎么恰當的比喻呢)。

          這樣做的目的是提升用戶使用產品的信心,增強對產品的控制感;鼓勵用戶放心地探索,快速建立起自己熟悉的操作路徑。

          所以關于撤銷,我們可以從下面幾點來聊聊:

          • 依次序撤銷
          • 選擇性撤銷
          • 撤銷在界面中的運用
          • 與撤銷沖突的元素

          依次序撤銷

          它的意思是,依次撤銷之前的操作。

          在尼爾森可用性原則里,就有一條類似的原則存在,即 User control and freedom(允許用戶自由操控)。

          很多人把這條原則解讀為「撤銷原則」,本質上是沒什么問題的,因為撤銷確實需要讓用戶自由操控。但是早期的撤銷,并不「自由」,而僅僅只是讓用戶在一定范圍內「可操控」。

          比如早期在一些產品里,執行多步操作,但往往只能撤銷一次,要想繼續撤銷是不被允許的,所以它的操控自由度就很低。那時候如果把這條原則解讀為「撤銷原則」,顯然是不合理的。

          于是,后來逐漸延伸出多次撤銷的功能。

          我記得最早使用 PS 的時候,在 PS 里面就有關于撤銷次數的范圍設定,但是我忘了具體范圍的上限與下限是多少了。

          使用的方式是,比如我設置參數為 10,那么之后我的撤銷也只能操作 10 次,要想繼續撤銷,就會告知無法繼續了。

          現在的很多工具產品應該是沒有這些限制了,比如 Sketch,Word 都是可以無限次撤銷直至最初始狀態或剛打開文件的狀態。

          相對早期撤銷的使用邏輯,后來可多次撤銷的操作在自由度上,確實是好了那么一些。

          它就是在「單次撤銷」的基礎上,給了用戶「多次撤銷」的機會,并讓用戶回到自己滿意的位置。

          但是這里的撤銷,它還不夠自由,因為它是「依次撤銷」—— 每一步撤銷用戶都得經歷。

          選擇性撤銷

          當撤銷隨著用戶場景的變化而進化之后,才真正具備了比較自由的操控方式。

          讓撤銷具備「選擇屬性」,必須與另一個元素做一個結合,那就是「歷史記錄」。

          繼續拿 PS 舉例。

          大家看到上面這張圖,當你在 PS 的畫板里完成了一系列操作之后,發現后面有一些東西做得不是很好,想回去重做,但是依次撤銷又覺得不好把控,于是就通過操作歷史,來選擇具體回退到哪一步。

          相比于依次序撤銷,選擇性撤銷的自由度更高,也更符合其對尼爾森可用性第三條原則的解讀。

          或者再通俗一點的例子,瀏覽器。

          假設這時候你打開了 5 個網頁,關掉了其中 3 個,但是突然想起第 1 個關掉的網頁還有值得收藏的內容,于是依次撤銷 3 次,才打開第 1 個關掉的頁面。

          而現在有網頁歷史記錄,就可以直接幫你打開之前關閉掉的所有網頁中的其中一個。

          解決了用戶每一步都要經歷的問題。

          當「撤銷」與「歷史記錄」結合之后,「選擇性撤銷」的出現還能解決掉「依次序撤銷」的一個關鍵問題:撤銷重做之后,無法復原。

          通俗點講,就是當用戶撤銷到之前的操作,進行了新的操作行為,那么原來舊的那條線路就被廢棄了??磮D:

          當用戶操作到第 5 步,然后撤銷至第 3 步,再執行一次新的操作,那么步驟 4 與步驟 5 就會被廢棄。

          大家知道很多設計師都會做版本記錄,因為 PS 的歷史記錄雖然在撤銷操作上方便了很多,但無法復原之前的操作邏輯依舊不能滿足一些設計師的訴求。

          畢竟不廢棄的話,撤銷操作的邏輯就會很復雜;且通?!高x擇性撤銷」伴隨解釋,說明用戶清楚知道自己當前行為會造成何種后果。但它并不能解決用戶操作過程中實際存在的這類問題。

          而「選擇性撤銷」的「版本記錄」可以解決這個問題,來看下面這個例子。

          結合歷史/版本記錄,比如用 Notion 或石墨寫了一篇文章,它們都會有版本記錄,過程中會根據時間維度與內容變更維度來判斷是否進行保存,那么當用戶想回滾到之前的那段內容,只要對這些版本進行點擊查看,然后選擇具體撤回到哪一步即可。

          比如我今天(2019.11.05)早上花了半小時最后對文章做了一次整理,添加了圖片,它就會記錄其中的操作變化,且可進行選擇。這里無論如何撤至哪一步,其它內容都會有留存,不會消失。

          也許這已經不是通常意義上的撤銷,但它確實是撤銷的升級版。

          這樣看起來是不是自由操控度要高很多呢?

          到這里,我只是講了「撤銷」的特性,下面來聊下它在界面設計中是如何應用的。

          撤銷在界面中的運用

          我們現在在很多產品里都能看到撤銷,在網頁里與移動 App 中,它的使用形式雖然多樣,但本質上并沒什么區別。

          大多就是單次撤銷,因為用不到多次撤銷,多次撤銷更多是在工具里被使用。

          比如油管的撤銷使用:

          當用戶對一個視頻進行「不感興趣」的操作時,視頻內容會變成右邊這樣,可撤銷。這個內容會一直存在直到用戶刷新頁面時才會消失。

          類似的還有淘寶網頁端的購物車,當刪除添加的任一商品后,其也會在附近位置出現可撤銷的操作。

          在網頁產品中,撤銷的運用大多是這樣的。

          我們再來看移動端產品對于撤銷的應用。

          在 iOS 中比較常見的是微信的搖一搖手機撤銷正在鍵入的內容:

          這類撤銷較為被動,經常是在無意間觸發,所以不是我們主要要聊的。

          而有一類產品,撤銷會以 Snackbars 的形式出現,如圖:

          當這類郵箱產品,刪除了某封郵件后,在底部就會出現這樣的提示,告知用戶可撤銷上一步行為。

          更多的還是工具類產品,比如修圖類產品 Snapseed:

          它有單次撤銷,也可以重做,還能多次撤銷,多次撤銷就是點擊「查看修改內容」之后,右圖出現的樣子,它會把所有步驟都呈現出來,給予用戶選擇具體撤銷至哪一步。

          其實更多的也就是這樣了,但是,為什么呢?為什么在非工具類產品里撤銷很少見呢?難道用戶從來不會誤操作或操作之后反悔?

          下面一節來解答。

          與撤銷沖突的元素

          先放結論:當某個功能具備撤銷屬性時,切勿再使用二次確認對話框,反之同樣成立。

          撤銷與二次確認,是兩種東西,雖然有時候解決的是同一個問題,但是它們的屬性是完全不同的。

          舉個例子:

          上面這張圖,左邊是在執行操作前彈出的確認框,右邊是執行操作后彈出的提示框。

          二者的區別很明顯,二次確認的刪除提示框更具警示效果,后者作為提示,較為弱化,且通常是在用戶操作完成后彈出。對于用戶來說,在非工具類產品中,前者更好的抑制了用戶的沖動行為或誤操作行為。后者作為提示類控件,不具備警示效果。

          所以它們不應該同時出現,且它們雖然是解決同一個問題,但是是完全不同的情況。

          于是,在大多數產品中我們很少看到撤銷的使用,因為大部分需嚴謹的操作都會有二次確認,并不嚴重的操作也就不需要任何提示。即使是上述提到的郵箱刪除,沒有二次確認也是因為它有撤銷作為提示且還有回收站允許用戶檢查確認。

          所以,除非是場景與之密切相關的,比如社交產品內容發送后的撤回功能。

          微信早期的撤回,只是撤銷,它并不具備「重做」屬性,現在撤回,內容會重新出現在輸入框讓用戶重新編輯。

          它們之間的差異是:它并不會產生嚴重后果,但確實會產生小問題。比如誤操作發出信息,或發出后發現話術并不嚴謹。

          所以這一段內容只是想告訴各位:二次確認操作與撤銷操作是兩種不同的東西,雖然看起來是解決同一個問題,但它們的差異也是非常明顯的。必須謹記。

          另外還有個提示:心細的同學會注意到文章里或其他產品里出現的「撤銷」通常也會寫成「撤消」。在別的領域里這是兩種不同的內容,但在產品設計領域里,目前并沒有對這兩者做明確的區分,所以暫時不用過于糾結。

          總結

          這篇文章講了很多內容,我在這里梳理下:

          • 撤銷分為依次序撤銷與選擇性撤銷;
          • 依次序撤銷有單次撤銷與多次撤銷,以 PS 為例;
          • 選擇性撤銷大多在工具類產品里被使用,它與歷史記錄結合,解決了依次序多次撤銷部分內容被覆蓋的問題;
          • 在非工具類產品里,被使用更多的是單次撤銷,是因為場景限制;
          • 撤銷與二次確認不可同時出現,它們看起來是解決同個問題,但之間存在較大差異。

          所以當你設計的產品要用到撤銷時,也要注意這些細節問題。

          這就是本篇文章的所有內容了。其實這篇文章里包含的內容有很多,而且有很多爭議點我都沒放出來,直接一筆帶過給出正確結論了。寫這種大部頭文章太累,要思考的點很多,需要幫助讀者從多視角排雷,很可能導致初學者在讀文章過程中出現閱讀吃力的問題。所以之后還是會挑一個點來寫吧。

          文章來源:優設

          DataGridView(VS中表格)刪除和刷新

          seo達人

          功能描述:右擊表格中對應的行,進行刪除或者刷新的操作。

          先往DataGridView上拖一個ContextMenuStrip控件





          在下面分別輸入刪除與刷新





          雙擊刪除,輸入代碼:



            private void 刪除ToolStripMenuItem_Click_1(object sender, EventArgs e)

                  {

                      try

                      {

                          DialogResult dr = MessageBox.Show("確定刪除嗎?", "提示", MessageBoxButtons.OKCancel);

                          if (dr == DialogResult.OK)

                          {

                              //獲取選中行的數據

                              Facade.FoodMenuCateFa?ade fa?ade = new Facade.FoodMenuCateFa?ade();

                              Entity.T_FoodMenuCate t_Food = new Entity.T_FoodMenuCate();

                              t_Food.CateName = dataFood.CurrentRow.Cells[1].Value.ToString();

                              int list1 = fa?ade.DeleteFoodMenu(t_Food);



                              frmTips f = frmTips.GetInstance("刪除完成");

                              f.Show();

                          }



                      }

                      catch (Exception ex)

                      {

                          MessageBox.Show(ex.Message);

                      }

                  }



          雙擊刷新,輸入代碼:

                  private void 刷新ToolStripMenuItem_Click(object sender, EventArgs e)

                  {//通過走七層查詢出數據庫中新的內容:

                      Facade.FoodMenuCateFa?ade fa?ade = new Facade.FoodMenuCateFa?ade();

                      Entity.T_FoodMenuCate t_Food = new Entity.T_FoodMenuCate();

                      List<Entity.T_FoodMenuCate> list = fa?ade.SelectFoodMenu(t_Food);

                      //把值賦給表格

                      dataFood.DataSource = list;

                  }


          關于異常狀態的設計總結

          資深UI設計者

          本文對幾種常見的異常狀態進行設計總結,其中介紹了不同異常狀態的表現形式以及我們應展現的設計狀態與規范。

          異常狀態多在特殊場景下出現,比如服務器異常、網絡異常等,因為異常狀態出現的概率是較低的,所以異常狀態也常常會被忽略,等到實際碰到的時候才會意識到原來還有這種狀態……

          作為交互設計師,在完成主流程設計后,也應該考慮到異常場景。

          從全局性出發,我們可以預先考慮到產品將會碰到的異常狀態,針對不同的異常狀態制定相應的設計規范,在后續的設計需求中直接復用即可。

          下面對幾種常見的異常狀態進行設計總結。

          一、網絡異常

          1. 原因

          網絡異常的原因主要有以下兩種原因:

          (1)網絡連接權限

          針對某App的網絡連接權限可以通過手機進行設置,可設置為關閉應用使用數據,或者只允許應用在WLAN下使用,或者允許應用在WLAN與蜂窩網絡下均可使用。

          所以以下均屬于網絡異常的情況:

          • 關閉應用使用數據,在流量或WI-FI環境下打開App
          • 只允許應用在WI-FI下使用,但在流量環境下打開App

          (2)網絡連接狀況

          在斷網(打開飛行模式)、弱網(手機信號差)的情況下, 也無法正常獲取數據。

          2. 處理方式

          當網絡異常時,用戶點擊進入新頁面或在當前頁進行操作時,App會通過異常狀態缺省頁或交互反饋來告知用戶當前異常狀態和解決方案。主要分為兩種情況:

          (1)當用戶操作進入App新的頁面時,常以缺省頁的形式提醒用戶當前網絡異常。當應用檢測到有可用網絡時,缺省頁將自動刷新頁面內容。

          比如網易云音樂在無網絡連接下,進入新頁面時,缺省頁以簡單的文案告知無網絡的基礎原因,通過查看詳情來告知用戶解決方案以及引導如何解決問題。

          美團、騰訊視頻等,引導用戶檢查網絡權限設置和稍后再嘗試刷新頁面,稍后再試是因為弱網環境是暫時的,比如在地鐵上高鐵上或者某處手機信號接收較差的地方。

          (2)當用戶點擊操作當前頁面時,比如上拉加載頁面、下拉刷新頁面,點贊、關注等操作時,常以toast或對話框的形式提示用戶。

          比如網易云音樂,網絡異常情況下下拉刷新或上拉加載頁面均進行對話框提示,并引導用戶檢查網絡權限設置。

          美團外賣,無網絡連接環境下,在我的訂單頁面進行評價操作,會進行toast提示。

          二、流量警告

          前面說完網絡異常的設計規范,接下來就不得不提到流量警告的場景。

          對于需要消耗大量流量的應用:

          (1)在流量環境下進行需要消耗大流量的操作,比如播放/下載音視頻等,頁面會進行流量警告。比如網易云音樂在流量環境下打開MV。

          (2)在WI-FI環境下切換到流量環境時通常應用會主動暫停進程并進行流量警告,并在頁面上告知用戶原因,讓用戶選擇是否繼續進程。

          比如網易云音樂、愛奇藝、芒果TV、BiliBili等音視頻娛樂App,在以上2種場景下,在視頻畫布上進行告知讓用自己選擇是否繼續播放,同時也提供按鈕入口讓用戶辦理業務可免流量進行播放。其中,芒果TV和BiliBili的繼續播放按鈕還貼心地告知了用戶將要消耗的流量值。

          對以上兩種場景的處理方式進行歸納,均為流量警告方式。

          三、網絡異常和流量警告適用場景快速查詢

          總結完網絡異常和流量警告的設計規范,我們知道其中影響因素包含:網絡連接權限、網絡連接狀況以及網絡環境的變化,下面做一個小總結,以便快速查詢。

          在總結之前強調一下,網絡權限設置是針對某App,連接Wi-Fi和流量是針對手機(所有應用)。以iOS為例,設置截圖如下:

          情況一:當前網絡環境不變化

          情況二:當前網絡環境發生變化

          針對以上情況,表現狀態為“網絡異常”,則參照網絡異常的設計規范;表現狀態為“流量警告”,則參照流量警告的設計規范。

          四、服務器異常

          服務器出錯的情況是較少出現的,若出現服務器異常,其異常的時間也較為短暫。

          一般不提示具體原因,處理方式為進入新頁面的話則以缺省頁(文案或是文案+插畫)的形式進行提示+重試按鈕,例如,進入小米金融貸頁面時服務器出現異常,缺省頁提示錯誤原因同時提供重試按鈕。

          點擊操作的話則以toast或對話框的形式進行提示并重試,比如下圖的段友app,服務器出錯,刷新頁面后進行toast提示;前段時間超級火的zao應用,朋友圈火爆傳播,一度造成服務器訪問過載,制作視頻的時候應用給出了對話框提示。

          五、加載失敗

          1. 原因

          在數據加載過程中,導致異常的原因可能是:
          1、網絡異常導致加載失敗

          2、服務器請求數據失敗導致加載失敗

          2. 處理方式

          1、如果是因為網絡異常導致加載失敗,處理方式參照網絡異常的設計規范。

          2、如果是服務器請求數據失敗,處理方式參照服務器異常的設計規范。

          六、空狀態

          1. 原因

          空狀態就是指頁面當前無內容,主要在以下場景下會出現空狀態的情況:

          1. 無權限,某些界面和功能會針對不同的角色設定不同的使用權限,無權限訪問的頁面會出現空狀態的情況
          2. 搜索無結果,搜索無相應結果會進行空狀態提示
          3. 初始內容為空,例如無瀏覽記錄、無收藏、無購買記錄、無訂單記錄、無下載記錄等
          4. 內容被刪,若內容允許被清空,內容清空后會回到初始前的空狀態

          2. 處理方式

          當前頁面為空一般會提示用戶當前頁面為空狀態,同時也可能會做適當的引導。

          針對空狀態的場景,主要采取以下幾種設計原則:

          (1)用戶無權限

          一般在B端產品中會碰到這種場景,通常來說,若用戶無權限訪問某功能模塊的話,處理方式一般是將該功能模塊對用戶進行隱藏。

          若有其他原因不能隱藏對應功能模塊,處理方式為缺省頁面(文案或是文案+插畫),但文案要足夠明確,告知無權限的用戶該如何處理才能訪問,一般是聯系管理員添加權限。

          (2)搜索無結果
          搜索無結果的處理方式一般有兩種處理方式,一種是缺省頁面(文案或是文案+插畫),另一種是在第一種的基礎上加上相關推薦。具體用哪一種根據設計目標來決定。

          比如網易云音樂搜索音樂無結果直接用文案告知。豆瓣搜索書影單無結果以插畫+文案的形式展示結果。美團搜索不到相應的內容,應用直接推薦其他商家刺激用戶購買。

          另外也有應用會添加一些引導操作收集用戶數據來優化搜索,比如微信讀書找不到相關的數據,在頁面的底部提供一個入口讓用戶填寫書籍名稱和作者,基于用戶的反饋數據,微信讀書在后續書城書目的收錄工作中,就可以優先收錄用戶搜索率較高的書籍了,在優化搜索的同時也提供了用戶反饋訴求的入口。

          (3)初始內容為空

          需要用戶進行操作產生內容的頁面,初始狀態一般為空,和搜索無結果的處理方式類似,有2種處理方式,一種是缺省頁面(文案或是文案+插畫),另一種是在第一種的基礎上加上快捷入口或推薦內容,其目的都是在于引導用戶進行操作從而產生數據。具體用哪一種還是根據設計目標來決定。

          直接用缺省頁面告知方式上,例如網易云音樂,個人未發布相關動態,該動態頁面直接用簡短的文案告知用戶暫無相關動態。

          提供快捷入口上,比如微信讀書,用戶未加入書籍到書架時,進入書架頁面,會有一句話文案引起用戶共鳴,另外附上找書按鈕方便用戶快捷進入書城進行找書。

          如果通過用戶瀏覽記錄和搜索行為等能夠分析出用戶的興趣愛好,進行精準推送,那在空狀態頁面進行推薦引導也不乏是一種很好的嘗試。比如網易云音樂、騰訊視頻和美團均有采取該方式。

          網易云音樂里頭我從未購買或領取過數字專輯,該頁面也是無數據的,網易云音樂在頁面底部進行了數據專輯的推薦,具體的推薦算法不太清楚,我覺得可以是銷售量較大的專輯,或者根據我個人的搜索和瀏覽記錄進行相關推薦,最后通過埋點數據分析通過推薦引導購買是否提高了專輯購買率。

          (4)內容被刪除

          頁面內容被刪除區分場景說明。

          第一種是需要用戶操作產生內容的頁面,用戶也可以通過刪除將頁面內容清空。

          對于該場景,當頁面內容被用戶清空后,頁面內容為空,處理方式和初始狀態為空類似,以缺省頁(文案或是文案+插畫)的形式告知或在此基礎上加上快捷入口或用戶推薦。

          比如清空網易云音樂中我的下載列表所有單曲、清空騰訊視頻我的緩存視頻,清空微信讀書的書架,清空后的狀態和初始狀態是一致的。

          另一種場景是的頁面入口依然存在,但二級頁面內容已經被刪除了,二級空頁面的設計處理方式是以缺省頁(文案或是文案+插畫)的形式告知,文案信息告知用戶內容已被刪除。

          例如某微信訂閱號的文章發布記錄中的某篇文章已經被刪除,點擊進入二級頁面后的提示如下:

          七、功能重建

          功能已上線,后期進行產品升級或迭代功能正在開發中,功能入口沒有進行關閉還是允許用戶訪問,通常會在用戶進入該頁面之后進行對話對話框提示,告知原因。

          總結

          以上對幾種常見異常狀態的設計規范進行了總結,相對正常狀態,異常狀態較為少見,容易忽略,大家可以參照以上規范進行異常狀態設計和優化調整。后面碰到其他異常狀態,我會繼續補充。

          文章來源:人人都是產品經理

          前端解決跨域問題的常用方法

          seo達人

          首先,跨域是什么?



          只要協議、域名、端口有任何一個不同,都被當作是不同的域。為什么三者任何一個不同就會產生跨域呢,想想也很容易知道,要是很隨便引用什么外部文件,不同標簽下的頁面引用類似的彼此的文件,瀏覽器很容易懵逼的,保障不了安全問題,但在安全限制的同時也給注入iframe或是ajax請求上帶來了不少麻煩。所以我們要通過一些方法使本域的js能夠操作其他域的頁面對象或者使其他域的js能操作本域的頁面對象



          但有兩點至少要清楚:



          如果是協議和端口造成的跨域問題“前臺”是無能為力的;

          在跨域問題上,域僅僅是通過“URL的首部”來識別而不會去嘗試判斷相同的ip地址對應著兩個域或兩個域是否在同一個ip上。

          (“URL的首部”指window.location.protocol +window.location.host,也可以理解為“Domains, protocols and ports must match”。)

          1.通過HTML5的postMessage方法跨域



          頁面M通過postMessage方法發送消息如下:



          window.onload = function() {  

              var iframe_dom = document.getElementById('iframId');  

              var targetOrigin = ";

              iframe_dom.contentWindow.postMessage('hello world!', targetOrigin);  

          };

          備注:



          postMessage的使用方法:



          originwindow.postMessage(message, targetOrigin);



          originwindow:是說的目標窗口,即要給某個window發消息,是 window.frames 屬性的成員或者由 window.open 方法創建的窗口

          message: 是要發送的消息,類型為 String、Object (但IE8、9 不支持)

          targetOrigin: 是限定消息接收范圍,不限制請使用 '*

          頁面N通過message事件監聽并接受消息如下:



          let onmessage = function (event) {  

            var data = event.data;//由發送窗口傳過來的消息內容  

            var origin = event.origin;//由發送窗口傳過來的消息來源地址  

            var source = event.source;//源Window對象  

            if(origin=="
          ;

              console.log(data);//hello world!  

            }  

          };  

          if (typeof window.addEventListener != 'undefined') {  

            window.addEventListener('message', onmessage, false);  

          } else if (typeof window.attachEvent != 'undefined') {  

            //for ie  

            window.attachEvent('onmessage', onmessage);  

          }

          或者為了防止接入方的命名沖突,也可以約定事件名,以此加以區分



          例如



          window.addEventListener("message", function(event) {

            if (

              event &&

              typeof event.data == "object" &&

              event.data.event == "FUNCTION_NAME"

          ){

          document.getElementById("val").innerHTML = event.data.value;

          } });

          2.通過JSONP



          上面那種方式的通信是雙向的,頁面與iframe或是頁面與頁面之間的



          JSONP主要是封裝好的請求方式添加callback,這個callback是由前后端約定好的



          它的優劣勢:



          JSONP的優點:它不像XMLHttpRequest對象實現的Ajax請求那樣受到同源策略的限制;它的兼容性更好,在更加古老的瀏覽器中都可以運行,不需要XMLHttpRequest或ActiveX的支持;并且在請求完畢后可以通過調用callback的方式回傳結果。

          JSONP的缺點:它只支持GET請求而不支持POST等其它類型的HTTP請求;它只支持跨域HTTP請求這種情況,不能解決不同域的兩個頁面之間如何進行JavaScript調用的問題;無法判斷它是否請求成功,只能通過timeout

          3.CORS跨域



          實現CORS通信的關鍵是服務器端,只要服務端那邊實現了CORS接口,就可以跨源通信



          CORS(Cross-Origin Resource Sharing)跨域資源共享,定義了必須在訪問跨域資源時,瀏覽器與服務器應該如何溝通。CORS背后的基本思想就是使用自定義的HTTP頭部讓瀏覽器與服務器進行溝通,從而決定請求或響應是應該成功還是失敗。目前,所有瀏覽器都支持該功能,IE瀏覽器不能低于IE10。整個CORS通信過程,都是瀏覽器自動完成,不需要用戶參與。對于開發者來說,CORS通信與同源的AJAX通信沒有差別,代碼完全一樣。瀏覽器一旦發現AJAX請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感覺



          服務器端對于CORS的支持,主要就是通過設置Access-Control-Allow-Origin來進行的。如果瀏覽器檢測到相應的設置,便可以允許Ajax進行跨域的訪問



           



          CORS和JSONP對比



          JSONP只能實現GET請求,而CORS支持所有類型的HTTP請求。



          使用CORS,開發者可以使用普通的XMLHttpRequest發起請求和獲得數據,比起JSONP有更好的錯誤處理。



          JSONP主要被老的瀏覽器支持,它們往往不支持CORS,而絕大多數現代瀏覽器都已經支持了CORS)。



          CORS與JSONP相比,顯然更為先進、方便和可靠。



          4.設置代理



          目前市場上用vue技術不在少數,下面介紹一種配置代理方式



          在vue.config.js該文件里面配置如下:



           devServer: {

                  port: 8001,

                  open: true,

                  disableHostCheck: true,

                  proxy: {

                      '/api': {

                          target: 'https:/xxx.com',

                          secure: true, // false為http訪問,true為https訪問

                          ws: true,

                          changeOrigin: true,

                          pathRewrite: {

                              '^/api': ''

                          }

                       }

                  }

           }

           



          后面請求是需要帶上‘/api’請求即可


          如何才能更加靈活的使用網格?

          資深UI設計者

          本篇文章立足于網格系統的基礎上,以網格使用邏輯詳細的介紹了在實際的應用中應該如何才能把劃分的網格當做工具使用。

          文章來源:站酷

          ES6的解構賦值的用途總結

          seo達人

          二 - ES6的解構賦值的用途總結

          2 - 什么是ES6解構

          在ES6中添加了一個新屬性:解構,允許你使用類似數組或對象字面量的語法將數組和對象的屬性賦給各種變量。解構是一種打破數據結構,將其拆分為更小部分的過程,允許我們將右邊的表達式看起來也像變量聲明一般,然后在左邊將值一一提取。 解構這種賦值語法較為簡潔,比傳統的屬性訪問更為清晰。

          還不了解什么是解構賦值的,請參考:https://blog.csdn.net/azxqwe123/article/details/103296603

          下面只講怎么應用:



          2.1 - ES6解構賦值7種場景案例—用途

          (1)交換變量的值



          [x, y] = [y, x];

          上面代碼交換變量x和y的值,這樣的寫法不僅簡潔,而且易讀,語義非常清晰。



          (2)從函數返回多個值



          函數只能返回一個值,如果要返回多個值,只能將它們放在數組或對象里返回。有了解構賦值,取出這些值就非常方便。



          // 返回一個數組



          function example() {

            return [1, 2, 3];

          }

          var [a, b, c] = example();



          // 返回一個對象



          function example() {

            return {

              foo: 1,

              bar: 2

            };

          }

          var { foo, bar } = example();



          (3)函數參數的定義



          解構賦值可以方便地將一組參數與變量名對應起來。



          // 參數是一組有次序的值

          function f([x, y, z]) { ... }

          f([1, 2, 3]);



          // 參數是一組無次序的值

          function f({x, y, z}) { ... }

          f({z: 3, y: 2, x: 1});



          (4)提取JSON數據



          解構賦值對提取JSON對象中的數據,尤其有用。



          var jsonData = {

            id: 42,

            status: "OK",

            data: [867, 5309]

          };



          let { id, status, data: number } = jsonData;



          console.log(id, status, number);

          // 42, "OK", [867, 5309]

          上面代碼可以快速提取JSON數據的值。



          (5)函數參數的默認值



          jQuery.ajax = function (url, {

            async = true,

            beforeSend = function () {},

            cache = true,

            complete = function () {},

            crossDomain = false,

            global = true,

            // ... more config

          }) {

            // ... do stuff

          };





          指定參數的默認值,就避免了在函數體內部再寫var foo = config.foo || ‘default foo’;這樣的語句。



          (6)遍歷Map結構



          任何部署了Iterator接口的對象,都可以用for…of循環遍歷。Map結構原生支持Iterator接口,配合變量的解構賦值,獲取鍵名和鍵值就非常方便。



          var map = new Map();

          map.set('first', 'hello');

          map.set('second', 'world');



          for (let [key, value] of map) {

            console.log(key + " is " + value);

          }

          // first is hello

          // second is world

          如果只想獲取鍵名,或者只想獲取鍵值,可以寫成下面這樣。



          // 獲取鍵名

          for (let [key] of map) {

            // ...

          }



          // 獲取鍵值

          for (let [,value] of map) {

            // ...

          }



          (7)輸入模塊的指定方法



          加載模塊時,往往需要指定輸入那些方法。解構賦值使得輸入語句非常清晰。



          const { SourceMapConsumer, SourceNode } = require("source-map");


          設計師必備的場景化思維

          資深UI設計者

          本文從什么是場景化、場景化設計的案例、為什么要基于場景化做設計和如何進行場景化設計 4 個方面為你完整梳理場景化設計思維的知識點。

          什么是場景化設計

          「場景」在百度百科里的定義是:戲劇、電影中的場面,泛指情景。情景又指:

          • 感情與景色
          • 情形、景象
          • 環境:假設是在這個情景。

          在戲劇或影視劇里,場景由人物,時空,事件(行為),環境(社會環境和自然環境)等要素構成。

          互聯網中的「場景」我把它分為兩類,一類是為了實現用戶目標而產生的場景,這種類型的場景需要明確用戶目標,可能并不需要涵蓋用戶是怎么實現目標的。這類場景指根據用戶的精準需求,為其提供精準服務,用明確的差異化服務給用戶提供一個使用產品的動機。比如微博和微信,微信定位是熟人社交,微博則是陌生人社交。另一類是更加精細化的場景,這類場景需要明確用戶操作流程。本文主要針對第二類場景展開。

          場景化設計指基于對場景的分析,得出用戶痛點與需求,結合前后場景預判用戶目標,通過設計提高用戶效率,給予用戶驚喜與感動。

          場景要素包括:4W+1H,即Who人、When時間、Where地點、What事件 、How環境,什么人,在什么時候,在什么地方,做了什么事情,所處的環境如何。其中 Where 又包括線上地點和線下地點,線下指現實中的定位,可以通過手機信號塔數據(GPS),Wifi 連接等獲?。痪€上指用戶所處的具體頁面。

          如:用戶(who)早上上班(when)在地鐵上(where)看電子書(what),地鐵上人多嘈雜且操作不方便(how)。再比如用戶(who)中午(when)在辦公室里(where)點外賣(what),肚子很餓還不知道吃什么(how)。五要素就像口訣,幫助我們全面快速地描述場景。

          有哪些場景化設計的例子

          為幫助大家更好的理解場景化設計,這里基于上面提到的場景五要素舉一些例子。

          人是變量:用戶不同,看到的信息不同。隨著大數據和智能推薦技術的普及,越來越多的產品通過挖掘不同用戶的喜好,生成用戶畫像,為每位用戶提供「千人千面」的個性化內容。這樣的產品大家都很熟悉,比如抖音,淘寶,微博,今日頭條。

          時間是變量:時間不同,看到的信息不同。比如小米 MIUI11 的效率革新功能「智能出行」,當在出行類 app 上定好行程后,MIUI11 就會自動將該行程記錄在負一屏顯示并同步日歷,同時會根據出行的時間點,在通知欄實時更新提示:

          再比如在 Google Maps 的 app 里開啟導航時,如果目的地在預計到達時間還沒有開門,或者快要/已經關門了的話,會有個彈窗提醒。

          還有螞蟻森林的頁面會根據用戶打開的時間進行變化(白天與夜晚模式)等等,這些都是充分考慮了場景中時間這一變量,才有如此暖心的設計。

          地點是變量:同一個用戶,在不同地點看到的信息不同。比如,大眾點評APP當用戶從常住地北京(where)定位成非常住地杭州(where)時,根據用戶的上個場景與當前場景預測用戶可能處于旅游狀態,從而預測用戶下一步的目標是在杭州「吃喝玩樂」,所以首頁和攻略頁的內容都發生了變化,為用戶推薦旅行地的「吃喝玩樂」。

          環境是變量:不同環境看到的信息不同,比如設備環境發生變化時:iOS13 中的備忘錄頁面,將「添加」按鈕移到了右下角。為什么?因為手機屏幕越來越大,把按鈕從右上角移到右下角,更有利于用戶單手操作。

          再比如:我們在駕駛環境下,要保持注意力集中,避免或減少分心駕駛導致的交通事故,所以基于駕駛環境,iOS11 上線了駕駛模式功能。當 iphone 與車內的 USB 或藍牙連接,或 iphone 感知到人的移動速度時,iphone 就會自動進入駕駛模式,在該模式下,任何人發短信,我們都不會收到提示,對方會收到「我正在駕駛,稍后回復您」的自動回復。同時,iphone 會追加一條短信,提示對方只要回復「緊急」關鍵詞,我們就能立刻接收到他們的消息提示。

          為什么要基于場景做設計?

          通過上面的舉例想必大家已經了解到了基于場景做設計的好處。由于與用戶的空間相隔,設計師無法感知用戶在真實場景中使用產品的具體情況。通過場景化設計的方法,對用戶使用場景進行分析與預期,可以幫助設計師找到用戶與場景的內在聯系,探索新的功能及交互方式。

          怎么進行場景化設計

          可以概括為以下四步。

          1. 根據用戶使用流程和行為路徑窮盡場景

          根據用戶的使用流程和行為路徑列舉場景,這里以乘坐飛機(手機購票)為例,列舉乘坐飛機涉及到的關鍵場景:

          • 乘客(who)在航旅縱橫頁面(where)購票(what),航班多查找起來麻煩(how)。
          • 乘客(who)起大早拖著疲憊的身體(how)在去往機場的路上(where),又遇到早高峰堵車,內心焦躁煩悶(how)。
          • 起飛前(when)乘客(who)在機場(where)過安檢(what),安檢流程復雜,又檢測出不符合登機規定的物品,讓人心煩,手忙腳亂(how)。
          • 起飛前(when),乘客(who)在候機口(where)候機(what),人多嘈雜,沒有座位,還背著繁重的行李,還要時刻關注航班信息(how)。
          • 起飛前40分鐘(when),乘客(who)背著行李排著隊(how),將登機牌(紙質/電子)和身份證出示給工作人員(what),工作人員(who)站在入口處(where)開始檢查每位乘客的登機牌和身份證(what)。
          • 檢完票后(when),乘客(who)拿著身份證和登機牌,背著行李(how)乘坐擺渡車(what),擺渡車上嘈雜、擁擠(how)。
          • 下擺渡車后(when),乘客拿出登機牌,背著行李(how)排隊檢票登機(what),工作人員(who)站在飛機前(where)開始檢查每位乘客的登機牌(what)。
          • 在起飛前30分鐘(when),乘客(who)登機(what),背著行李在狹窄擁擠的通道里(how)尋找自己的座位(what)。找到座位后,將沉重的行李艱難的(how)放到上方的置物架上(what)。放好行李后,坐到自己的座位上(what),系好安全帶(what),調節座椅靠背(what),等待飛機起飛(what)。
          • 飛行過程中(when),氣流導致飛機顛簸,乘客感到恐慌不適(how)。飛行過程中,乘客通過看電影,看書,睡覺打發時間(what)。
          • 到達目的地(when),乘客(who)從高處置物架上(how)取下行李(what),拿著沉重的行李(how)排隊下飛機(what)。此時乘客對目的地的天氣等其他情況都不清楚。
          • 乘客走出飛機到達航站樓后,在陌生的機場(where),跟著標牌指示艱難的找到自己的行李(what)。拿著行李跟著指示牌(how)困難的找出口(what)。

          通過對關鍵場景的詳細描述,我們將摸不著的用戶場景像過電影一樣在眼前一一呈現,有利于我們發現很多想不到或者通過調研得不到的細節,幫助我們發現用戶真正的痛點與需求,洞察設計機會點。

          2. 根據場景挖掘機會點

          完成了第一步的場景列舉,我們對流程中涉及的場景有了深刻的了解。下一步就是對場景的判斷與分析,挖掘機會點。機會點挖掘有兩個方向,一是通過分析當前場景存在的痛點和需求挖掘機會點,二是通過對用戶下一步目標的預判尋找機會點。

          通過分析當前場景存在的痛點和需求挖掘機會點

          支付寶「朋友」界面,當用戶輸入某數值時,輸入框上方會自動顯示「給對方轉賬***元」按鈕,用戶可點擊該按鈕完成轉賬。這是因為經常有用戶誤以為輸入數值發送即完成了轉賬,導致很多尷尬的狀況出現?;谠搱鼍跋碌耐袋c與需求,支付寶做了這個改進,貼心又好用。

          iOS 系統在切換 APP 操作時,會將一些金融類 APP 虛化,以此來保證用戶信息安全。這一設計細節也是充分考慮了用戶在切換 APP 時的場景,解除了用戶在公告場合擔心被窺屏而泄露個人財富信息的擔憂。

          還有,當我們用耳機聽音樂或播放視頻時,拔下耳機,聲音就會自動停掉,這樣就算在安靜的場合聽音樂或者看視頻,耳機不小心掉下來也不會發出尷尬的聲音,這些都是充分考慮了用戶當前使用時的場景,才做出如此貼心的設計。

          通過對用戶下一步目標的預判尋找機會點

          第二個方法是通過對用戶當前場景的分析,預判用戶下一步的行為與目標,從而尋找當前場景的機會點。

          如何預期用戶下一步目標?有三個方法:

          • 通過成組動作進行預期,如復制→粘貼,編輯→保存。
          • 通過用戶認知流程預判,如,瀏覽時反向滑動→結束瀏覽/回到頂部;再比如谷歌翻譯在發音時,第一遍是正常語速,第二遍語速變慢,第三遍又恢復到常速。是不是很貼心,很符合用戶期望?
          • 通過產品使用流程進行預期,如訂外賣→取外賣→評價。

          在谷歌瀏覽器,當我們打開多個瀏覽窗口時,通常需要手動一個個地關閉標簽頁。chrome 充分考慮到了用戶的使用場景,當用戶關閉一個標簽頁時,預期用戶會關閉下一個標簽頁,所以當關閉一個標簽時,相鄰標簽會自動靠近,保證關閉的按鈕始終位于鼠標的當前位置,這樣用戶就不用移動鼠標關閉下一個標簽頁,提高了用戶的使用效率。

          3. 機會點轉化為落地的設計方案

          在將機會點轉化為具體的設計時,有兩個可作為依據的設計原則,分別為,情感化。

          實現有以下幾個方法:

          行動點前置

          通過對用戶下一目標的預測,將用戶目標在當前場景展示,縮短操作流程,達到的目標。如淘寶首頁的 tab 欄會根據每個用戶的瀏覽記錄預測用戶目標,千人千面個性化展現,縮短了用戶查找商品的路徑,提高商品購買效率。

          行動點置換

          還是拿淘寶舉例,淘寶底部的第一個導航,當用戶滑動首頁下方的商品流時,該按鈕由首頁變成置頂。

          行動點相關提示

          意思是根據用戶當前目標或下一步目標進行相關的提示。如支付寶朋友頁面,當上滑時,會出現「找人轉賬」的提示,點擊進入朋友列表的純凈模式(去掉了服務通知等跟轉賬無用的列表),提高了用戶尋找的效率。

          再比如,網易郵箱,當郵件中提到附件,但是沒有上傳附件時,點擊發送后,系統彈出下方的提示,解決了用戶常常忘記添加附件的困擾。

          突出行動點

          根據用戶當前目標或下一步目標突出關鍵按鈕,幫助用戶快速找到關鍵操作,吸引用戶點擊,降低了用戶思考成本,提升效率。運用這個方法進行設計的例子太多了,比如淘寶的商品詳情頁用紅色突出購買按鈕等。

          直接執行

          根據用戶當前目標或下一步目標直接執行。比如滴滴的掃一掃界面,當檢測到光線較暗時,手電筒會自動打開,提高了掃一掃的效率。

          情感化

          唐納德·諾曼在《情感化設計》中提到設計的三個層次,分別為:本能的設計,行為的設計,反思的設計。情感化設計是能打動人的,它能傳遞感情,勾起回憶,給人驚喜,情感化設計是幫助產品與用戶之間建立情感的紐帶,能強化用戶對品牌的認知,培養對品牌的忠誠度。

          情感化設計的步驟依次為:提煉影響產品的的情感指標→聚焦用戶對產品的情感訴求→產出設計方案→驗證設計價值(來源于周姮—知乎螞蟻金服體驗技術部的一次分享)。

          在谷歌表格每列的開頭依次輸入「Pride」五個字母后,表格會變成彩虹樣式。

          網易云音樂在用戶生日時會變成「生日快樂」的蛋糕樣式,點擊進去的音樂列表,第一首歌是生日歌,讓人心里暖暖的。

          4. 設計檢驗

          最后一步就是設計方案的驗證,設計方案能否幫助用戶縮短操作流程?降低用戶思考成本?幫助用戶地完成任務?是否能打動用戶給他們帶來驚喜與溫暖?通過可用性測試及上線后的數據反饋,幫助我們更好的優化設計方案。

          總結

          1. 什么是場景化設計?

          場景五要素:4W+1H,即Who人、When時間、Where地點、What事件 、How環境,什么人,在什么時候,在什么地方,做了什么事情,所處的環境如何。

          2. 有哪些場景化設計的例子?

          3. 為什么要進行場景化設計?

          4. 怎么進行場景化設計?

          • 根據使用流程和行為路徑窮盡場景
          • 根據場景挖掘設計機會點
          • 將機會點轉化為落地的設計方案
          • 設計檢驗

          日歷

          鏈接

          個人資料

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

          存檔

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