<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設計者

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


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


          根據不同到使用場合這里梳理了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設計分享達人


          前言:


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


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


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



          什么是用戶習慣?


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

           

          所以,習慣有兩大特點:


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


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



          試想,我們在使用 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)。

          原始數據類型包括:布爾值、數值、字符串、nullundefined 以及 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界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務
           

          網站如何才能被百度收錄

          seo達人

           

          百度的搜索排名是有一定規律的,排名的高低和網站質量,知名度,用戶體驗等諸多方面有關系,這些技術百度是不會公布出來的,但是要獲取好的排名,首先要解決的是網站如何被百度收錄,更多的頁被百度收錄,一個新的網站想被百度收錄,可以通過提交到百度即可。

          一、新網站如何提交到百度呢?

          百度有一個新站點提交地址:https://ziyuan.baidu.com/linksubmit/url ,直接在這里輸入的你域名提交即可,一般來說只要網站合法基本都會在一定時間內收錄。

          如果想加快這個收錄時間,可以和一些已經被百度收錄的同行交換一下友情鏈接。

          二、被收錄后通過網站名稱一般就可以搜索到網站,但是一個關鍵詞基本沒有排名,所以要繼續按下面的工作來做才能保證有一個很好的排名。

          1.jpg

          1、持續的發布網站外鏈

          1.1、在發帖的時候需要找一些權重比較高的論壇或者是貼吧,不要直接發布廣告,也不要在帖子里面有太多關鍵詞錨文本,只需要在最后出現鏈接地址或者是錨文本就差不多了。

          1.2、問答需要找和百度有合作的問答網站,例如天涯、百度問答等等,然后尋找和網站主題類似的問題進行回答,一定要認真仔細的回答,回答完之后在最后留下鏈接就可以了。

          1.3、軟文是非常好的提升網站收錄信息以及快照的辦法,軟文必須要原創,并且需要是技術類的文章,軟文內容要確保真實性,不要瞎編亂造就可以了。

          1.4、友情鏈接交互平臺也能夠讓搜索引擎蜘蛛來爬行,因此可以找權重比較高的友情鏈接交換平臺提交網站的關鍵詞以及網址。

          2、保持網站持續更新

          2.1、網站的內容一定要有非常高的原創性,并且盡可能進行手動更新,一個字一個字的打上去。建議不要使用偽原創工具,因為現在百度對此非常的敏感,能夠按照語句的順序來判斷你是不是用了偽原創工具。與此同時,不要存在僥幸的心里,就算偽原創被百度收錄了,百度還是會根據它的判斷原則來評判內容的原創性,然后給出一定的權重,不是說被收錄了就等于認可你的內容是原創。

          2.2、在內容當中不能有非法信息和字符,禁詞就更加不能有了。通常這些非法信息都會被搜索引擎過濾掉,但是如果百度發現你的網站里面有會發信息,那么就會影響到對你整個網站的判斷,也就是要面臨降權,而且這些犯錯記錄都會被記錄下來,超過最高極限之后就會被k。

          2.3、內容當中不能有大量的關鍵詞或者是鏈接地址,但是適當的加入關鍵詞或者是鏈接地址卻是搜索引擎比較喜歡的。因為這樣不但能夠提升網絡戰的權重,而且還會加快搜索引擎抓取頁面的速度,建議一篇內容出現3-5個關鍵詞就可以了。

          所以,想要讓網站內容快速被收錄的話,以上的這些事項一定要做好,這樣堅持下去,才能達到好的效果。

          文章來源:pageadmin

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

           

          圖標設計落地全方位指南

          周周

          如期而至,這是標簽欄控件總結的第二期。這一期真是掏空職業經驗,希望對你的工作有所幫助。

          掏空家底!圖標設計落地全方位指南

          這一期我們來聊一聊標簽欄中的關鍵元素——圖標。

          圖標其實存在于界面中的許多地方,但因為這一期主要分析標簽欄,所以我會借標簽欄中較主流的圖標樣式,總結一套圖標制作與落地方法。這些方法在圖標制作過程中都是相通的,大家可以舉一反三。

          掏空家底!圖標設計落地全方位指南

          標簽欄圖標規范

          1. 圖標樣式

          圖標具體樣式風格的定義是非常主觀的,網絡上也流傳著許多的教程教大家如何設計五花八門的圖標,所以在這里我就不再贅述了。我主要來總結一下基礎的標簽欄圖標一般有哪些樣式變化。

          我調研了諸多的應用程序,發現主流的 APP 標簽欄樣式變化,大致分為以下五種。其中占比最多的是「由線型轉面型」。

          掏空家底!圖標設計落地全方位指南

          調研的應用程序中,所有使用到線性圖標的應用程序,都將描邊粗細限制在 1pt-2pt 之間。

          掏空家底!圖標設計落地全方位指南

          2. 圖標視覺大小

          上一期我們講到,iOS 定義了一套標簽欄圖標的尺寸規范。

          掏空家底!圖標設計落地全方位指南

          iOS 在這里所定義的尺寸并不是圖標文件最后輸出的尺寸,而是給設計師作圖時,針對不同圖標形狀的參考尺寸,目的是為了讓圖標的視覺大小看上去一致。

          那么為什么 iOS 會根據不同的圖標形狀給出不同的圖標尺寸呢?因為 50px×50px 的正方形比 50px×50px 的圓形面積更大,所以正方形的視覺大小也會大于圓形。為了統一圖標的視覺大小,正方形要做適當的面積收縮處理。(矩形同理)

          掏空家底!圖標設計落地全方位指南

          于是我們看到許多平臺都推出了圖標輔助網格規范 1。其實如果遵從「面積相等」原理,理論上所有的圖標網格都應該由下面這一套推理公式得出(以Material Design 標準圖標網格為例):

          掏空家底!圖標設計落地全方位指南

          但實際情況是,不同平臺的圖標輔助網格規范建議尺寸都有一定的差異。原因就在于,雖然有時候我們參考「面積相等」原則對圖標視覺尺寸進行了規范,但項目落地后發現視覺上可能還是有一些不協調,所以最終設計師還是會憑借自己的主觀判斷再進行微調。

          記?。汉玫脑O計作品是理性的設計理論與設計師本身感性的碰撞結果,二者缺一不可。

          3. 圖標輸出尺寸

          iOS 規定標簽欄圖標的輸出尺寸統一為 31pt×28pt;Material Design 規定標簽欄圖標的輸出尺寸統一為 24dp×24dp。

          但我們發現,在借助了圖標網格解決了圖標視覺大小的問題之后,每一個不同形狀的圖標,尺寸其實是不同的。為了方便前端落地,我們在輸出切圖文件時,要保持每一個圖標文件的輸出尺寸是相同的。該怎么辦呢?

          于是我們將一組圖標都放置在一個比圖標本身略大的相同尺寸容器中。而圖標與這個容器之間的空白像素,正好也幫助我們規避了圖標落地后,切圖邊緣像素可能被截斷的現象發生,所以我們稱這個區域為「安全邊距」。

          掏空家底!圖標設計落地全方位指南

          對于安全邊距的規定:Material Design 全平臺規定圖標的安全間距統一 2dp;iOS 則根據不同的圖標使用場景給出的不同的圖標網格和圖標安全間距 2。

          靜態圖標

          標簽欄的圖標一般分為靜態圖標和動態圖標兩種。

          靜態圖標的實現方法相對容易,可以與前端溝通確定本次項目交付的標簽欄圖標文件是采用位圖還是矢量圖。如果是位圖建議交付 .png 格式文件;如果是矢量圖建議交付 .svg 格式文件。

          1. 位圖圖標

          使用位圖時請注意以下兩點:

          不同項目環境輸出的切圖套數不同

          • 交付 iOS 原生的標簽欄圖標切圖需要 @1x/@2x/@3x 三種倍率的切圖文件;
          • 交付 Android 原生的標簽欄圖標切圖需要 @1.5x/@2x/@3x/@4x 四種倍率的切圖文件(@0.75x 和 @1x 切圖層分別用于 ldpi 和 mdpi 分辨率設備,但這些設備現在幾乎已退出市場,所以可不考慮,但最終視項目真實需求確定。);
          • 交付 web 項目的切圖需要試情況而定,一般常用 @2x 切圖,因為 @2x 向下適配 @1x、向上適配 @3x,都不會產生太大的圖片失真。但有時候前端小哥會要求用到其他倍率切圖,所以最終以具體需求而定。

          請注意:這里我所提到的倍率全都是「絕對倍率」,這個概念非常關鍵。

          「絕對倍率」指的是:以上所有的倍率都是針對 @1x 設計稿下的輸出倍率尺寸。而當你使用 @2x 作圖時,為了保證「絕對倍率」不變,你的切圖輸出倍率就應該設置為 @0.5x/@1x/@1.5x 。

          如果你在 @2x下作圖,卻依然保持輸出 @1x/@2x/@3x 的切圖,那你輸出的文件尺寸最終其實是 @2x/@4x/@6x。

          有一點繞的話,我們以 Sketch 導出位圖切圖為例:

          掏空家底!圖標設計落地全方位指南

          所以如果你日常使用的是 Sketch,也是用 Sketch 原生導出工具,那你的切圖預設應該根據你的作圖尺寸而定,見下表:

          掏空家底!圖標設計落地全方位指南

          如果你日常使用的是 PS,用 Cutterman 切圖,那么 Cutterman 會自動識別你當前的畫板,然后根據它的寬(橫屏情況下是高)來設定它的基準分辨率。那么你在任何情況下輸出 @1x/@2x/@3x 的切圖,其實都是「絕對倍率」,不用像 Sketch 當中一樣換算。前提是「設置當前畫布為:Auto(自動識別)」。

          掏空家底!圖標設計落地全方位指南

          假設你在 @2x 下作圖,執意不管不顧「絕對倍率」,又忘了交代前端人員手動處理切圖尺寸的話,那你所有的切圖尺寸實際都是設計稿所需圖標尺寸的2倍。就算前端小哥幫你手動處理了切圖尺寸,每一張切圖所包含的像素信息,都比項目真實所需的要多很多,完全就是在徒增所需切圖文件的大小。

          注意切圖文件大小

          切記,公司的線上項目中,用戶從服務器下載的每一單位的流量都是要公司花錢的,所以許多項目管理者都是很在意控制線上文件大小的。于是壓縮切圖是 UI 必備的技能之一。

          雖然圖標的文件大小一般只有幾 KB,但是項目大了難免積少成多,所以在真實項目中,不管任何切圖我都會手動壓縮一次。

          這里推薦一個壓縮 .png 文件大小,但幾乎不會產生失真的免費網站 tinypng3(是我曾經深愛的一位前端小哥推薦給我的,在此表示感謝)。

          掏空家底!圖標設計落地全方位指南

          2. 矢量圖

          位圖切圖會面臨交付的倍率圖過多、容易失真、文件大小難控制等問題,但對于矢量圖,這些問題都得到了解決。目前.svg矢量圖落地也在項目中越來越流行了。UI 可以在 Sketch 或 Ai 中制作。

          一般與前端人員對接有在線圖標庫對接與本地文件對接兩種。

          在線矢量圖標庫有很多,國內比較流行的是阿里巴巴矢量圖標庫-iconfont?;本地對接就是直接將文件發送給前端人員,他們會自行進行項目文件的管理與調用。

          如果 .svg 切圖輸出后,與設計稿中樣式不符,請注意排查以下三點:

          svg 不支持漸變顏色填充;

          • svg 不支持描邊,請將所有的描邊輪廓化。Sketch 中可通過「圖層-輪廓化」;AI 中可通過「對象-路徑-輪廓化描邊」;
          • 要確保一組圖標的文件尺寸一致,需在圖標下方增加一個透明方形,和圖標一同導出。

          掏空家底!圖標設計落地全方位指南

          動態圖標

          為了提升用戶體驗和產品趣味性,動效微交互的標簽欄圖標也越來越流行了。

          掏空家底!圖標設計落地全方位指南

          動效在前端落地的方法其實有很多:

          • 前端代碼直接實現:代碼是很強大的,但通常用代碼直接寫復雜動效會很浪費項目時間。簡單維度的動效如位移、透明度、大小變化等可以借助代碼,但復雜動效就不要去打擾前端小哥了;
          • 直接剛 gif:這已經是老舊技術時代的動畫解決方案了,文件大且請求文件也需要時間,有時候無法給用戶及時的觸控反饋。再者它是位圖的原因,在高分辨率屏幕上縮放容易失真。
          • png 序列幀:我們知道,動畫是一張一張的靜態圖交替變化形成的。如果將每一幀動畫都拆分成一張圖片,就有了 png 序列幀。所以一套動畫的 png 序列幀往往非常多,文件大小自然就變大了。所以后來也有團隊引進了雪碧圖的方式,但文件大小依然不樂觀。并且同樣是位圖的原因,高分辨率屏幕容易失真。
          • Facebook Pop/Rebound/Keyframes/Facebook Pop/Rebound 是 Facebook 給 iOS 和 Android 提供的常用動畫預設,是較早將動效代碼化的開源技術方案,但動畫效果預設只有彈簧/衰減等一些簡單樣式。后來 Facebook 又推出了 Keyframes,允許設計師自己在 Ae 中自定義動畫并導出,然后交付給前端人員。
          • Lottie 動畫:和 Facebook Keyframes 相同,都是結合 Ae 輸出動畫代碼。但是 Lottie 更厲害的地方在于,它比起 Facebook Keyframes 來支持的 Ae 樣式更多,例如蒙版、遮罩、修剪路徑等等。

          所以綜上所述,落地標簽欄動態圖標,目前最高效可行的還是 Lottie 動畫。

          1. Lottie的背景

          Lottie 是 Airbnb 開源的一個跨平臺動畫庫。表現層面它是一張圖片,但實現的方式是通過代碼,所以它是矢量的。很花式的動畫也可以把文件大小做到非常小。

          UI 與前端對接是通過交付一個 json 代碼文件。

          如果這是你第一次接觸 Lottie,再好不過的體驗方法就是玩一玩阿里提供的一站式動畫平臺:犸良動畫 5。它最底層采用的技術就是 Lottie,只是被阿里二次封裝了許多預設的動畫效果,你可以自定義其中的元素與參數,然后試著導出你的第一個 json 文件。

          2. Lottie如何上手

          接下來是簡單粗暴的 UI 與前端對接實現 Lottie 動畫落地的全步驟參考。在此之前,想要全方位了解 Lottie 的相關信息,請參閱 Lottie 官方說明文檔 6。

          步驟一:安裝 Ae 和 bodymovin

          制作 Lottie 動畫,首先你必需兩個工具:Ae 和 bodymovin 插件。

          Ae 最低版本要求為 Ae CC2014。又因為據很多設計師反饋,目前 bodymovin 在漢化后的 Ae 中使用會出現諸多問題,所以后面的教程都是基于 Ae 英文版。如果你漢化了Ae,最好在需要制作 Lottie 動畫時取消漢化。

          然后獲取 bodymovin7。bodymovin 插件更新至今,版本已非常多,并不一定最新版就適用于你當前的項目,因為前端使用的 bodymovin 解析包可能無法解析你用最新版 bodymovin 插件輸出的 json 文件。

          掏空家底!圖標設計落地全方位指南

          一旦確定使用 Lottie,前端人員會在 GitHub 查詢 Lottie 相關文檔的,所以 UI 只需要配合前端確定一下合適的 bodymovin 插件版本就可以了。最終走查時,一定要確保當前 bodymovin 輸出的動畫在項目所需要運行的所有環境中可運行,才說明 UI 使用的 bodymovin 插件和前端使用的 bodymovin 解析包版本是兼容的。

          獲取了 bodymovin 后,將 bodymovin 拖入到 ZXP Installer8 中,ZXP Installer 會自動識別插件安裝到 Ae。

          掏空家底!圖標設計落地全方位指南

          安裝完成后,就可以在 AE 的「窗口-擴展」中看到 bodymovin 啦。

          掏空家底!圖標設計落地全方位指南

          步驟二:將 Sketch 或 Ai 中的文件導入 Ae

          如果你技術嫻熟,當然也可以直接在 Ae 中繪制圖案動畫。但如果你還是習慣先在其他軟件中繪制好基礎圖案,再到 Ae 中制作動畫,那你需要了解如何將圖案導入 Ae。

          Ai 和 Ae 都是 Adobe 旗下的工具,所以 Ae 是可以完美解析 .ai 文件的,如果你是使用 Ai 作圖,可直接存儲為 .ai 文件,再在 Ae 中打開。

          掏空家底!圖標設計落地全方位指南

          如果你使用的是 Sketch,可以先導出為 .svg,再用 Ai 打開該 .svg 文件,轉換存儲格式為 .ai,最后到 Ae 中打開。

          當然,Sketch 還有直接和 Ae 對接的插件,AEUX(前身 Sketch2AE)9。需要在 Sketch 和 Ae 中同時安裝 AEUX 插件,Sketch 負責傳送,Ae 負責接收。具體的使用方法可以在官網教程中查看,我就不再贅述了。

          掏空家底!圖標設計落地全方位指南

          步驟三:制作動效并輸出

          和靜態圖標同理,為了保證落地時圖標視覺大小一致,一組動效圖標輸出的文件尺寸應該是相同的。所以在你制作動畫之前需要確定合成文件的尺寸。Lottie 官方建議:因為 Lottie 輸出的是矢量動畫,所以建議以 @1x 輸出動效,前端人員在任何屏幕上放大并不會失真。

          掏空家底!圖標設計落地全方位指南

          在制作之前請務必詳細閱讀 Lottie 所支持的 Ae 參數文檔10,以免辛苦做出的動效,前端無法解析。特別提醒:原生環境中 bodymovin 是不支持解析 Ae 表達式的。

          完成制作動效后,就可以通過 bodymovin 導出動效了。

          掏空家底!圖標設計落地全方位指南

          步驟四:預覽與交付

          導出完成后在你的目的地文件夾中將存在一個 .json 文檔,如果你的動效中還使用了位圖,系統還會自動生成一個 images 文件夾。這些都是你需要交付給與你對接的前端開發人員的文件。

          掏空家底!圖標設計落地全方位指南

          .json 文件中記錄的動效代碼 UI 不需要過多關心,但是其中兩個信息你是一定要了解的。它們是你與前端對接溝通和獲悉文件信息的一些關鍵參數。

          掏空家底!圖標設計落地全方位指南

          UI 自檢動效或其他相關人員需要預覽動效的時候,可以用 LottieFiles11,拖入 .json 文件即可預覽。iOS 和 Android 還可以下載 LottieFiles APP,掃描預覽頁中的二維碼即可在移動端預覽。

          掏空家底!圖標設計落地全方位指南

          總結

          整個制作圖標的流程我已經全部整理出來了。首先要注意圖標的規范,然后制作位圖、矢量、動效圖標時的注意點,我幾乎把我在真實項目中踩過的坑都告訴大家了。剩下的創造性的環節就交給你了。


          文章來源:優設網     作者:UCD耍家


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


          日歷

          鏈接

          個人資料

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

          存檔

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