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

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

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

          首頁

          高手如何從零開始設計 UI 界面?這個實戰案例告訴你!

          周周

          這是 UI 設計師 Diana Malewicz 的一篇 UI 界面設計的分享。怎樣在保證基本的可用性和易用性的同時,讓界面柔和、富有親和力?如何在讓用戶愉悅的同時,還能用設計取悅自己?Diana 的方法談不上有多神奇,但是讓人眼前一亮,值得借鑒。

          真的關注趨勢變化,你會清晰的感受到,視覺效果和設計技巧一直在變……它們一直是設計師們的話題中心。但是這篇文章并不打算討論這個事兒,無論漸變是否流行,新擬物化的可訪問性是否不足,都不在今天的討論范圍內。

          對于各種風格、方法,我的觀點始終是:做出來的設計要可用,有用,有良好的可訪問性,用戶可以輕松理解,就行了。不過,我更樂于從趨勢中獲得樂趣,而不是將它視作為約束,如果每個界面看起來都是一樣的,那該是一件多么無聊的事情啊。

          關鍵在于,要讓產品的視覺樣式和你的用戶群體匹配起來。

          我個人非常喜歡漂亮的漸變和微妙的陰影,這樣的設計常常顯得魅力非凡。這種自然的過渡和光影的變化,非常貼合我們對于現實世界的感知,這就是為什么這樣的設計能夠俘獲大量沒有技術背景的用戶的心——因為它們看起來友好,并且易于理解。

          在這篇文章當中,我將分享如何將 UI 效果設計得出彩又友好,讓視覺效果柔和又讓人感覺舒適。本文圍繞著一個「面向年輕人的金融 APP」虛擬設計項目來進行展示。

          下面我們開始吧!

          視覺層次的一致性

          怎么讓我們的設計看起來柔和圓潤呢?下面開始準備工作:

          1、選擇想要使用的配色(想想使用柔和的粉彩構成的背景主色調,搭配一個給人精致感的次要色,以及一個抓人注意力的強調色。)

          2、選擇合理的字體(我用的是 Brandon Grotesque,這是我最喜歡的字體,它足夠友好,能夠營造有趣的氛圍,且具有良好的可讀性)。接下來,給字體設計不同大小和字重(最好不超過5種不同的樣式)。其中,標題字體應該較大,正文字體較小,最小的字體用于細節呈現。注意,盡量不要在長句子里面使用全大寫。

          3、確定你所需要的陰影的高程(Height)和模糊度。

          4、如果使用的是圖標,確定使用填充樣式還是描邊樣式。盡量不要混用。

          至此,一個小型的設計系統就已經確定了。挺好看的!

          uni-app提交表單到后端,接收表單數據

          seo達人

          要想接收表單數據,首先要在表單進行數據的綁定,我們可以使用v-model="keyword"進行綁定。


          然后在js獲取這個綁定的值。


          index.vue


          <template>

          <view>

             <view class="search-con">

                     <view class="form-con">

                     <form class="search-form">

                         <input type="text" v-model="keyword" @tap="showsearchbtn" focus="true"/>

                         <button form-type="submit" hover-class='none' @tap="keyword">提交</button>  

                     </form>

                     </view>

             </view>

          </view>

          <template>

          js


          <script>

          export default {

             data() {

                 return {


                     }

                 },

                 methods: {

                     keyword(e){

                         // 獲取表單值

                         let kw = this.keyword;

                         console.log(kw);

                     }

                 }

             }

          </script>

          Author:TANKING

          Web:http://www.likeyun.cn

          Date:2020-8-13

          WeChat:face6009

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

          滴滴出行小程序I18n最佳實踐

          seo達人

          背景

          I18n = Internationalization,國際化,因為單詞由首末字符i/n和中間18個字母組成,簡稱i18n。對程序來說,就是要在不修改內部代碼的情況下,能根據不同語言及地區顯示相應的界面,以支持不同語言的人順利使用程序。

          業務背景

          互聯網行業進入下半場,精細化運營是關鍵。多語言支持能讓產品更好地服務境內的其他語言用戶,也為產品出海打下基礎,隨著 WeChat/Alipay 的全球化,你的小程序是否做好準備了呢?

          4月初,滴滴出行小程序團隊接到支持英文版的需求,預計上線時間為6月上旬。當前滴滴出行小程序集成的眾多業務線和各種公共庫,展示給用戶的有前端硬編碼的靜態文本和服務端下發的文案,都要同步接入多語言。考慮到小程序當前的體量,光文本收集、語料翻譯、npm package 支持,聯調,測試,溝通成本等等,并且前端開發只投入1.5人力的情況下,時間是蠻緊迫的,但是我們抗住了壓力,最終英文版滴滴出行小程序如期上線,截止目前運行穩定,用戶反饋良好,得到了超出預期的收益。

          當然這一切得益于各團隊同學的工作,和各團隊的通力配合,更得益于部門技術團隊 Mpx框架優雅的多語言能力支持。劃重點來咯,所謂工欲善其事必先利其器,如果你的公司業務需要開發小程序,也需要接入多語言,那么請搬好小板凳,我們來看一下小程序框架 Mpx 是如何優雅支持多語言能力。相信看完這篇,可以幫助你認識 Mpx(https://github.com/didi/mpx) ,加深對框架的理解,最終利用 Mpx 框架迭代小程序,年終獎多出那部分可以打賞一下作者,買杯咖啡哈(偷笑.jpg)

          以下是滴滴出行小程序的中英文版本對比:

          滴滴出行微信小程序i18n

          也歡迎大家在微信/支付寶里搜索滴滴出行小程序,實際使用感受下。PS:切換語言的方法是,打開小程序,點擊左上角用戶頭像,進入側邊欄設置頁面,點擊切換中英文即可體驗。

          技術背景

          在上述業務背景下,Mpx 框架——滴滴自研的專注提升小程序開發體驗的增強型小程序框架,內建 i18n 能力便提上日程。

          與 WEB 不同,小程序(本文以微信小程序為例)運行環境采用雙線程架構設計,渲染層的界面使用 WebView 進行渲染,邏輯層采用 JSCore 線程運行 JS腳本。邏輯層數據改變,通過 setData 將數據轉發到 Native(微信客戶端),Native 再將數據轉發到渲染層,以此更新頁面。由于線程間通信成本較高,實際項目開發時需要控制頻次和數量。另外小程序的渲染層不支持運行 JS ,一些如事件處理等操作無法在渲染層實現,因此微信官方提供了一套腳本語言 WXS ,結合 WXML ,可以構建出頁面的結構(不了解 WXS ?戳這里)。

          基于小程序的雙線程架構設計,實現 i18n 存在一些技術上的難點與挑戰,由于 Mpx 框架早期構建起來的強大基礎,最終得以優雅支持多語言能力,實現了和vue-i18n 基本一致的使用體驗。

          使用

          在使用上,Mpx 支持 i18n 能力提供的 API 與 vue-i18n 大體對齊,用法上也基本一致。

          模板中使用 i18n

          編譯階段通過用戶配置的 i18n 字典,結合框架內建的翻譯函數通過 wxs-i18n-loader 合成為可執行的 WXS 翻譯函數,并自動注入到有翻譯函數調用的模板中,具體調用方式如下圖。

          // mpx文件 <template> <view> <view>{{ $t('message.hello', { msg: 'hello' })}}</view> 

          <!-- formattedDatetime計算屬性,可基于locale變更響應刷新 --> <view>{{formattedDatetime}}</view> </view> </template>

          JS 中使用 i18n

          通過框架提供的 wxs2js 能力,將 WXS 翻譯函數轉換為 JS 模塊注入到 JS 運行時,使運行時環境中也能夠調用翻譯函數。

          // mpx文件 <script> import mpx, { createComponent } from '@mpxjs/core' createComponent({ 
          

          ready () { // js中使用 console.log(this.$t('message.hello', { msg: 'hello' }))

          // 局部locale變更,生效范圍為當前組件內 this.$i18n.locale = 'en-US' setTimeout(() =>

          { // 全局locale變更,生效范圍為項目全局 mpx.i18n.locale = 'zh-CN' }, 10000)

          }, computed: { formattedDatetime () { return this.$d(new Date(), 'long') } } }) </script>

          定義 i18n 字典

          項目構建時傳入 i18n 配置對象,主要包括語言字典和默認語言類型。

          new MpxWebpackPlugin({ i18n: { locale: 'en-US',

          // messages既可以通過對象字面量傳入,也可以通過messagesPath指定一個js模塊路徑,

          在該模塊中定義配置并導出,dateTimeFormats/dateTimeFormatsPath和numberFormats/numberFormatsPath同理

          messages: { 'en-US': { message: { hello: '{msg} world' }

          }, 'zh-CN': { message: { hello: '{msg} 世界' } } }, // messagesPath: path.resolve(__dirname, '../src/i18n.js') } })

          如果是通過 Mpx 提供的 cli 工具生成的項目,這部分配置會在 mpx.conf.js 文件中,不光可以直接內聯寫在該文件中,也可以指定語言包的路徑。

          以上,Mpx 的 i18n 方案接入成本低,使用優雅,體驗優秀。直觀感受可參考下面 mpx i18n demo :https://github.com/didi/mpx/t...

          方案

          Mpx框架的 i18n 支持幾乎完全實現了 vue-i18n 的全部能力,下面我們來詳細說明 Mpx 框架 i18n 能力的具體實現。

          方案探索

          基于小程序運行環境的雙線程架構,我們嘗試了不同方案,具體探索過程如下:

          方案一:基于 Mpx 框架已提供的數據增強能力 computed 計算屬性,來支持 i18n 。該方案與 uniapp 的實現思路相似(后文會進行對比分析),存在一定不足,包括線程通信帶來的性能開銷和for循環場景下的處理較復雜等,最終放棄。
          方案二:基于 WXS + JS 支持 i18n 適配。通過視圖層注入 WXS,將 WXS 語法轉換為 JS 后注入到邏輯層,這樣視圖層和邏輯層均可實現 i18n 適配,并且在一定程度上有效減少兩個線程間的通信耗時,提高性能。

          從性能和合理性上考慮,我們最終采用了方案二進行 Mpx 的 i18n 方案實現。

          mpx-i18n內部流程示意圖

          Mpx i18n 架構設計圖

          由于各大小程序平臺上,WXS 語法和使用均存在較大差異,因此該方案實現過程中也存在一些技術上的難點,這些難點基于 Mpx 框架的早期構建起來的跨平臺能力也一一得以攻克,具體如下。

          實現難點

          WXS 在模板中運行的跨平臺處理

          WXS 是運行在視圖層中的 JS,可以減少與邏輯層通信耗時,提高性能。因此 Mpx 框架在迭代初期便已支持在模板和 JS 運行環境使用 WXS 語言,并且針對小程序跨平臺 WXS 語法進行抹平。
          在模板中,Mpx 自定義一個 webpack chunk template,以微信 WXS 作為 DSL,利用 babylon 將注入的 WXS 轉化成 ast,然后遍歷 ast 節點,抹平各大平臺對 WXS 語法的處理差異,輸出各平臺可以識別的類 WXS 文件。目前主要支持微信(WXS)、支付寶(sjs)、百度(filter)、QQ(qs)、頭條(sjs)等小程序平臺。

          WXS 在邏輯層運行的跨平臺處理

          WXS 與 JavaScript 是不同的語言,有自己的語法,并不和 JavaScript 一致。并且 WXS 的運行環境和其他 JavaScript 代碼是隔離的,WXS 中不能調用其他 JavaScript 文件中定義的函數,也不能調用小程序提供的API。
          因此在邏輯層,Mpx 將注入的 WXS 語法轉化為 JS,通過 webpack 注入到當前模塊。例如 WXS 全局方法 getRegExp/getDate 在 JS 中是無法調用的,Mpx將它們分別轉化成 JS 模塊,再通過 webpack addVariable 將模塊注入到 bundle.js 中。
          同理,Mpx 會將編譯時注入的 i18n wxs 翻譯函數和 i18n 配置對象掛載到全局 global 對象上,利用 mixin 混入到頁面組件,并監聽 i18n 配置對象,這樣JS和模板中即可直接調用 i18n 翻譯函數,實現數據響應。

          以上便是 Mpx 框架在小程序中支持 i18n 能力的技術細節,由于 WXS 是可以在視圖層執行的類 JS 語法的一門語言,這樣就減少了小程序邏輯層和視圖層的通信耗時,提升性能。但是由于實現依賴類 WXS 能力,以及 WXS 執行環境的限制,目前模板上可直接使用的翻譯函數包括 $t/$tc/$te ,如果需要格式化數字或日期可以使用對應的翻譯函數在 JS 中 Mpx 提供的計算屬性中實現。

          輸出 web 時使用 i18n

          Mpx同時還支持轉換產出H5,而 Mpx 提供的 i18n 能力在使用上與 vue-i18n 基本一致,輸出 web 時框架會自動引入 vue-i18n,并使用當前的 Mpx i18n 配置信息對其進行初始化,用戶無需進行任何更改,即可輸出和小程序表現完全一致的 i18n web 項目。

          對比

          上面分析了 Mpx 框架的 i18n 方案的技術細節,我們來看下和其他方案的對比,主要是和 uniapp - 基于 Vue 編寫小程序的方案,和微信官方的方案,兩者提供的 i18n 支持與Mpx的對比有何優劣。

          uniapp的方案

          uniapp 提供了對 i18n 能力的支持,是直接引入vue-i18n。但小程序中無法在模板上調用 JS 方法,本質上是利用計算屬性 Computed 轉換好語言,然后利用模板插值在小程序模板中使用。

          模板中:
          <view>{{ message.hello }}</view>

          JS里需要寫:

           computed: {  
              message () { return { hello: this.$t('message.hello') }
              }
            }

          因此該方案存在一個性能問題,最終的渲染層所看到的文本還是通過 setData 跨線程通信完成,這樣就會導致線程間通信增多,性能開銷較大。

          并且,早期這種形式使用成本較高,后來 uniapp 也針對其做過優化,實現了可以在模板上寫 $t() 的能力,使用上方便了不少。

          這個 t() 的實現是在編譯時候識別到t 就自動替換,幫你替換成一個 uniapp 的 computed 數據,因此數據部分還是和之前一樣要維護兩份。尤其是模板上的for循環,即使 for 里只有一個數據要被轉換,整個列表都要被替換成一個計算屬性,在線程間通信時進一步加大了性能開銷。

          微信官方的方案

          微信小程序本身也提供了一個 i18n 的方案,倉庫地址是:wechat-miniprogram/miniprogram-i18n 。

          這個方案從 i18n 本身的實現來講和Mpx框架的設計是類似的,也是基于 WXS 實現(英雄所見略同啊)。但因為周邊配套上沒有完整的體系,整體使用體驗上就也略遜于基于Mpx框架來開發支持 i18n 的國際化小程序了。

          主要的點就是,官方提供的方案,要基于 gulp 工具進行一次額外構建,同時在JS中使用時候還要額外引入一個 behavior 去讓JS中也可以使用翻譯能力。

          而Mpx框架通過一次統一的Webpack構建產出完整的內容,用戶無需擔心語言包更新后忘記重新構建,在JS中使用的時候不光更方便,而且語言信息還是個響應式的,任何組件都可以很方便地監聽語言值的變化去做一些其他的事情。

          最后,Mpx的 i18n 方案對比微信官方的方案還有個巨大的優點,結合Mpx的跨平臺能力,能實現均以這個方案,一套代碼產出支持微信/支付寶/百度/QQ/頭條多個平臺的支持 i18n 的小程序。

          總結

          Mpx 框架專注小程序開發,期望為開發者提供最舒適的開發體驗,有眾多優秀的功能特性,幫助開發者提效。本文介紹的是其內置的 i18n 能力,通過對比分析得出相比其他框架方案在使用成本和性能等方面有明顯的優勢,歡迎各位有相關需求的同學進行體驗嘗試。

          未來 Mpx 還會持續迭代優化,提供更多更好的能力幫助小程序開發者提效。在使用過程中遇到任何問題,歡迎大家在 Git 上提 issue,團隊成員會及時響應。同時也鼓勵大家一起為開源社區做貢獻,參與到 Mpx 共建中來,為小程序技術發展添磚加瓦。

          Git地址 [https://github.com/didi/mpx]
          Mpx文檔 [https://mpxjs.cn/]

          歡迎技術交流與反饋,順便star一下鼓勵開源項目貢獻者,我們將持續發力貢獻社區。

          附:以往Mpx文章鏈接
          滴滴開源小程序框架Mpx - https://mpxjs.cn/articles/1.0.html
          滴滴小程序框架Mpx發布2.0,支持小程序跨平臺開發,可直接轉換已有微信小程序 - https://mpxjs.cn/articles/2.0.html
          小程序開發者,為什么你應該嘗試下MPX - https://mpxjs.cn/articles/mpx1.html
          Mpx 小程序框架技術揭秘 - https://mpxjs.cn/articles/mpx2.html

          滴滴出行小程序體積優化實踐 - https://mpxjs.cn/articles/size-control.html

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

          日期排版沒靈感?我總結了10套排版案例

          濤濤

          版式設計在我們的設計中是非常重要的技能,無論是UI設計還是平面設計,都會運用到版式設計相關的知識,在版式設計中最常見的就是圖文排版、文文排版。一張圖片一段文案在不同的需求情況下我們都可以排版出很多種樣式,每一種樣式展現出來給人的感覺也是不一樣的,美的排版總是會使人眼前一亮,也會使整體的設計更耐看。

          排版也是會根據重要程度劃分層級,我們都知道主題文案都需要醒目,讓人一眼就能看到,這樣才能達到宣傳的作用,當然僅僅只是展示主題文案也是遠遠不夠的,達到主題排版,主圖排版,小到副標題排版,我們都需要精心的排版,還可以更精細到小到輔助文案以及圖形的排版,而今天我們就來看一下日期這樣的文案我們可以怎么排版呢?

          日期在一些重要的活動中也是比較重要的信息,比如展會時間,我們需要突出時間,不能用極小的文字排版在角落,用戶不注意的地方,這樣會給人一種焦慮的情緒,既然是展會活動,那么用戶關心的是展會的主題是什么?活動時間是什么時候?活動地址在什么地方?所以這些重要的信息就需要重要突出。而在一些做紀念性的日期我們就可以小化(例如我自己記錄自己的學習打卡練習)

          案例分享

          我們常見的日期有年、月、日、時、分、秒,接下來我們就通過對日期的展現做一些不同的排版方式,通過與日期的普通排版方式做對比,我們就可以看出微小的日期排版對整體的設計展現也是有很大影響的。

          簡單的日期排版我們通常就只是將年月日對齊排版就算完成了,但是這樣的排版方式會影響整體畫面的美觀,我們對于小文案也需要花一定心思去整理以及排版出更精細的樣式,這樣給用戶的感覺就會覺得你的每一步設計都是用心設計的,并且為了整體的美觀,我們 也不得不從細微之處出發。

          日期排版01

          例如下面對于日期的排版,TIME這個文案有時候我們也可以去掉,因為用戶看到時間就會明白這是什么,在一定的情況下也是可以去掉的,當然有時候為了整體頁面的展示效果,我們也可以加上,便于排版,左邊只是將年、月、日并排,時間節點作為一個點排列,下面的文案我們可以根據實際情況選擇一些特殊的提示文案做裝飾

          而通過對左邊簡單的日期排版進行改版后,我們會發現右邊的日期排版會顯得更美觀,排版更精妙,也有更多的細節之處,例如2020后緊接著年(YEAR)的提示,08后面標識是周六(SAT.),年月日和時間節點也同時做了層次區分,這樣更有利于閱讀。

          日期排版沒靈感?我總結了10套排版案例

          日期排版02

          對于上面同樣的日期文案,我們還可以排出右邊不同的樣式,整體采用橫排的方式,將年、月、日同排,時間段縮小處理,使時間之間也能有層次感

          日期排版沒靈感?我總結了10套排版案例

          日期排版03

          下面的日期是年、日期段、時間段的組合,左邊的排版顯然是比較常規的分層排版,卻主要突出了2020,而一般時間我們在這一年將要發生的事,我們更關心的是哪一天那個時間點,而右邊的排版主要突出時間段/點,更能讓用戶看到自己關心的事件。

          日期排版沒靈感?我總結了10套排版案例

          日期排版04

          下面這一組日期是有不同年份的,所以我們在排版的時候可以突出顯示年份,這樣在排版的時候就可以注意層級關系,排除層次感

          日期排版沒靈感?我總結了10套排版案例

          日期排版05

          這一組日期是比較簡單的,只有一個時間點,沒有時間段,如果直接按照左邊這樣的日期排版方式,顯然整體看著就很單薄,把這樣的日期排版方式融入到版式整體畫面中,也一定會顯得毫無設計感,而我們只需要將簡單的日期經過簡單的排版,從年、月、日、時,從上至下依次排列,這樣就可以顯得信息有層次感,并且閱讀也不會有困惑,加上精致的icon做裝飾,這樣的日期排版就顯得更耐看。

          日期排版沒靈感?我總結了10套排版案例

          日期排版06

          這一組日期也很簡單,只有月、日、時,都是屬于時間段的信息,通過分析這個時間,月都是10月,是相同的,所以我們可以將月份單獨拿出來,作為共用信息,這樣就可以精簡畫面重復的信息,依然采用月、日、時這樣從上至下的順序排列,時間小化,但是利用色塊突出,也不會柔化時間點的閱讀,再通過一條線的連接,將斜線和時間icon相連,形成一個有趣味性的時間裝飾,這樣的排版更容易吸引用戶的眼球

          日期排版沒靈感?我總結了10套排版案例

          日期排版07

          下面的日期也是年、日期段、時間段的組合,和第三個日期排版的案例類似,所以存在同樣的問題,左邊的排版顯然是比較常規的分層排版,卻主要突出了2020,右邊改版后,我們同樣弱化年份(2020),提取相同的月份(8月),突出顯示日期

          日期排版沒靈感?我總結了10套排版案例

          日期排版08

          這一個和第五個也是一樣的,左邊都是年、月、日、時的時間點,沒有時間段,第五個我們是采用豎排的方式,而這里我們改版后采用的是橫排的方式,突出顯示月、日,讓整體的層次更加清晰

          日期排版沒靈感?我總結了10套排版案例

          日期排版09

          下面這一組時間改版,我們主要采用錯位豎排的方式,像這樣的排版方式,我們可以多用于一些比較有設計感或者比較唯美的畫面中,顯得每一個小的點,都有用心設計,并且也符合這樣的氣質

          日期排版沒靈感?我總結了10套排版案例

          日期排版10

          這一組日期只有年、月、日。左右兩邊的排版看起來很相似,但是通過對細節的調整,例如2020的弱化,間距的把控,星期幾的友好提示,這樣就會使整個日期排版看起來更精細、耐看。

          日期排版沒靈感?我總結了10套排版案例

          案例實操

          我們通過對上面日期的排版分析和總結,會發現小小的日期排版也是很關鍵也很追重要的,所以下面我們將通過一張海報案例,來真正體現日期排版對整體畫面的重要性。

          海報主題是選擇的立秋,雖然立秋以及過去兩天了,但是我又學會了這個立秋新的排版技巧,所以我想將這一技巧分享出來,但是這里就不詳細講解海報的設計過程了,主要還是分享日期排版對整體畫面的影響作用

          這里就簡單的說一下海報設計的思路,海報主題是立秋,所以我現在一片黃色的楓葉作為畫面的主視覺,畫面整體體現秋天的感覺,一片黃燦燦的畫面,給人感覺就像是秋天到了,畫面元素簡約,只選擇了一片楓葉加上它的投影,體現空間感,主題文案排版在楓葉上,與楓葉融為一體,這樣用戶得分第一視覺就會被主圖吸引,同時看到主題相關文案,下面的其它文案通過從|秋|字垂落的豎線,分別右對齊以及左對齊,顯得畫面規整

          日期排版沒靈感?我總結了10套排版案例

          第一張海報的日期排版就是采用普通常規的排版方式,我們會發現這樣的日期排版方式,在整個畫面中會顯得有點僵硬,并且左右兩邊不對稱的關系,會顯得右邊偏輕,使畫面的平衡感缺失,也正是日期的排版太粗糙的原因,導致整張海報的精細度大減。

          日期排版沒靈感?我總結了10套排版案例

          樣機效果

          日期排版沒靈感?我總結了10套排版案例

          我們保持其它元素以及排版都一致,只改變日期的排版方式,我們就會發現右邊的海報整體給人的感覺更精美,平衡感更強烈,所以我們在做設計的時候不要忽略每一個點。將每一個點都細心的設計,這樣的作品才會更耐看。

          總結

          版式設計是我們設計中最基本的知識,我們在做設計的時候,通常會注意主題主圖的排版,而經常會忽略哪些不是很重要的信息,但是我們在分析文案信息的時候,也需要考慮整體設計的目的,有時候日期信息也是非常重要的信息,所以我們在做排版的時候,也需要認真考慮日期與整體需求的關系,并且日期排版風格也會影響整體的氣質。


          文章來源:優設    作者:設計小余

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

          微軟設計負責人專訪:我們是如何創造雙屏設計的?

          濤濤

          接下來的訪談翻譯自微軟官方博客,微軟的 Office 設計部門的兩位主管 Jon Friedman 和 Deepak Menon 在訪談中聊了一下 Surface Duo 背后的設計故事:

          微軟設計負責人專訪:我們是如何創造雙屏設計的?

          在過去的幾十年當中,數碼產品制造商經常會為了適應用戶的習慣和需求,來不斷創造產品。我們傾向于讓事物變的更小、更輕、響應更快、更具包容性。我們將不同感官融入程序,創造而優雅的產品。

          隨著日常生活節奏和生產力的觀念變化,我們經常需要反思一個問題:如何賦予人們在創作和消費、專業和個人之間流暢切換的可能性?

          即將發售的 Surface Duo 是一款獨特的雙屏移動設備,它有著一套專門為它的硬件所定制化的產品體驗,而它的設計也折射出我們探索問題的方式。

          對于設計師來說,創造這樣的獨特產品的機會是難得的,就像你在一個住了十幾年的房子里面,發現新的房間一樣。會打開的是哪扇門?會通向哪個區域?會延伸出哪些創意?

          對于 Surface Duo ,我們想知道,它的兩塊屏幕會延伸出哪些全新的工作流程,它的接縫要如何處理,怎樣減輕用戶的認知負荷?

          受多年來我們在用戶研究上的成果所啟發,我們通過軟硬件結合的方式來進行 Surface Duo 的研發,讓它能適合你日常的需求,還可以帶來獨特的體驗,比如在雙屏上并排打開文檔。

          Surface Duo 仍然處于起步階段,我們知道,它還有很多待解決的問題,這也是為什么微軟會引入更多的用戶和設計師,來不斷地完善它。

          為了讓大家更好地了解 Surface Duo 的設計歷程,我們請來了 Deepak Menon ,他不僅參與了 Surface Duo 的研發和設計,還是 Office 設計團隊的負責人,讓他來告訴大家,Surface Duo 背后的創意、研究和設計決策。

          微軟設計負責人專訪:我們是如何創造雙屏設計的?

          Jon:謝謝你能來,Deepak,在過去的2個月時間里,我們一直在非常密集地使用和測試 Surface Duo~

          Deepak:實際上,我干脆是拿它單主力機,現在我都覺得我已經不需要其他的任何設備了。

          Jon:我們當然會這么說,畢竟是我們設計了它。但是,我想這也證明了一件事情,就是這種拓展式的雙屏,已經具備應對日常工作的能力,并且貼合大家的需求了。

          Deepak:對。這不僅僅是「2塊屏幕智能手機」所帶來的體驗,它更接近于是一款「折疊式的平板電腦」的感覺。它是新事物,盡管是通過鉸鏈和轉軸來實現這種可能性。

          Jon:我們接觸 Surface Duo 的時候,我們首先想到的一問題是:人類還有哪些需求是未曾被實現的?人們在達成目標過程中,有哪些問題是需要工具來彌合的?我們要如何來幫助用戶達成這個目標?雙屏的這種形態,讓我們有重新思考生產力的切入點。

          Deepak:對,尤其是在移動端的生產力上。

          微軟設計負責人專訪:我們是如何創造雙屏設計的?

          在雙屏界面下,使用 Office 在 PDF 文檔上簽名,然后使用 Outlook 發送出去,簽合同的便捷操作。

          Jon:確實,你的團隊在中國和印度這樣移動端優先的國家做了非常深入的調研。

          Deepak:我們注意到很多用戶在同一設備上執行并完成一系列的任務,他們需要更快地切換。同時,企業也正在倚靠我們過去認為非?!笂蕵坊沟拿浇閬磉M行必要的經營。

          Jon:在過去,生產力有這非常清晰的定量標準,比如一秒生產多少零件。但是如今,生產力和創意息息相關,你的情緒狀態和輸出的內容是一樣重要的。我們在不斷消費又不斷創造,反思和行動來回切換。其實這都涉及到一種傾向或者流程,你會按照一定的方式來處理信息,或者當你腦中突然劃過一個想法的時候,你會想立刻構建或者制作某個東西,而這也需要一系列的操作和任務來支撐。

          從整個數字設備的發展歷程來看,雙屏的設備可能是最適合處理這種帶有步驟的「流程」。Surface Duo 最精巧地的地方,就在于它可以按照你的各種需求來折疊翻轉和交互,可大可小,同時也是一款貼合你的口袋尺寸的設備。

          微軟設計負責人專訪:我們是如何創造雙屏設計的?

          在橫屏模式之下,你可以像翻書一樣瀏覽 Word 文檔

          Deepak:當然,它將內容消費提升到一個全新的層次,對于豐富內容的處理,Surface Duo 更加適合和專業。在 Outlook 當中,你可以快速瀏覽整個星期的工作安排,在 Word 中,你可以像翻書一樣閱讀內容。屏幕 折疊所賦予的空間讓更多的信息有了自然的展現空間。

          借助 Surface Duo ,創造性的工作也得到了增強。當我使用 PowerPoint 來制作幻燈片的時候,我喜歡在一個屏幕上編輯,在另外一塊屏幕上預覽,兩塊屏幕當中,一塊幫我保持專注內容制作,另一塊幫我統領全局。另外,我也會在屏幕上開啟多個不同的應用。

          微軟設計負責人專訪:我們是如何創造雙屏設計的?

          將團隊的視頻通話和 PowerPoint 并列擺放,讓你一邊溝通一邊查看內容

          Jon:使用它來進行遠程會議可能是我最喜歡的場景之一。我喜歡在開會的時候使用雙橫屏模式,將視頻置于頂端,在下面的屏幕瀏覽文檔。

          Deepak:或者用另外一塊屏幕來調用嬰兒監視器!哈哈,疫情讓我們和家庭的關系更加密切,Surface Duo 讓我可以更多兼顧到家庭這邊。

          Jon:對,很多人認為在疫情期間,家里有這么多人,移動設備的使用量可能會降低,但是很多數據表明,情況恰恰相反(僅2月初到3月下旬,微軟的 Team 移動端的用戶數量就增加了超過300%)。就我個人而言,我不想一直待在一個房間里面,盯著一塊屏幕,其他人也都反映,需要四處走動,或者在外面工作。當我開始使用Surface Duo 的時候,開始從中獲得更為強大的支撐,獲得更加有效的體驗。

          當然,它最優雅的還是在窗口的管理上。打開多個窗口是一種非常常見的 PC 體驗,但是在單屏的移動端設備上其實還不算太普遍和舒適,但是在 Surface Duo 上則很自然。

          微軟設計負責人專訪:我們是如何創造雙屏設計的?

          Outlook 中雙屏帶來的額外空間讓你可以更快查看相關的收件箱和日歷

          Deepak:關于用戶如何使用窗口來提高生產力,有過很多研究,并且兩塊屏幕之間的天然接縫,或者說轉軸,其實很自然地造就了「兩塊屏幕」和「多窗口」的認知。在某些情況下,因為接縫的存在,在兩塊屏幕上打開完全不同的兩個應用,其實是非常自然的事情。

          在很多其他的情況下,用戶可能會在一個屏幕中打開一個新的程序,打開新的界面,執行單獨的操作,或者通過一個程序,在另外一個屏幕中打開下一步操作,然后再在兩個界面之間來回操作,這都是非常平穩的。這種被分割開的兩塊屏幕,創造了一種全新的交互契機,而不是制造約束。

          Jon:對于 Surface 的軟硬件團隊,我最為欣賞的一點,就是這種共生和互相促進的模式。使用 Surface Duo,你可以擁有更大的屏幕空間,而且擁有眾多不同的使用應用的新方法,而 Surface Duo 也正好可以適應各種各樣不同的使用場景。而我們在創建這個產品的過程中,想要兼顧到如此之多的場景和需求,其實是需要兩個團隊親密無間地協作,才能做好。

          對了,你剛剛說道關于照片、視頻、語音等內容——這些輸入方式的協作,對于創造性的工作到底有多重要?

          Deepak:的確,在移動端設備上,攝像頭和麥克風是必不可少的。我們希望最大限度地讓 Office 最大限度地利用這些傳感器,在移動地使用過程中進行協同。用戶在通勤過程中如何參與到線上課程的互動?老師如何更快地給孩子批閱作業,家長要如何協助孩子?其實,Surface Duo 在研發探索的過程中,就有意識地在兼顧這些場景和問題。

          微軟設計負責人專訪:我們是如何創造雙屏設計的?

          從媒體庫當中,將媒體拖放到 PowerPoint 當中

          Jon:我喜歡這些富有包容性的解決方案。人們的學習方式和工作方式通常是截然不同的,這些自適應性良好的輸入模型,能夠幫助能力各異的用戶完成他們所需的工作。

          Deepak:當我們將新的輸入模型和智能化的功能結合到一起的時候,有趣的事情就開始發生了。我們幾乎還沒有涉及到創作方面的內容,用戶就已經擁有很多契機自由發揮,他們可以輕松、清晰地借用這種交互模式來表達自己。比如可以更加順暢地利用模板來制作精美的 Word 文檔和 PowerPoint 。

          微軟設計負責人專訪:我們是如何創造雙屏設計的?

          Jon:物理世界中有太多東西,我們可以將其逐漸的數字化。

          Deepak:的確,將智能化的程序和多樣的傳感器耦合到一起,提高生產力的方式有很多——無論是提升工作效率、家庭安全性還是讓內心更加平靜。其實第三方開發者身上,我看到了更多思維和想法的延展,以及可能性。

          Jon:對,我們已經看到很多非常有趣智能的東西了!在 Microsoft Hackathon 大會上,有人為 Surface Duo 設計了一款雙人游戲,兩個玩家各占一塊屏幕,隔著轉軸來來操作,彼此面對面,非常有趣!

          Deepak:確實如此!

          Jon:我們很高興 Surface Duo 最終能夠面向普通用戶,我很期待它最終會在普通用戶手中會迸發出怎樣的創意和靈思,他們能夠構建出什么樣的創新軟件。

          Deepak:有太多值得期待的東西了 !

          譯者按:

          微軟在硬件產品上,有著豐富的翻車歷史。90年代的事情太過久遠姑且不說,最近十幾年,出過很多比較失敗的產品,比如上架僅 6 天就全線下架的時尚社交手機 Kin One 和 Kin Two,比如被支付寶團隊戲稱為「1%」的 Windows Phone 系統和手機,比如幾乎不存在兼容性的 Surface RT 系列的平板電腦。這些硬件我全都買過,可以說全是坑。

          微軟設計負責人專訪:我們是如何創造雙屏設計的?

          微軟設計負責人專訪:我們是如何創造雙屏設計的?

          這些產品單獨來看是失敗的,但是放在更長的時間跨度上來看,卻又是微軟整個生態和產品鏈條的構成和發展上,不可或缺的部分。Kin One 是整個 Metro 設計美學真正成型并走入移動端智能設備的里程碑(之前僅用于Zune系列播放器上),Windows Phone 則是 Windows 系統向小屏幕探索的必經之路,而 Surface RT 固然失敗,但是它是帶著桌面端 Windows 系統從傳統 X86 架構走上 ARM 的一次大膽嘗試。

          微軟設計負責人專訪:我們是如何創造雙屏設計的?

          失敗總是難免的,而微軟這種大廠更是有著試錯買單的底氣。從內部設計和產品團隊各自為戰,到統一到一個部門來統一管理,Surface 系列產品的誕生就是分水嶺,而這件事情是在 10 年發生的。

          當然,在此之后翻車的產品依然會有,但是成功的概率比起更早的階段(比如應對 iPad 誕生時,倉促推出的觸摸屏PC),已經提升很多了。

          如今只剩下拼硬件參數數字產品的世界簡直是太無聊了。我很期待 Surface Duo 這類雙屏折疊硬件能帶來改變。


          文章來源:優設    作者:Jon Friedman

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

          你不知道的vue——vue不常用的知識點的整理

          前端達人

          你不知道的vue——vue不常用的知識點的整理

          1. v-cloak: 使用 v-cloak 指令可以有效解決屏幕閃動。

            有時候,頁面沒渲染之前就會出現vue代碼塊,例如下圖。使用v-cloak可以很好解決這種問題。
            在這里插入圖片描述

            <template> <div class="hello"> <span v-cloak>{{ content }}</span> </div> </template> <script> export default { name: "hello", data() { return { content: "測試" }; } }; </script> <style scoped> /* v-cloak這個屬性會在頁面渲染前作用于對應dom 在渲染完畢這個里面的樣式將被移除 */ [v-cloak] { display: none; } </style>  
                    
          2. keep-alive

            官網是這么解釋的:

            在這里插入圖片描述

            例如:可以實現頁面緩存,比如從編輯頁切出去再切進來,頁面還是處于編輯狀態.

            1. 需要在router.js中設置meta屬性,meta下的keepAlive屬性設置為true,代表這個頁面需要進行緩存。

              import Vue from 'vue' import Router from 'vue-router' import HelloWorld from '@/components/HelloWorld' import is from '@/view/is' import list from '@/view/list' import detail from '@/view/detail' Vue.use(Router) export default new Router({ routes: [ { path: '/', name: 'HelloWorld', component: HelloWorld, meta: { keepAlive: false, title: 'HelloWorld' } }, { path: '/is', name: 'is', component: is, meta: { keepAlive: false, title: 'is' } }, { path: '/list', name: 'list', component: list, meta: { keepAlive: true, title: 'list' } }, { path: '/detail', name: 'detail', component: detail, meta: { keepAlive: true, title: 'detail' } } ] })  
                              
            2. app.vue中修改一下代碼<router-view />

              <template> <div id="app"> <keep-alive> <!--緩存組件--> <router-view v-if="$route.meta.keepAlive" /> </keep-alive> <!--非緩存組件--> <router-view v-if="!$route.meta.keepAlive" /> </div> </template> <script> export default { name: "App" }; </script> <style> #app { font-family: "Avenir", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } </style>  
                              
            3. 在詳情頁detail.vue中,注意beforeRouteEnterbeforeRouteLeave兩個方法。

              <template> <div class="detail"> <!-- form表單,用于測試是否緩存 --> <Form ref="formCustom" :model="formItem" :label-width="80"> <FormItem label="Input"> <Input v-model="formItem.input" placeholder="Enter something..."></Input> </FormItem> <FormItem label="Select"> <Select v-model="formItem.select"> <Option value="beijing">New York</Option> <Option value="shanghai">London</Option> <Option value="shenzhen">Sydney</Option> </Select> </FormItem> <FormItem label="DatePicker"> <Row> <Col span="11"> <DatePicker type="date" placeholder="Select date" v-model="formItem.date"></DatePicker> </Col> <Col span="2" style="text-align: center">-</Col> <Col span="11"> <TimePicker type="time" placeholder="Select time" v-model="formItem.time"></TimePicker> </Col> </Row> </FormItem> <FormItem label="Radio"> <RadioGroup v-model="formItem.radio"> <Radio label="male">Male</Radio> <Radio label="female">Female</Radio> </RadioGroup> </FormItem> <FormItem label="Checkbox"> <CheckboxGroup v-model="formItem.checkbox"> <Checkbox label="Eat"></Checkbox> <Checkbox label="Sleep"></Checkbox> <Checkbox label="Run"></Checkbox> <Checkbox label="Movie"></Checkbox> </CheckboxGroup> </FormItem> <FormItem label="Switch"> <i-switch v-model="formItem.switch" size="large"> <span slot="open">On</span> <span slot="close">Off</span> </i-switch> </FormItem> <FormItem label="Slider"> <Slider v-model="formItem.slider" range></Slider> </FormItem> <FormItem label="Text"> <Input
                                  v-model="formItem.textarea" type="textarea" :autosize="{minRows: 2,maxRows: 5}" placeholder="Enter something..." ></Input> </FormItem> <FormItem> <Button type="primary">Submit</Button> <Button style="margin-left: 8px">Cancel</Button> </FormItem> <FormItem> <router-link :to="{name:'list'}"> <Button size="small" type="primary">跳轉到列表頁</Button> </router-link> <router-link :to="{name:'is'}"> <Button size="small" type="primary">跳轉到is頁</Button> </router-link> </FormItem> </Form> </div> </template> <script> export default { name: "detail", mixins: [], components: {}, filters: {}, props: [], computed: {}, data() { return { formItem: { input: "", select: "", radio: "male", checkbox: [], switch: true, date: "", time: "", slider: [20, 50], textarea: "" } }; }, watch: {}, created() { }, mounted() { }, methods: { // 重置表單 init() { this.$refs[formCustom].resetFields(); } }, // 路由進來之前,判斷是從哪個頁面過來的,設置不同的keepAlive屬性 beforeRouteEnter(to, from, next) { if (from.name === "list") { to.meta.keepAlive = true; } else { to.meta.keepAlive = false; } next(); // beforeRouteEnter不能通過this訪問組件實例,但是可以通過 vm 訪問組件實例(剛開始錯誤寫法) // next(vm => { //     if (from.name === "list") { //         // 在這里修改keepAlive值,是不能緩存數據的,因為在next()里面的代碼,是在vue掛載之后執行,處于activated之后,此時activated中keepAlive還是false //         vm.$route.meta.keepAlive = true; //     } else { //         vm.$route.meta.keepAlive = false; //     } // }); }, // 路由離開之前,判斷去往哪個頁面,設置不同的keepAlive屬性 beforeRouteLeave(to, from, next) { if (to.name === "list") { this.$route.meta.keepAlive = true; } else { this.$route.meta.keepAlive = false; } next(); }, activated() { // 此方法在頁面緩存時會被調用(this.$route.meta.keepAlive為true時),根據路由元信息決定是否重新加載數據。不加載則是上次填寫完的數據 // console.log(this.$route.meta.keepAlive); } }; </script> <style scoped lang="less"> .detail { position: relative; height: 100%; width: 100%; } </style>  
                              
          3. 插槽slot
            解構插槽 Prop:可以傳遞子組件的變量

            // 子組件 <template> <div class="isComponent"> <slot name='one' :childStr='childStr'></slot> <slot name='two'></slot> <slot></slot> </div> </template> <script> export default { name: "isComponent", data() { return { childStr: 'i am a child', }; } }; </script> <style scoped> </style> // 父組件 <is-component> <template #one="{childStr}">{{childStr}}</template> <template v-slot:two> two </template> <template> default </template> </is-component>  
                    

            效果:// i am a child two default

          4. 強制刷新某個div

            vue實現F5刷新整個頁面無空白無間隔時間

          5. 修飾符
            事件修飾符:

            1. .stop:相當于原生JS中event.stopPropagation(),阻止事件冒泡。

            2. .prevent:相當于原生JS中event.preventDefault(),阻止默認事件的發生。

            3. .capture:事件冒泡的方向相反,事件捕獲由外到內。即有冒泡發生時,有該修飾符的dom元素會先執行,如果有多個,從外到內依次執行。

            4. .self:只會觸發自己范圍內的事件,不包含子元素。
              在這里插入圖片描述

            5. .once:事件只能觸發一次。

            6. .passive:事件會執行默認方法。

              注:

              1. 每次事件產生,瀏覽器都會去查詢一下是否有preventDefault阻止該次事件的默認動作。我們加上passive就是為了告訴瀏覽器,不用查詢了,我們沒用preventDefault阻止默認動作。
              2. passiveprevent沖突,不能同時綁定在一個監聽器上

            按鍵修飾符: 去官網查看即可,這里不過多解釋。Vue.js-修飾符

          6. :is: 動態組件

            優點:使代碼更符合HTML語法驗證

            官網是這么解釋的
            在這里插入圖片描述

            // 父組件: <template> <div class="is"> <table> <tr :is='is'></tr> </table> </div> </template> <script> import isComponent from '../components/isComponent' export default { name: "is", components: { isComponent }, data() { return { is: 'isComponent' }; } }; </script> <style scoped> </style> // 子組件: <template> <div class="isComponent"> <span>我是tr</span> </div> </template> <script> export default { name: "isComponent", data() { return {}; } }; </script> <style scoped> </style>  
                    
          7. @click.native: 在封裝好的組件上使用,要加上.native才能click。

            1. router-link 加上@click事件,綁定的事件會無效因為:router-link的作用是單純的路由跳轉,會阻止click事件,你可以試試只用click不用native,事件是不會觸發的。此時加上.native,才會觸發事件。
            2. 根據Vue2.0官方文檔關于父子組件通訊的原則,父組件通過prop傳遞數據給子組件,子組件觸發事件給父組件。但父組件想在子組件上監聽自己的click的話,需要加上native修飾符。

            // router-link <router-link :to="{name:'detail'}" @click.native="handleNative"> <Button size="small" type="primary">測試native</Button> </router-link> // 自己封裝的組件 <is-component @click.native="handleNative"></is-component>


          作者:

          轉自:https://blog.csdn.net/a5252145/article/details/107316953?utm_medium=distribute.pc_category.427508.nonecase&depth_1-utm_source=distribute.pc_category.427508.nonecase

          JavaScript專題之深淺拷貝(系列五)[轉載]

          前端達人

          JavaScript專題之深淺拷貝

          了解拷貝背后的過程,避免不必要的錯誤,Js專題系列之深淺拷貝,我們一起加油~

          目錄

          一、拷貝示例

          當我們在操作數據之前,可能會遇到這樣的情況:

          1. 會經常改動一組數據,但可能會用到原始數據
          2. 我需要兩組一樣的數據,但我不希望改動一個另一個隨之改動
          3. 我需要對數據操作前后進行對比

          當我們遇到類似需要場景時,首先想到的就是拷貝它,殊不知拷貝也大有學問哦~

          下面簡單的例子,你是否覺得熟悉?

          1.1 基本類型拷貝示例
          var str = 'How are you'; var newStr = str; newStr = 10 console.log(str); // How are you console.log(newStr); // 10 
          

          大家都能想到,字符串是基本類型,它的值保存在棧中,在對它進行拷貝時,其實是為新變量開辟了新的空間。 strnewStr就好比兩個一模一樣的房間,布局一致卻毫無關聯。

          1.2 引用類型拷貝示例
          var data = [1, 2, 3, 4, 5]; var newData = data; newData[0] = 100; console.log(data[0]); // 100 console.log(newData[0]); // 100 
          

          類似的代碼段,但這次我們使用數組這個引用類型舉例,你會發現修改賦值后的數據,原始數據也跟著改變了,這顯然不滿足我們的需要。本篇文章就來聊一聊引用數據拷貝的學問。

          如果大家對Js的數據類型存在著疑問,不妨看看《JavaScript中的基本數據類型》

          在這里插入圖片描述

          二、淺拷貝

          拷貝的劃分都是針對引用類型來討論的,淺拷貝——顧名思義,淺拷貝就是“淺層拷貝”,實際上只做了表面功夫:

          var arr = [1, 2, 3, 4]; var newArr = arr; console.log(arr, newArr); // [1,2,3,4] [1,2,3,4] newArr[0] = 100; console.log(arr, newArr) // [100,2,3,4] [100,2,3,4] 
          

          不發生事情(操作)還好,一旦對新數組進行了操作,兩個變量中所保存的數據都會發生改變。

          發生這類情況的原因也是因為引用類型的基本特性:

          • 存儲在變量處的值是一個指針(point),指向存儲對象的內存地址。賦值給新變量相當于配了一把新鑰匙,房間并沒有換。

          數組中的slice和concat都會返回一個新數組,我們一起來試一下:

          var arr = [1,2,3,4]; var res = arr.slice(); // 或者 res = arr.concat() res[0] = 100; console.log(arr); // [1,2,3,4] 
          

          這個問題這么快就解決了?雖然對這一層數據進行了這樣的的處理后,確實解決了問題,但!

          var arr = [ { age: 23 }, [1,2,3,4] ]; var newArr = arr.concat(); arr[0].age = 18; arr[1][0] = 100; console.log(arr) // [ {age: 18}, [100,2,3,4] ] console.log(newArr) // [ {age: 18}, [100,2,3,4] ] 
          

          果然事情沒有那么簡單,這也是因為數據類型的不同。

          S 不允許我們直接操作內存中的地址,也就是說不能操作對象的內存空間,所以,我們對對象的操作都只是在操作它的引用而已。

          既然淺拷貝達不到我們的要求,本著效率的原則,我們找找有沒有幫助我們實現深拷貝的方法。

          在這里插入圖片描述

          三、深拷貝的方法?

          數據的方法失敗了,還有沒有其他辦法?我們需要實現真正意義上的拷貝出獨立的數據。

          3.1 JSON

          這里我們利用JSON的兩個方法,JSON.stringify()JSON.parse()來實現最簡潔的深拷貝

          var arr = ['str', 1, true, [1, 2], {age: 23}] var newArr = JSON.parse( JSON.stringify(arr) ); newArr[3][0] = 100; console.log(arr); // ['str', 1, true, [1, 2], {age: 23}] console.log(newArr); // ['str', 1, true, [100, 2], {age: 23}] 
          

          這個方法應該是實現深拷貝最簡潔的方法,但是,它仍然存在問題,我們先來看看剛才都做了些什么:

          1. 定義一個包含都過類型的數組arr
          2. JSON.stringify(arr), 將一個 JavaScript 對象或值轉換為 JSON 字符串
          3. JSON.parse(xxx), 方法用來解析JSON字符串,構造由字符串描述的值或對象

          理解:

          我們可以理解為,將原始數據轉換為新字符串,再通過新字符串還原為一個新對象,這中改變數據類型的方式,間接的繞過了拷貝對象引用的過程,也就談不上影響原始數據。

          限制:

          這種方式成立的根本就是保證數據在“中轉”時的完整性,而JSON.stringify()將值轉換為相應的JSON格式時也有缺陷:

          • undefined、任意的函數以及 symbol 值,在序列化過程中會被忽略(出現在非數組對象的屬性值中時)或者被轉換成 null(出現在數組中時)。
          • 函數、undefined 被單獨轉換時,會返回 undefined,
            • 如JSON.stringify(function(){})
            • JSON.stringify(undefined)
          • 對包含循環引用的對象(對象之間相互引用,形成無限循環)執行此方法,會拋出錯誤。
          • NaN 和 Infinity 格式的數值及 null 都會被當做 null。
          • 其他類型的對象,包括 Map/Set/WeakMap/WeakSet,僅會序列化可枚舉的屬性。

          所以當我們拷貝函數、undefined等stringify轉換有問題的數據時,就會出錯,我們在實際開發中也要結合實際情況使用。

          舉一反三:

          既然是通過改變數據類型來繞過拷貝引用這一過程,那么單純的數組深拷貝是不是可以通過現有的幾個API來實現呢?

          var arr = [1,2,3]; var newArr = arr.toString().split(',').map(item => Number(item)) newArr[0] = 100; console.log(arr); // [1,2,3] console.log(newArr); // [100,2,3] 
          

          注意,此時僅能對包含純數字的數組進行深拷貝,因為:

          1. toString無法正確的處理對象和函數
          2. Number無法處理 false、undefined等數據類型

          但我愿稱它為純數字數組深拷貝!

          在這里插入圖片描述

          3.2 Object.assign()

          有的人會認為Object.assign(),可以做到深拷貝,我們來看一下

          var obj = {a: 1, b: { c: 2 } } var newObj = Object.assign({}, obj) newObj.a = 100; newObj.b.c = 200; console.log(obj); // {a: 1, b: { c: 200 } } console.log(newObj) // {a: 100, b: { c: 200 } } 
          

          神奇,第一層屬性沒有改變,但第二層卻同步改變了,這是為什么呢?

          因為 Object.assign()拷貝的是(可枚舉)屬性值。

          假如源值是一個對象的引用,它僅僅會復制其引用值。MDN傳送門

          四、自己實現深淺拷貝

          既然現有的方法無法實現深拷貝,不妨我們自己來實現一個吧~

          4.1 淺拷貝

          我們只需要將所有屬性即其嵌套屬性原封不動的復制給新變量一份即可,拋開現有的方法,我們應該怎么做呢?

          var shallowCopy = function(obj) { if (typeof obj !== 'object') return; // 根據obj的類型判斷是新建一個數組還是對象 var newObj = obj instanceof Array ? [] : {}; // 遍歷obj,并且判斷是obj的屬性才拷貝 for (var key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] = obj[key]; } } return newObj; } 
          

          我們只需要將所有屬性的引用拷貝一份即可~

          4.2 深拷貝

          相信大家在實現深拷貝的時候都會想到遞歸,同樣是判斷屬性值,但如果當前類型為object則證明需要繼續遞歸,直到最后

          var deepCopy = function(obj) { if (typeof obj !== 'object') return; var newObj = obj instanceof Array ? [] : {}; for (var key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key]; } } return newObj; } 
          

          我們用白話來解釋一下deepCopy都做了什么

          const obj = [1, { a: 1, b: { name: '余光'} } ]; const resObj = deepCopy(obj); 
          • 讀取 obj,創建 第一個newObj
            • 判斷類型為 []
            • key為 0 (for in 以任意順序遍歷,我們假定按正常循序遍歷)
            • 判斷不是引用類型,直接復制
            • key為 1
            • 判斷是引用類型
            • 進入遞歸,重新走了一遍剛才的流程,只不過讀取的是obj[1]

          另外請注意遞歸的方式雖然可以深拷貝,但是在性能上肯定不如淺拷貝,大家還是需要結合實際情況來選擇。




          作者: 

          轉自:https://blog.csdn.net/jbj6568839z/article/details/107964274?utm_medium=distribute.pc_category.none-task-blog-hot-4.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-4.nonecase&request_id=

          最詳細完整的flex彈性布局

          前端達人

          初了解

          在學習彈性布局之前首先就要明白其概念
          flex 就是flexible box的縮寫,意為彈性布局,用來為盒裝模型提供最大的靈活性
          任何一個容器都可以指定為flex布局

          .box{ display: flex; } 
          

          行內元素當然也可以使用flex布局

          .box{ display: inline-flex; } 
          

          Webkit 內核的瀏覽器,必須加上-webkit前綴。

          .box{ display: -webkit-flex; /* Safari */ display: flex; } 
          

          注意:設為 Flex 布局以后,子元素的float、clear和vertical-align屬性將失效。

          基本概念

          采用 Flex 布局的元素,稱為 Flex 容器(flex container),簡稱"容器"。它的所有子元素自動成為容器成員,稱為 Flex 項目(flex item),簡稱"項目"。
          在這里插入圖片描述
          容器默認存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開始位置(與邊框的交叉點)叫做main start,結束位置叫做main end;交叉軸的開始位置叫做cross start,結束位置叫做cross end。
          項目默認沿主軸排列。單個項目占據的主軸空間叫做main size,占據的交叉軸空間叫做cross size。
          以上這些基礎概念,請務必牢記,下面說屬性時,不再重復說明!

          屬性

          容器屬性(container)

          • flex-direction
          • justify-content
          • align-items
          • flex-wrap
          • align-content
          • flex-flow

          1.flex-direction

           flex items默認都是沿著main axis(主軸)從main start 開始往main end方向排布
              flex-direction決定了main axis的方向,有四個取值row(默認值)、row-reverse、column、column-reverse 
          
          .box { flex-direction: row | row-reverse | column | column-reverse; } 
          

          row(默認值):主軸為水平方向,起點在左端。
          row-reverse:主軸為水平方向,起點在右端。
          column:主軸為垂直方向,起點在上沿。
          column-reverse:主軸為垂直方向,起點在下沿。

          2.justify-content

           justify-content決定了flex item在main axis上的對齊方式
          
              flex-start(默認值):與main start對齊
              flex-end:與main end對齊
              center:居中
              space-between:flex items 之間的距離相等,與main start、main end兩端對齊
              space-evently: flex items 之間的距離相等,flex items與main start 、main end 之間的距離等于flex items之間的距離
              space-around :flex items 之間的距離相等,flex items與main start 、main end 之間的距離等于flex items之間的距離的一半 
          

          這個屬性的目的主要就是為了排列main axis的item位置
          在這里插入圖片描述

          在這里插入圖片描述
          當然,這些屬性你可以自己嘗試一下,這里就不再一一嘗試了,但是注意,這些都是容器的屬性,要寫在容器的css中!

          3.align-items

           決定flex items在cross axis上的對齊方式
          
              normal:在彈性布局中,效果和stretch一樣
              stretch:前提是items不設置高度,當flex items 在cross axis 方向的size為auto時,會自動拉伸至填充flex container(或者換句話說:如果項目未設置高度或設為auto,將占滿整個容器的高度。)
              flex-satrt:與cross start 對齊
              flex-end:與cross end 對齊
              center:居中對齊
              baseline:與基準線對齊 
          

          4.flex-wrap

           決定了flex container 是單行還是多行
              nowrap(默認):單行
              warp:多行
              //這個比較少用
              wrap-reverse:多行(對比wrap,cross start 與cross end相反) 
          

          默認情況下,項目都排在一條線(又稱"軸線")上。flex-wrap屬性定義,如果一條軸線排不下,如何換行。

          5 align-content

           決定了多行flex items 在cross axis的對齊方式 用法與justify-content相似 一個是橫軸。一個控制豎軸
              stretch(默認值):與align-items的stretch類似,當items有高度的時候,無效果
              flex-start:與cross start 對齊
              flex-end :與cross end 對齊
              center:居中對齊
              space-between:flex items 之間的距離相等,與cross start、cross end兩端對齊
              space-evently: flex items 之間的距離相等,flex items與cross start 、cross end 之間的距離等于flex items之間的距離
              space-around :flex items 之間的距離相等,flex items與cross start 、cross end 之間的距離等于flex items之間的距離的一半 
          

          6 flex-flow 是flex-direction與flex-wrap的簡寫

          也就是說,當你使用這個屬性的時候,你可以使用上述兩個的屬性值,例如:flex-flow: row wrap;(水平排列,多行顯示)

          flex 項目屬性(item屬性)

          • order
          • flex-grow
          • flex-shrink
          • flex-basis
          • align-self
          • flex

          1 order

           order 決定flex items的排布順序  (用的不多)
              可以設置為任意整數(正整數、負整數、0),值越小越排在前面
              默認值為0 
          

          這個屬性了解即可,說實話沒怎么用過

          2 align-self

           可以通過align-self 覆蓋flex container 設置的align-items
              auto(默認值):遵從flex container的align-items設置
              stretch、flex-start、flex-end、center、baseline效果與align-items一致 
          

          相當于繼承父元素的align-items屬性,如果沒有父元素,則等同于stretch。

          3 flex-grow

           決定了flex items如何擴展
              可以設置為任意非父數字(小數,整數 0),默認為0
              當flex container 在main axis方向上有剩余得size時,flex-grow屬性才會有效
          
              如果所有flex items 的flex-grow 綜合sum不超過1,這直接乘以剩余size就是擴展大小、
              如果超過1 擴展size=剩余size*flex-grow/sum 
          

          flex-grow屬性定義項目的放大比例,默認為0,即如果存在剩余空間,也不放大。

          4 flex-shrink

          flex-shrink (shrink 縮小,收縮)與flex-grow相似,一個擴展,一個伸縮 
              可以設置為任意非父數字(小數,整數 0),默認為1
              當flex items在main axis 方向上超過了flex container 的size flex-shrink屬性才會生效、
              如果所有flex items 的flex-shrink 總和sum超過1,每個flex item 收縮的size為:
                  flex item 超出flex container 的size*收縮比例/每個flex items 的收縮比例之和
              如果sum不超過1,每個flex item 收縮的size為:
                  size = 超出的size * flex-shrink值
              flex items收縮后的最終size不能小于min-width\min-height 
          

          有擴大自然就會有縮小,flex-shrink屬性定義了項目的縮小比例,默認為1,即如果空間不足,該項目將縮小。
          如果所有項目的flex-shrink屬性都為1,當空間不足時,都將等比例縮小。如果一個項目的flex-shrink屬性為0,其他項目都為1,則空間不足時,前者不縮小。具體的可以自己動手嘗試一下哦,最后將會給出一個骰子布局的案例!

          5 flex-basis

          用來設置flex items 在 main axis方向上的base size
              默認為auto,可以設置具體的寬度數值
          
              決定flex items最終base size 的因素,優先級從高到低
                  max-width\max-height\min-width\min-height
                  flex-basis
                  width\height
                  內容本身的size 
          

          flex-basis屬性定義了在分配多余空間之前,項目占據的主軸空間(main size)。瀏覽器根據這個屬性,計算主軸是否有多余空間。它的默認值為auto,即項目(item)的本來大小。也可以設置跟width,height一樣的寬高,表示item將占據固定的空間!

          6 flex

          flex 是flex-grow || flex-shink||flex-basis的簡寫
          可以指定1 2 3個值 依次按照上述順序!默認值為 0 1 auto 
          
          .item { flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] } 
          

          注意:

          1. 該屬性的默認值為 0 1 auto(注意順序),后兩個屬性可選
          2. 該屬性有兩個快捷值:auto (1 1 auto) 和 none (0 0 auto)。
          3. 如果需要這三個屬性的時候,建議使用flex,而不是單獨的三個分離的屬性,因為瀏覽器會推算相關值

          骰子布局實踐

          光說不練假把式,手撕代碼真功夫!
          下面利用flex寫了幾個骰子布局,可以參考一下!

           
          
          <!DOCTYPE html>
          <html>
              <head>
                  <meta charset="utf-8">
                  <title></title>
                  <style type="text/css">
                      #container{
                          background-color: #CCCCCC;
                          height: 600px;
                          width: 500px;
                          /* flex */
                          display: flex;
                          justify-content: space-evenly;
                          align-items: center;
                      }
                      .item{
                          background-color: yellow;
                          width: 100px;
                          height: 100px;
          
                      }
                      /* 單點 */
                      .one{
                          /* 對點使用flex布局 */
                          display: flex;
                          justify-content: center;
                          align-items: center;
                      }
                      /* 點 */
                      .item-one{
                          display: block;
                          height: 20px;
                          width: 20px;
                          background-color: #1890FF;
                          border-radius: 50%;
                      }
                      /* 三點 */
                      .two{
          
                          display: flex;
                          justify-content: space-between;
                      }
                      .two span{
                          margin: 2px;
                          display: block;
                          height: 20px;
                          width: 20px;
                          border-radius: 50%;
                          background-color: #1890FF;
                      }
                      .two2{
                          align-self: center;
                      }
                      .two3{
                          align-self: flex-end;
                      }
                      /* 五點 */
                      .three{
                          display: flex;
                          justify-content: space-around;
                      }
                      .three span{
                          display: block;
                          height: 20px;
                          width: 20px;
                          border-radius: 50%;
                          background-color: #1890FF;
                      }
                      #three_one, #three_three{
                          padding: 2px;
                          display: flex;
                          flex-direction: column;
                          justify-content: space-between;
                      }
                      #three_two{
                          display: flex;
                          flex-direction: column;
                          justify-content: center;
                      }
                      /* 六點 */
                      .four{
                          display: flex;
                          justify-content: space-around;
                      }
                      .four span{
                          display: block;
                          height: 20px;
                          width: 20px;
                          border-radius: 50%;
                          background-color: #1890FF;
                      }
                      #four1,#four2{
                          padding: 2px;
                          display: flex;
                          flex-direction: column;
                          justify-content: space-between;
                      }
                  </style>
              </head>
              <body>
                  <div id="container">
                      <!-- 一個點居中 -->
                      <div class="item one">
                          <span class="item-one"></span>
                      </div>
                      <!-- 三點 -->
                      <div class="item two">
                          <span class="two1"></span>
                          <span class="two2"></span>
                          <span class="two3"></span>
                      </div>
                      <!-- 五點 -->
                      <div class="item three">
                          <div id="three_one">
                              <span></span>
                              <span></span>
                          </div>
                          <div id="three_two">
                              <span></span>
                          </div>
                          <div id="three_three">
                              <span></span>
                              <span></span>
                          </div>
                      </div>
                      <!-- 六點 -->
                      <div class="item four">
                          <div id="four1">
                              <span></span>
                              <span></span>
                              <span></span>
                          </div>
                          <div id="four2">
                              <span></span>
                              <span></span>
                              <span></span>
                          </div>
                      </div>
          
                  </div>
              </body>
          </html>

          測試結果

          在這里插入圖片描述



          手機appUI界面設計賞析(六)

          前端達人

          手機UI中的交互是保持產品鮮活生命力的源動力。好的交互可以幫助用戶快速地獲得反饋,認知布局,增強體驗感和沉浸感。

          手機UI中的交互是保持產品鮮活生命力的源動力。好的交互可以幫助用戶快速地獲得反饋,認知布局,增強體驗感和沉浸感。這里為大家整理了12款優秀并富有創意的交互作品,為你的產品設計注入靈感。

          微信圖片_20200813161550.png


             --手機appUI設計--


          微信圖片_20200813161602.png



             --手機appUI設計--


          微信圖片_20200813161606.png


             --手機appUI設計--


          微信圖片_20200813161617.png



             --手機appUI設計--


          微信圖片_20200813161622.png



             --手機appUI設計--


          微信圖片_20200813161629.png



             --手機appUI設計--


          微信圖片_20200813161633.png



             --手機appUI設計--


          微信圖片_20200813161644.png



             --手機appUI設計--


          微信圖片_20200813161647.jpg



             --手機appUI設計--


          微信圖片_20200813161650.jpg



             --手機appUI設計--


          微信圖片_20200813161653.jpg



             --手機appUI設計--


          微信圖片_20200813161702.jpg



             --手機appUI設計--


          微信圖片_20200813161710.jpg



             --手機appUI設計--


          微信圖片_20200813161713.png



             --手機appUI設計--


          微信圖片_20200813161718.jpg



             --手機appUI設計--


          微信圖片_20200813161722.png



             --手機appUI設計--


          微信圖片_20200813161724.jpg



             --手機appUI設計--


          微信圖片_20200813161728.jpg



             --手機appUI設計--


          微信圖片_20200813161748.png



             --手機appUI設計--


          (以上圖片均來源于網絡)



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



            更多精彩文章:

                 手機appUI界面設計賞析(一)

                 手機appUI界面設計賞析(二)

                 手機appUI界面設計賞析(三)

                 手機appUI界面設計賞析(四)

                 手機appUI界面設計賞析(五)




          提升UI界面設計效果的快速檢查清單

          濤濤


          這并不是一篇關于設計趨勢的文章,而是一篇關于基礎的設計準則的文章。如果你是一名 UI 設計師,無論你經驗是否豐富,有些設計的基準是需要保證的,有些容易遺忘的細節,需要借助速查清單來進行走查優化。

          這份優化 UI 界面的速查清單,就是幫你搞定這件事情的。

          1、字體版式

          首先聲明,一個項目中最好不要使用超過2種主要字體。不過這種原則已經廣為流傳,就不多說了,下面說說更細節的事情:

          1.1、注意大寫

          純大寫的字母文本,要額外拉開字母之間的字間距,提升可讀性。

          提升UI界面設計效果的快速檢查清單

          1.2、注意超細體的字體

          字重超細的字體要謹慎使用。可以使用淺色,但是要根據字體情況進行選擇。如果你設計的文本是裝飾性也就算的,如果是需要用戶能清晰閱讀的,就要特別慎重,能不用就不用,否則在部分手機屏幕上看起來會非常糟糕。

          提升UI界面設計效果的快速檢查清單

          1.3、標題和正文字體尺寸

          先說說網頁排版。標題通常分 H1 到 H6 總計6個不同層級,但是通常不會全部用到,你需要確保層級最多不超過 4 個,并且控制它們整體的邏輯和一致性。網頁的首屏和登錄頁面上的大標題,可以用最大的那一級,畢竟,富有表現力的視覺排版是當下趨勢。

          但是其他的文本不要和這個標題文本差距太大。英文文本以Chrome 瀏覽器為例,正文使用 16px 和 17px 這種大小,并且保留 12px 文本作為最小文本。

          另外,同一個段落中,不要同時使用 16px 和 17px 這樣相近又不同的文本尺寸,會讓用戶感到迷惑。

          1.4、行高

          盡量不要在行高上采用自動行高。通常,現在比較流行的做法,是將行高拉高一些,確保整體版面的透氣性和可讀性,尤其是涉及到大量文本的時候。

          提升UI界面設計效果的快速檢查清單

          1.5、文本和標題的層次結構

          在需要突出顯示的部分使用粗體。標題、鏈接、按鈕都在這個范疇內。如果將粗體樣式應用到全部文本,這樣重點就不突出了。

          提升UI界面設計效果的快速檢查清單

          1.6、文字對比

          請特別注意文本的色彩??刂坪脤Ρ榷龋_保任何類型的顯示器上都可以清晰閱讀。在設計占位符文本的時候,這個問題特別突出。

          提升UI界面設計效果的快速檢查清單

          2、間距和邊距

          留白對于整體設計的重要性是毋庸置疑的。留白的變化有助于設計師理清元素之間的關系,提供節奏感,增加平衡感。

          2.1、去掉多余的框架和線條

          將一個語義塊和另外一個語義塊分開,最簡單的方法就是在兩者之間增加一條 1px 的線。但是這并不是最好的方法。

          我見過不少設計作品中,界面中一個又一個線條繪制的盒子相互嵌套,復雜無比,每個盒子都是用 1px 粗細的線繪制的。但是,如今的UI界面上基本不用這種手法了,大量的卡片替代了以往的各種「盒子」,通過投影和間距來控制卡片之間的關系。

          提升UI界面設計效果的快速檢查清單

          2.2、梳理從屬關系

          邊距有助于從視覺上來判斷元素之間的親疏關系。當我們考慮一個新聞資訊卡片的布局的時候,它包含有一張圖片、一個標題,還有3~4行預覽文本和發布日期,那么應該如何分組和間隔?標題和文本應該是一組,這一組和圖片、日期的距離更遠一些。聽起來很令人困惑?看下面的圖片你就理解了:

          提升UI界面設計效果的快速檢查清單

          2.3、少即是多

          總會有客戶或者產品會想把所有的功能和元素都懟到同一個頁面或者 APP 當中。這個時候,要你讓標題、菜單、文本、特價優惠、社交帳號和電話號碼都齊齊整整地塞到一起,同時還要給每個組件搭配上圖標。

          說真的,這種問題總不能避免。這個時候可以使用這個理由來試圖進行溝通:用戶一次接收的信息越少,進行有效操作的可能性就越大。循序漸進地呈現信息,能夠讓人更加愉悅,用戶對于信息的接受性也更強。

          用戶永遠都不會費力巴拉地去拆解和分析你的頁面布局,緊密局促的布局也早已不符合主流審美和日常需求了。

          2.4、屏幕邊緣留白不均勻

          如果你設計的是海報、Banner 或者是 卡片 等我們所熟知的視覺元素,那么請注意邊緣留白的設計。如果按照經典的方式來布置(從左上到右下),那么盡量讓上方的留白更大,這看起來會讓視覺更加穩當,并且更加具有視覺吸引力。

          提升UI界面設計效果的快速檢查清單

          3、配色和圖像

          Logo、圖像、圖標、背景這些元素決定了整個設計給人的情緒。所以在設計的時候,需要有針對性地挑選和優化。

          3.1、關于 LOGO

          我并不經常做 LOGO,但是在我的職業生涯中也起碼做過 20 個LOGO。我的經驗是:好 LOGO 很難制作。但是設計師只要遵循基本的原則,就能創建出像樣的 LOGO。

          比如仔細選擇配色。我有一次看到一家名為 「VIP catch」 的釣魚用品店,他們使用了紫色的 LOGO,從名字、配色到色彩的選擇都和釣魚這個場景沒有一點關系。如果選對配色,有針對性地加入一些和釣魚相關的元素,其實也就好了。

          另外就是,如果你時間有限,就不要試圖給品牌 LOGO 設計一個特定的符號或者圖形了,因為真的很難做好。最好制作成文本 LOGO,通過微調字體來制作。

          3.2、陰影

          元素下方的陰影一定不要用黑色。始終基于表層的、前景的元素來選取陰影的顏色和明暗。通常,一個看起來舒適的陰影是通過多個陰影疊加造就的,一個小且明確的陰影,位于正下方,另外一個陰影模糊且彌散,透明度更高。

          提升UI界面設計效果的快速檢查清單

          3.3、圖標和圖像

          任何可以矢量化的元素,都盡量制作成為矢量的。從符號、箭頭到 LOGO ,現在都最好制作成為矢量 SVG 格式,方便開發人員嵌入到設計系統當中。PNG 圖標的邊緣模糊,在清晰度越來越高的視網膜屏幕上,矢量圖形元素不僅更加銳利,而且消耗更少的系統資源。

          如果你正在為網站處理一組圖標,請盡量確保這些圖標在視覺風格和細節處理上是統一的,看起來是同屬一個「家族」的。這意味著圖標的筆觸寬度、邊框半徑、視覺重量都應該是一樣的。

          4、其他設計常識

          除了上面的幾個常見的要點之外,我還要額外補充幾點,它們很難直接歸結為一類,但是同樣重要。

          提升UI界面設計效果的快速檢查清單

          4.1、避免使用怪異的布局

          很多 UI 界面元素在過去多年的發展過程中,已經形成了認知廣泛的「最佳實踐」。如果在設計這些 UI 組件的時候,采用打破甚至徹底違背「最佳實踐」的做法,比如將圖片+標題+ 文本 的順序打亂,可能會讓人感到迷惑。

          熟悉的設計并不意味著無聊,你總能夠在 UI 界面的一些地方找到發揮創造力的地方,而不是在這些有著清晰規則的地方搞創新。設計師和藝術家是截然不同的職業,在設計過程中,創意沖動應該在不干擾用戶體驗的前提下,進行發揮。

          提升UI界面設計效果的快速檢查清單

          4.2、布局尺寸和參數

          在設計移動端 UI 界面之前,應該和開發人員進行充分的溝通,這一點很重要。iOS 和 Android 端的 APP 的尺寸還相對固定,但是如果你設計的是移動端的網頁,那么可能涉及到的頁面尺寸就非常多了,這個時候就要用到斷點非常多的網格系統來進行響應式的設計了。

          4.3、亂數假文

          Lorem Ipsum 在中文中叫亂數假文,它是自動生成的一種占位符。在如今的設計領域當中,直接使用亂數假文看起來非常不專業,因為無論是 Sketch 還是 Figma 當中都有太多的插件,可以幫你生成符合語境的占位符內容。在此基礎上還有另外一個要點,就是展示性的組件內容也不要簡單地復制,盡量使用不同的圖片和配色,讓它們看起來更加真實。

          結語

          這份UI快速檢查清單目前是比較符合當下 UI 設計行業的需求的,但是它并非是教條,在特定的情況下,你可能不用遵循它。當然,在多數時候,這份清單能夠幫你讓設計更加優秀。

          文章來源:優設    作者:Anna Sh

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

          日歷

          鏈接

          個人資料

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

          存檔

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