如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里
來源:UI中國
藍(lán)藍(lán)設(shè)計(jì)( m.wnxcall.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)。
如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里
按照這個(gè)來配置就好了,這里相當(dāng)于是幫你把webpack需要的繁瑣的配置給你都弄好了,然后你直接從那里全部下下來就可以
記得先下好nodejs,安裝的代碼記得全都c v,不要自己敲
安裝完nodejs之后再安裝淘寶npm鏡像,安裝完了之后后面的安裝速度會快一點(diǎn)
npm install -g cnpm --registry=https://registry.npm.taobao.org
1
然后按照下面的五步流程一個(gè)一個(gè)來
1、全局安裝vue-cli
npm install -g vue-cli
1
2、進(jìn)入目錄–初始化項(xiàng)目
vue init webpack my-project //這個(gè)要進(jìn)入項(xiàng)目目錄再用,會創(chuàng)建一個(gè)my-project的文件夾
1
3、進(jìn)入項(xiàng)目
cd my-project
1
4、安裝依賴
npm install
1
5、啟動項(xiàng)目
npm run dev
1
以上執(zhí)行完后會出現(xiàn)一個(gè) my-project 項(xiàng)目文件夾,用vscode打開后會看到以下目錄
下面解釋一下這些文件及目錄分別是干什么的
目錄結(jié)構(gòu)的分析
1、bind
├── build // 項(xiàng)目構(gòu)建(webpack)相關(guān)代碼 記憶:(夠賤) 9個(gè)
│ ├── build.js // 生產(chǎn)環(huán)境構(gòu)建代碼
│ ├── check-versions.js // 檢查node&npm等版本
│ ├── dev-client.js // 熱加載相關(guān)
│ ├── dev-server.js // 構(gòu)建本地服務(wù)器
│ ├── utils.js // 構(gòu)建配置公用工具
│ ├── vue-loader.conf.js // vue加載器
│ ├── webpack.base.conf.js // webpack基礎(chǔ)環(huán)境配置
│ ├── webpack.dev.conf.js // webpack開發(fā)環(huán)境配置
│ └── webpack.prod.conf.js // webpack生產(chǎn)環(huán)境配置
2、config
├── config// 項(xiàng)目開發(fā)環(huán)境配置相關(guān)代碼 記憶: (環(huán)配) 3個(gè)
│ ├── dev.env.js // 開發(fā)環(huán)境變量(看詞明意)
│ ├── index.js //項(xiàng)目一些配置變量
│ └── prod.env.js // 生產(chǎn)環(huán)境變量
3、node_modules
├──node_modules// 項(xiàng)目依賴的模塊 記憶: (依賴) *個(gè)
4、src
├── src// 源碼目錄 5
1
│ ├── assets// 資源目錄
│ │ └── logo.png
2
│ ├── components// vue公共組件
│ │ └── Hello.vue
3
│ ├──router// 前端路由
│ │ └── index.js// 路由配置文件
4
│ ├── App.vue// 頁面入口文件(根組件)
5
│ └── main.js// 程序入口文件(入口js文件)
5、static
└── static// 靜態(tài)文件,比如一些圖片,json數(shù)據(jù)等
│ ├── .gitkeep
6、剩余的文件
├── .babelrc// ES6語法編譯配置
├── .editorconfig// 定義代碼格式
├── .gitignore// git上傳需要忽略的文件格式
├── index.html// 入口頁面
├── package.json// 項(xiàng)目基本信息
├── README.md// 項(xiàng)目說明
---------------------
藍(lán)藍(lán)設(shè)計(jì)( m.wnxcall.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)。
如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里
項(xiàng)目概述QQ 20周年,是互聯(lián)網(wǎng)產(chǎn)品長青的一個(gè)傳說,就在 20 周年的時(shí)間節(jié)點(diǎn),QQ 向用戶提供一份關(guān)于他自己的、真誠熱切的 QQ 數(shù)據(jù)總結(jié)。通過數(shù)字,匯集出每個(gè)人自己的 QQ 時(shí)光歷程,從而牽引出每個(gè)人對于成長、青春、溝通、時(shí)代流動的感知與回憶,引發(fā) 2019 年一場集體的情感共鳴。
△ QQ 20年來的一路變遷
項(xiàng)目歷時(shí)兩個(gè)月,從項(xiàng)目初期,視覺和產(chǎn)品密集溝通,了解需求,進(jìn)行頭腦風(fēng)暴,輸出多個(gè)視覺方案縱向?qū)Ρ?,最后確定視覺風(fēng)格,分配視覺工作(插畫,動畫,3D)。項(xiàng)目后期,包括開發(fā)還原,數(shù)據(jù)調(diào)配等眾多環(huán)節(jié),環(huán)環(huán)相扣,缺一不可,一路過關(guān)斬將,整個(gè) H5 需要不同崗位的高度配合和各專業(yè)的高度默契。
△ H5的項(xiàng)目流程圖
1. 異地合作
本次 H5 聯(lián)動了動效,3D,插畫設(shè)計(jì)師的共同合作,由于支持 3D 的設(shè)計(jì)師在韓辦公,所以大部分都是在線上全英溝通,包括前期的項(xiàng)目進(jìn)度同步,還有后期的模型調(diào)整等環(huán)節(jié)都能及時(shí)反饋,快速反應(yīng),最后如期打磨出五款 spaceQQ。算是一次順利的異地合作。
△ 五款3D spaceQQ最終效果
2. 3D spaceQQ視覺還原
3D 鵝從設(shè)計(jì)軟件轉(zhuǎn)化為 H5 展示過程中,存在模型文件過大、材質(zhì)缺失等問題,直接影響用戶體驗(yàn)。在開發(fā)的過程中同學(xué)通過模型減面、重新選擇材質(zhì),還有模型拆分等解決方法,在視覺觀感和性能中建立了平衡的杠桿,最終實(shí)現(xiàn)了 15 個(gè) SPACE QQ 的視覺還原。
△ 五款3D spaceQQ最終視覺還原效果
3. 視覺工作的同步進(jìn)行
由于項(xiàng)目時(shí)間比較緊迫,而且 H5 加入了 3D 模型,還有需要大量的動效,所以需要在同一時(shí)間線上,同步進(jìn)行,視覺稿輸出,動畫制作和 3D 模型打磨。考驗(yàn)設(shè)計(jì)師的溝通和執(zhí)行能力。與此同時(shí),需要隨時(shí)和開發(fā)同步動畫 demo 以確保動畫可實(shí)現(xiàn)。和產(chǎn)品密集溝通,及時(shí)根據(jù)文案調(diào)整畫面。
因?yàn)?QQ 是陪伴了大多數(shù)用戶的一個(gè)產(chǎn)品,見證了整個(gè)互聯(lián)網(wǎng)社交的演變過程,容易引起用戶的情感共鳴。設(shè)計(jì)的初期,圍繞「個(gè)人軌跡」的主題發(fā)散了不同方向的視覺概念,在引起客戶共鳴感的復(fù)古元素和傳遞不斷「探索」未來的概念間尋找平衡點(diǎn)。最后沿用了 20 周年的太空概念貼合「探索」的主題,結(jié)合有年代特征的代表性視覺符號來引起「個(gè)人軌跡」的這一概念的用戶情感共鳴。另外,H5 運(yùn)用了 3D 打造了 15 只太空鵝,打造「個(gè)人軌跡」的專屬感,既聯(lián)動用戶溫暖的回憶之余,也增添了一些小驚喜。
1. H5整體視覺風(fēng)格
QQ,是陪伴了大多數(shù)人成長的一個(gè)互聯(lián)網(wǎng)產(chǎn)品,其本身帶有很多高辨識度的視覺元素,例如對話框,提醒上線的音效等。因?yàn)?H5 本身是一個(gè)大數(shù)據(jù)總結(jié),專屬感非常強(qiáng)的一個(gè)產(chǎn)物,所以希望是喚醒用戶一些封塵已久的記憶,就像打開時(shí)間膠囊般的期待和感動。同時(shí)也象征著 QQ 一直陪伴在身邊,從而引起用戶的共鳴。
設(shè)計(jì)方面,除了通過一些標(biāo)志性的視覺元素喚醒用戶的回憶之外,也加入 QQ 20周年的太空「探索」主題的元素,響應(yīng) 20 周年的主題之余,也寓意 QQ 不斷地對外探索,從多個(gè)維度來看世界,尋找有趣的內(nèi)容。
對話框,是承載數(shù)據(jù)的視覺符號,也是貫穿整個(gè) H5 的重要視覺符號之一。寓意著 QQ 一直致力于「溝通」,而且不同時(shí)代的 QQ 對話框都各有特點(diǎn),也是見證 QQ 時(shí)代變遷的重要元素,所以提取了三個(gè)階段代表性的對話框樣式來承載數(shù)據(jù),并且加入有時(shí)代特征的視覺元素(如bb機(jī),像素化的小箭頭等)作為輔助,增加 H5 的氛圍感,也算是視覺上的「小彩蛋」。
△ QQ原始對話框
H5 加入一些趣味感的元素,如笑臉,愛心等元素,背景輔以流動的彩色不規(guī)則圖案,來增加對話框的玩味。也寓意 QQ 20年來給用戶帶來源源不斷的樂趣,留下了不可取代的時(shí)代印記。
△ 重繪對話框
H5 中也加入了很多好玩的元素,不同時(shí)代所用的移動設(shè)備,融合貼近太空「探索」主題的背景;利用帶手套的手和不同的元素進(jìn)行互動;增加重繪經(jīng)典頭像的互動動畫,加入 QQ 空間的植物等懷舊元素,增加 H5 的可玩性和驚喜感。
△ 經(jīng)典頭像的重繪
△ 經(jīng)典頭像穿插在H5中的小彩蛋
△ 帶手套的手和有時(shí)代標(biāo)簽的元素互動
1. 視覺動態(tài)化方案
在動畫制作前期會出一份詳細(xì)的動態(tài)化分頁策劃,以及一份盡可能表達(dá)完整的動畫 demo,能便于設(shè)計(jì)與開發(fā)能準(zhǔn)確的估算出制作周期。在開發(fā)完成預(yù)研測試后,基于動畫 demo 共同制定一個(gè)大致的動態(tài)化方案──對話框等大面積使用代碼實(shí)現(xiàn),其他裝飾性小元素全部使用序列幀。在觀眾每滑一頁即可觸發(fā)當(dāng)前頁的動畫,且能保證大體動畫的流暢度。
2. 動畫制作
為了盡可能減少 H5 的運(yùn)算體積,又保證畫面動態(tài)的流暢程度,導(dǎo)出的序列必須滿足以下所有條件:
△ 設(shè)計(jì)了4個(gè)不同的色塊流動loop,方便開發(fā)安插在每頁合適的位置
3. 導(dǎo)出與同步
在配合開發(fā)導(dǎo)出的階段,為了能明確序列的標(biāo)記,所有序列文件命名為 xx-in/xx-loop/xx-out。使用同步工具以實(shí)現(xiàn) AE 動畫序列導(dǎo)出和開發(fā)提取素材能同步進(jìn)行,并保持實(shí)時(shí)更新和迭代。
△ 第6頁動畫導(dǎo)出序列
創(chuàng)建了四款全新的 spaceQQ,根據(jù)用戶的 QQ 年齡而設(shè)計(jì)。根據(jù)用戶的 QQ 年齡,分了四個(gè)款式的鵝:奢華,智能,閃亮和神秘四個(gè)概念,一個(gè)遞進(jìn)的尊貴程度,刺激用戶分享欲。包括基礎(chǔ)款的 QQ 在內(nèi),共創(chuàng)造了 5 個(gè)類型的 spaceQQ。每個(gè)設(shè)計(jì)都基于基本 spaceQQ 的形式,但是套裝的顏色和細(xì)節(jié)根據(jù)各自的概念各有特色。
△ spaceQQ總覽圖
用戶可以根據(jù)自己的喜好更改這 5 款 spaceQQ 的裝扮顏色。
1. 專屬感
整個(gè) H5 始終緊扣 QQ 20周年的太空「探索」主題,整個(gè) H5,除了用數(shù)據(jù)喚醒用戶和 QQ 多年的點(diǎn)點(diǎn)滴滴之外,5 個(gè) spaceQQ 概念設(shè)定,既能增加用戶的新鮮感,又能刺激用戶的分享欲,C4D 建立的 3D 形象豐富了整個(gè) H5 的視覺層次,深化了 QQ 品牌的影響力,寓意鵝廠一直與時(shí)俱進(jìn),緊貼潮流。
2. 情緒調(diào)動
對于當(dāng)下的運(yùn)營活動來說,趣味性是引爆轉(zhuǎn)發(fā)量的重要元素,H5 結(jié)合 QQ 用戶創(chuàng)作的背景音樂和能夠調(diào)動用戶情感的設(shè)計(jì)語言來釋放用戶的情緒,比如驚喜感(用戶結(jié)合 QQ 的標(biāo)志性音效創(chuàng)作的背景音樂),榮譽(yù)感(不同 Q 齡獲取相應(yīng)的 spaceQQ)等,讓用戶產(chǎn)生持續(xù)的驚喜感,在懷舊和新鮮感中得到滿足,提升用戶活躍性。
QQ 20周年 H5 設(shè)計(jì),嘗試結(jié)合了 3D,動畫,插畫等設(shè)計(jì)形態(tài),為每一位用戶打造專屬的「個(gè)人軌跡」,通過數(shù)字,拼湊出和 QQ 的過往朝夕,引起用戶共鳴。鵝廠不斷創(chuàng)新探索的同時(shí),也為用戶溫存屬于用戶自己的專屬回憶,深化 QQ 的品牌價(jià)值。
福利
考慮到部分同學(xué)想更仔細(xì)地查看、保存或收藏高清大圖的需求,我們設(shè)置了關(guān)鍵詞,微信公眾號后臺以「spaceQQ+序號」的方式回復(fù),例如「spaceQQ1」,即可逐一獲取對應(yīng)的高清頭像和壁紙。
掃碼領(lǐng)取專屬「個(gè)人軌跡」:
藍(lán)藍(lán)設(shè)計(jì)( m.wnxcall.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)。
如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里
加粗樣式
***@TOC
歡迎使用Markdown編輯器
你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學(xué)習(xí)如何使用Markdown編輯器, 可以仔細(xì)閱讀這篇文章,了解一下Markdown的基本語法知識。
新的改變
我們對Markdown編輯器進(jìn)行了一些功能拓展與語法支持,除了標(biāo)準(zhǔn)的Markdown編輯器功能,我們增加了如下幾點(diǎn)新功能,幫助你用它寫博客:
全新的界面設(shè)計(jì) ,將會帶來全新的寫作體驗(yàn);
在創(chuàng)作中心設(shè)置你喜愛的代碼高亮樣式,Markdown 將代碼片顯示選擇的高亮樣式 進(jìn)行展示;
增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區(qū)域直接展示;
全新的 KaTeX數(shù)學(xué)公式 語法;
增加了支持甘特圖的mermaid語法1 功能;
增加了 多屏幕編輯 Markdown文章功能;
增加了 焦點(diǎn)寫作模式、預(yù)覽模式、簡潔寫作模式、左右區(qū)域同步滾輪設(shè)置 等功能,功能按鈕位于編輯區(qū)域與預(yù)覽區(qū)域中間;
增加了 檢查列表 功能。
功能快捷鍵
撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標(biāo)題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入代碼:Ctrl/Command + Shift + K
插入鏈接:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G
合理的創(chuàng)建標(biāo)題,有助于目錄的生成
直接輸入1次#,并按下space后,將生成1級標(biāo)題。
輸入2次#,并按下space后,將生成2級標(biāo)題。
以此類推,我們支持6級標(biāo)題。有助于使用TOC語法后生成一個(gè)完美的目錄。
如何改變文本的樣式
強(qiáng)調(diào)文本 強(qiáng)調(diào)文本
加粗文本 加粗文本
標(biāo)記文本
刪除文本
引用文本
H2O is是液體。
210 運(yùn)算結(jié)果是 1024.
插入鏈接與圖片
鏈接: link.
圖片:
帶尺寸的圖片:
居中的圖片:
居中并且?guī)С叽绲膱D片:
當(dāng)然,我們?yōu)榱俗層脩舾颖憬?,我們增加了圖片拖拽功能。
如何插入一段漂亮的代碼片
去博客設(shè)置頁面,選擇一款你喜歡的代碼片高亮樣式,下面展示同樣高亮的 代碼片.
// An highlighted block
var foo = 'bar';
1
2
生成一個(gè)適合你的列表
項(xiàng)目
項(xiàng)目
項(xiàng)目
項(xiàng)目1
項(xiàng)目2
項(xiàng)目3
計(jì)劃任務(wù)
完成任務(wù)
創(chuàng)建一個(gè)表格
一個(gè)簡單的表格是這么創(chuàng)建的:
項(xiàng)目 Value
電腦 $1600
手機(jī) $12
導(dǎo)管 $1
設(shè)定內(nèi)容居中、居左、居右
使用:---------:居中
使用:----------居左
使用----------:居右
第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左
SmartyPants
SmartyPants將ASCII標(biāo)點(diǎn)字符轉(zhuǎn)換為“智能”印刷標(biāo)點(diǎn)HTML實(shí)體。例如:
TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash
創(chuàng)建一個(gè)自定義列表
Markdown
Text-to-HTML conversion tool
Authors
John
Luke
如何創(chuàng)建一個(gè)注腳
一個(gè)具有注腳的文本。2
注釋也是必不可少的
Markdown將文本轉(zhuǎn)換為 HTML。
KaTeX數(shù)學(xué)公式
您可以使用渲染LaTeX數(shù)學(xué)表達(dá)式 KaTeX:
Gamma公式展示 Γ(n)=(n?1)!?n∈N \Gamma(n) = (n-1)!\quad\foralln\in\mathbb NΓ(n)=(n?1)!?n∈N 是通過歐拉積分
Unexpected text node: ' 'Unexpected text node: ' '
Γ(z)=∫
0
∞
t
z?1
e
?t
dt.
你可以找到更多關(guān)于的信息 LaTeX 數(shù)學(xué)表達(dá)式here.
新的甘特圖功能,豐富你的文章
Mon 06
Mon 13
Mon 20
已完成
進(jìn)行中
計(jì)劃一
計(jì)劃二
現(xiàn)有任務(wù)
Adding GANTT diagram functionality to mermaid
關(guān)于 甘特圖 語法,參考 這兒,
UML 圖表
可以使用UML圖表進(jìn)行渲染。 Mermaid. 例如下面產(chǎn)生的一個(gè)序列圖::
張三
李四
王五
你好!李四, 最近怎么樣?
你最近怎么樣,王五?
我很好,謝謝!
我很好,謝謝!
李四想了很長時(shí)間,文字太長了不適合放在一行.
打量著王五...
很好... 王五, 你怎么樣?
張三
李四
王五
這將產(chǎn)生一個(gè)流程圖。:
鏈接
長方形
圓
圓角長方形
菱形
關(guān)于 Mermaid 語法,參考 這兒,
FLowchart流程圖
我們依舊會支持flowchart的流程圖:
開始
我的操作
確認(rèn)?
結(jié)束
yes
no
關(guān)于 Flowchart流程圖 語法,參考 這兒.
導(dǎo)出與導(dǎo)入
導(dǎo)出
如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當(dāng)你完成了一篇文章的寫作, 在上方工具欄找到 文章導(dǎo)出 ,生成一個(gè).md文件或者.html文件進(jìn)行本地保存。
導(dǎo)入
如果你想加載一篇你寫過的.md文件或者.html文件,在上方工具欄可以選擇導(dǎo)入功能進(jìn)行對應(yīng)擴(kuò)展名的文件導(dǎo)入,
繼續(xù)你的創(chuàng)作。
mermaid語法說明 ??
注腳的解釋 ??
藍(lán)藍(lán)設(shè)計(jì)( m.wnxcall.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)。
如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里
1. 如何實(shí)現(xiàn)一個(gè)響應(yīng)式對象
最近在看 Vue 的源碼,其中最核心基礎(chǔ)的一塊就是 Observer/Watcher/Dep, 簡而言之就是,Vue 是如何攔截?cái)?shù)據(jù)的讀寫, 如果實(shí)現(xiàn)對應(yīng)的監(jiān)聽,并且特定的監(jiān)聽執(zhí)行特定的回調(diào)或者渲染邏輯的??偟目梢圆鸪扇髩K來說。這一塊,主要說的是 Vue 是如何將一個(gè) plain object 給處理成 reactive object 的,也就是,Vue 是如何攔截?cái)r截對象的 get/set 的
我們知道,用 Object.defineProperty 攔截?cái)?shù)據(jù)的 get/set 是 vue 的核心邏輯之一。這里我們先考慮一個(gè)最簡單的情況 一個(gè) plain obj 的數(shù)據(jù),經(jīng)過你的程序之后,使得這個(gè) obj 變成 Reactive Obj (不考慮數(shù)組等因素,只考慮最簡單的基礎(chǔ)數(shù)據(jù)類型,和對象):
如果這個(gè) obj 的某個(gè) key 被 get, 則打印出 get ${key} - ${val} 的信息
如果這個(gè) obj 的某個(gè) key 被 set, 如果監(jiān)測到這個(gè) key 對應(yīng)的 value 發(fā)生了變化,則打印出 set ${key} - ${val} - ${newVal} 的信息。
對應(yīng)的簡要代碼如下:
Observer.js
export class Observer {
constructor(obj) {
this.obj = obj;
this.transform(obj);
}
// 將 obj 里的所有層級的 key 都用 defineProperty 重新定義一遍, 使之 reactive
transform(obj) {
const _this = this;
for (let key in obj) {
const value = obj[key];
makeItReactive(obj, key, value);
}
}
}
function makeItReactive(obj, key, val) {
// 如果某個(gè) key 對應(yīng)的 val 是 object, 則重新迭代該 val, 使之 reactive
if (isObject(val)) {
const childObj = val;
new Observer(childObj);
}
// 如果某個(gè) key 對應(yīng)的 val 不是 Object, 而是基礎(chǔ)類型,我們則對這個(gè) key 進(jìn)行 defineProperty 定義
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: () => {
console.info(`get ${key}-${val}`)
return val;
},
set: (newVal) => {
// 如果 newVal 和 val 相等,則不做任何操作(不執(zhí)行渲染邏輯)
if (newVal === val) {
return;
}
// 如果 newVal 和 val 不相等,且因?yàn)?newVal 為 Object, 所以先用 Observer迭代 newVal, 使之 reactive, 再用 newVal 替換掉 val, 再執(zhí)行對應(yīng)操作(渲染邏輯)
else if (isObject(newVal)) {
console.info(`set ${key} - ${val} - ${newVal} - newVal is Object`);
new Observer(newVal);
val = newVal;
}
// 如果 newVal 和 val 不相等,且因?yàn)?newVal 為基礎(chǔ)類型, 所以用 newVal 替換掉 val, 再執(zhí)行對應(yīng)操作(渲染邏輯)
else if (!isObject(newVal)) {
console.info(`set ${key} - ${val} - ${newVal} - newVal is Basic Value`);
val = newVal;
}
}
})
}
function isObject(data) {
if (typeof data === 'object' && data != 'null') {
return true;
}
return false;
}
index.js
import { Observer } from './source/Observer.js';
// 聲明一個(gè) obj,為 plain Object
const obj = {
a: {
aa: 1
},
b: 2,
}
// 將 obj 整體 reactive 化
new Observer(obj);
// 無輸出
obj.b = 2;
// set b - 2 - 3 - newVal is Basic Value
obj.b = 3;
// set b - 3 - [object Object] - newVal is Object
obj.b = {
bb: 4
}
// get b-[object Object]
obj.b;
// get a-[object Object]
obj.a;
// get aa-1
obj.a.aa
// set aa - 1 - 3 - newVal is Basic Value
obj.a.aa = 3
這樣,我們就完成了 Vue 的第一個(gè)核心邏輯, 成功把一個(gè)任意層級的 plain object 轉(zhuǎn)化成 reactive object
2. 如何實(shí)現(xiàn)一個(gè) watcher
前面講的是如何將 plain object 轉(zhuǎn)換成 reactive object. 接下來講一下,如何實(shí)現(xiàn)一個(gè)watcher.
實(shí)現(xiàn)的偽代碼應(yīng)如下:
偽代碼
// 傳入 data 參數(shù)新建新建一個(gè) vue 對象
const v = new Vue({
data: {
a:1,
b:2,
}
});
// watch data 里面某個(gè) a 節(jié)點(diǎn)的變動了,如果變動,則執(zhí)行 cb
v.$watch('a',function(){
console.info('the value of a has been changed !');
});
// watch data 里面某個(gè) b 節(jié)點(diǎn)的變動了,如果變動,則執(zhí)行 cb
v.$watch('b',function(){
console.info('the value of b has been changed !');
})
Vue.js
// 引入將上面中實(shí)現(xiàn)的 Observer
import { Observer } from './Observer.js';
import { Watcher } from './Watcher.js';
export default class Vue {
constructor(options) {
// 在 this 上掛載一個(gè)公有變量 $options ,用來暫存所有參數(shù)
this.$options = options
// 聲明一個(gè)私有變量 _data ,用來暫存 data
let data = this._data = this.$options.data
// 在 this 上掛載所有 data 里的 key 值, 這些 key 值對應(yīng)的 get/set 都被代理到 this._data 上對應(yīng)的同名 key 值
Object.keys(data).forEach(key => this._proxy(key));
// 將 this._data 進(jìn)行 reactive 化
new Observer(data, this)
}
// 對外暴露 $watch 的公有方法,可以對某個(gè) this._data 里的 key 值創(chuàng)建一個(gè) watcher 實(shí)例
$watch(expOrFn, cb) {
// 注意,每一個(gè) watcher 的實(shí)例化都依賴于 Vue 的實(shí)例化對象, 即 this
new Watcher(this, expOrFn, cb)
}
// 將 this.keyName 的某個(gè) key 值的 get/set 代理到 this._data.keyName 的具體實(shí)現(xiàn)
_proxy(key) {
var self = this
Object.defineProperty(self, key, {
configurable: true,
enumerable: true,
get: function proxyGetter() {
return self._data[key]
},
set: function proxySetter(val) {
self._data[key] = val
}
})
}
}
Watch.js
// 引入Dep.js, 是什么我們待會再說
import { Dep } from './Dep.js';
export class Watcher {
constructor(vm, expOrFn, cb) {
this.cb = cb;
this.vm = vm;
this.expOrFn = expOrFn;
// 初始化 watcher 時(shí), vm._data[this.expOrFn] 對應(yīng)的 val
this.value = this.get();
}
// 用于獲取當(dāng)前 vm._data 對應(yīng)的 key = expOrFn 對應(yīng)的 val 值
get() {
Dep.target = this;
const value = this.vm._data[this.expOrFn];
Dep.target = null;
return value;
}
// 每次 vm._data 里對應(yīng)的 expOrFn, 即 key 的 setter 被觸發(fā),都會調(diào)用 watcher 里對應(yīng)的 update方法
update() {
this.run();
}
run() {
// 這個(gè) value 是 key 被 setter 調(diào)用之后的 newVal, 然后比較 this.value 和 newVal, 如果不相等,則替換 this.value 為 newVal, 并執(zhí)行傳入的cb.
const value = this.get();
if (value !== this.value) {
this.value = value;
this.cb.call(this.vm);
}
}
}
對于什么是 Dep, 和 Watcher 里的 update() 方法到底是在哪個(gè)時(shí)候被誰調(diào)用的,后面會說
3. 如何收集 watcher 的依賴
前面我們講了 watcher 的大致實(shí)現(xiàn),以及 Vue 代理 data 到 this 上的原理?,F(xiàn)在我們就來梳理一下,Observer/Watcher 之間的關(guān)系,來說明它們是如何調(diào)用的.
首先, 我們要來理解一下 watcher 實(shí)例的概念。實(shí)際上 Vue 的 v-model, v-bind , {{ mustache }}, computed, watcher 等等本質(zhì)上是分別對 data 里的某個(gè) key 節(jié)點(diǎn)聲明了一個(gè) watcher 實(shí)例.
<input v-model="abc">
<span>{{ abc }}</span>
<p :data-key="abc"></p>
...
const v = new Vue({
data:{
abc: 111,
}
computed:{
cbd:function(){
return `${this.abc} after computed`;
}
watch:{
abc:function(val){
console.info(`${val} after watch`)
}
}
}
})
這里,Vue 一共聲明了 4 個(gè) watcher 實(shí)例來監(jiān)聽abc, 1個(gè) watcher 實(shí)例來監(jiān)聽 cbd. 如果 abc 的值被更改,那么 4 個(gè) abc - watcher 的實(shí)例會執(zhí)行自身對應(yīng)的特定回調(diào)(比如重新渲染dom,或者是打印信息等等)
不過,Vue 是如何知道,某個(gè) key 對應(yīng)了多少個(gè) watcher, 而 key 對應(yīng)的 value 發(fā)生變化后,又是如何通知到這些 watcher 來執(zhí)行對應(yīng)的不同的回調(diào)的呢?
實(shí)際上更深層次的邏輯是:
在 Observer階段,會為每個(gè) key 都創(chuàng)建一個(gè) dep 實(shí)例。并且,如果該 key 被某個(gè) watcher 實(shí)例 get, 把該 watcher 實(shí)例加入 dep 實(shí)例的隊(duì)列里。如果該 key 被 set, 則通知該 key 對應(yīng)的 dep 實(shí)例, 然后 dep 實(shí)例會將依次通知隊(duì)列里的 watcher 實(shí)例, 讓它們?nèi)?zhí)行自身的回調(diào)方法
dep 實(shí)例是收集該 key 所有 watcher 實(shí)例的地方.
watcher 實(shí)例用來監(jiān)聽某個(gè) key ,如果該 key 產(chǎn)生變化,便會執(zhí)行 watcher 實(shí)例自身的回調(diào)
相關(guān)代碼如下:
Dep.js
export class Dep {
constructor() {
this.subs = [];
}
// 將 watcher 實(shí)例置入隊(duì)列
addSub(sub) {
this.subs.push(sub);
}
// 通知隊(duì)列里的所有 watcher 實(shí)例,告知該 key 的 對應(yīng)的 val 被改變
notify() {
this.subs.forEach((sub, index, arr) => sub.update());
}
}
// Dep 類的的某個(gè)靜態(tài)屬性,用于指向某個(gè)特定的 watcher 實(shí)例.
Dep.target = null
observer.js
import {Dep} from './dep'
function makeItReactive(obj, key, val) {
var dep = new Dep()
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: () => {
// 收集依賴! 如果該 key 被某個(gè) watcher 實(shí)例依賴,則將該 watcher 實(shí)例置入該 key 對應(yīng)的 dep 實(shí)例里
if(Dep.target){
dep.addSub(Dep.target)
}
return val
},
set: (newVal) => {
if (newVal === val) {
return;
}
else if (isObject(newVal)) {
new Observer(newVal);
val = newVal;
// 通知 dep 實(shí)例, 該 key 被 set,讓 dep 實(shí)例向所有收集到的該 key 的 watcher 實(shí)例發(fā)送通知
dep.notify()
}
else if (!isObject(newVal)) {
val = newVal;
// 通知 dep 實(shí)例, 該 key 被 set,讓 dep 實(shí)例向所有收集到的該 key 的 watcher 發(fā)送通知
dep.notify()
}
}
})
}
watcher.js
import { Dep } from './Dep.js';
export class Watcher {
constructor(vm, expOrFn, cb) {
this.cb = cb;
this.vm = vm;
this.expOrFn = expOrFn;
this.value = this.get();
}
get() {
// 在實(shí)例化某個(gè) watcher 的時(shí)候,會將Dep類的靜態(tài)屬性 Dep.target 指向這個(gè) watcher 實(shí)例
Dep.target = this;
// 在這一步 this.vm._data[this.expOrFn] 調(diào)用了 data 里某個(gè) key 的 getter, 然后 getter 判斷類的靜態(tài)屬性 Dep.target 不為null, 而為 watcher 的實(shí)例, 從而把這個(gè) watcher 實(shí)例添加到 這個(gè) key 對應(yīng)的 dep 實(shí)例里。 巧妙!
const value = this.vm._data[this.expOrFn];
// 重置類屬性 Dep.target
Dep.target = null;
return value;
}
// 如果 data 里的某個(gè) key 的 setter 被調(diào)用,則 key 會通知到 該 key 對應(yīng)的 dep 實(shí)例, 該Dep實(shí)例, 該 dep 實(shí)例會調(diào)用所有 依賴于該 key 的 watcher 實(shí)例的 update 方法。
update() {
this.run();
}
run() {
const value = this.get();
if (value !== this.value) {
this.value = value;
// 執(zhí)行 cb 回調(diào)
this.cb.call(this.vm);
}
}
}
總結(jié):
至此, Watcher, Observer , Dep 的關(guān)系全都梳理完成。而這些也是 Vue 實(shí)現(xiàn)的核心邏輯之一。再來簡單總結(jié)一下三者的關(guān)系,其實(shí)是一個(gè)簡單的 觀察-訂閱 的設(shè)計(jì)模式, 簡單來說就是, 觀察者觀察數(shù)據(jù)狀態(tài)變化, 一旦數(shù)據(jù)發(fā)生變化,則會通知對應(yīng)的訂閱者,讓訂閱者執(zhí)行對應(yīng)的業(yè)務(wù)邏輯 。我們熟知的事件機(jī)制,就是一種典型的觀察-訂閱的模式
Observer, 觀察者,用來觀察數(shù)據(jù)源變化.
Dep, 觀察者和訂閱者是典型的 一對多 的關(guān)系,所以這里設(shè)計(jì)了一個(gè)依賴中心,來管理某個(gè)觀察者和所有這個(gè)觀察者對應(yīng)的訂閱者的關(guān)系, 消息調(diào)度和依賴管理都靠它。
Watcher, 訂閱者,當(dāng)某個(gè)觀察者觀察到數(shù)據(jù)發(fā)生變化的時(shí)候,這個(gè)變化經(jīng)過消息調(diào)度中心,最終會傳遞到所有該觀察者對應(yīng)的訂閱者身上,然后這些訂閱者分別執(zhí)行自身的業(yè)務(wù)回調(diào)即可
參考
Vue源碼解讀-滴滴FED
代碼參考
藍(lán)藍(lán)設(shè)計(jì)( m.wnxcall.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)。
如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里
視覺設(shè)計(jì)師作為展示產(chǎn)品最終形態(tài)的執(zhí)行層,產(chǎn)品上線前走查視覺與交互還原是必經(jīng)環(huán)節(jié),而留給設(shè)計(jì)師走查修改的時(shí)間其實(shí)非常少,有時(shí)候?yàn)榱伺浜袭a(chǎn)品上線時(shí)間,通常只能犧牲一些細(xì)節(jié),在下一次迭代進(jìn)行優(yōu)化。為了每一次上線的產(chǎn)品都能夠得到更好地還原,這就需要設(shè)計(jì)師去了解開發(fā)到底是根據(jù)哪些規(guī)則還原我們的設(shè)計(jì)稿,以及在每一次制作和交付設(shè)計(jì)稿的時(shí)候,我們應(yīng)如何設(shè)定好每一個(gè)細(xì)節(jié)的規(guī)則。開發(fā):這里已經(jīng)完全對齊了。
視覺:看起來還沒完全對齊,我的圖也沒有切錯(cuò)吧?
開發(fā):字體大小和間距都是按照視覺稿來的。
視覺:這里間距偏差這么大,為什么不按照視覺稿?
開發(fā):視覺樣式好多,每個(gè)設(shè)計(jì)師的間距好像都不一樣。
視覺:……
我們經(jīng)常會聽到身邊的設(shè)計(jì)師與開發(fā)小哥的一些對話,關(guān)于對齊、大小、間距等設(shè)計(jì)還原問題經(jīng)常會討論很久,有時(shí)甚至?xí)X得,幾個(gè)像素的間距是不是沒有必要這么糾結(jié)。以我較常接觸的云產(chǎn)品官網(wǎng)為例,云產(chǎn)品官網(wǎng)體量龐大,單個(gè)頁面或信息模塊的樣式復(fù)用可高達(dá)上百個(gè)子產(chǎn)品頁面,此時(shí)第一個(gè)模塊設(shè)計(jì)的規(guī)范性、擴(kuò)展性、復(fù)用性則變得尤為重要,所以為了讓設(shè)計(jì)方案更加合理,為了讓合作更加,這里總結(jié)一些設(shè)計(jì)經(jīng)驗(yàn),與大家一起探討。
本文將從以下三個(gè)方面,思考作為視覺設(shè)計(jì)師,應(yīng)當(dāng)如何讓設(shè)計(jì)更加合理有效:
1. 字體結(jié)構(gòu)
網(wǎng)頁設(shè)計(jì)中,我們總避免不了與字體打交道,字體也是我們在設(shè)計(jì)中經(jīng)常容易忽視的部分,而經(jīng)常出錯(cuò)的原因往往是因?yàn)槲覀儗ξ淖值睦斫獠粔蚯逦O啾任魑淖煮w,中文字體結(jié)構(gòu)復(fù)雜,字庫龐大,網(wǎng)頁的渲染效果會比西文字體艱難很多。
但無論是中文還是西文,我們經(jīng)常需要用到的無非是字體大小、字重、字色,還有就是經(jīng)常被我們忽視的行高和行寬,我們從西文字體提取三個(gè)最主要的因素,即字高、行高、行寬?;谖魑淖煮w的結(jié)構(gòu)轉(zhuǎn)換為中文,我們可以理解為,字高指的就是我們?nèi)庋鬯芸吹降淖煮w的實(shí)際高度,而行高指的是字高+上邊距+下邊距,反過來說,行高減去字高除以 2 就能得到我們的上下邊距,行寬指的就是整個(gè)文本的寬度。
舉一個(gè)圖文模塊的例子,圖(1)中我們?nèi)庋鬯吹介g距,在我們做標(biāo)注時(shí),看到的其實(shí)是圖(2)中的三個(gè)色塊,我們實(shí)際給到開發(fā)的標(biāo)注,是色塊的尺寸和色塊之間的間距,以及詳細(xì)的文本屬性。
2. 文字行寬
關(guān)于行寬,以設(shè)計(jì) banner 的標(biāo)題及描述文字為例,定義行寬是為了讓文本在極限寬度的時(shí)候進(jìn)行換行,再固定好配圖的尺寸,從而得到文本與配圖之間的間距,定義行寬、行數(shù)、字?jǐn)?shù),能夠更好地為運(yùn)營人員規(guī)范輸出的文案,避免因字?jǐn)?shù)過多或過少所造成的視覺不平衡。
當(dāng)我們處理無序列表時(shí),四個(gè)短句文本,長短不一,同樣我們需要限制一行文本寬度,定義一行能承載的最多字?jǐn)?shù),以及跟產(chǎn)品確認(rèn)可能出現(xiàn)的最多字?jǐn)?shù)的情況,確認(rèn)模塊設(shè)計(jì)的可行性,保證后續(xù)運(yùn)營人員在替換文案的時(shí)候不會出錯(cuò)。
以上兩個(gè)例子都是我們設(shè)計(jì)文字經(jīng)常出錯(cuò)的地方,正確的定義規(guī)范,無論是交付開發(fā)或者其他下游,都能保證模塊設(shè)計(jì)的可擴(kuò)展性及規(guī)范化,保證最終上線質(zhì)量。
3. 圖標(biāo)視錯(cuò)覺
關(guān)于圖標(biāo),這里提到一個(gè)幾何學(xué)錯(cuò)覺的概念,視覺上的大小、長度、面積、方向、角度等幾何構(gòu)成,和實(shí)際上測得的數(shù)字有明顯差別的錯(cuò)覺,稱為幾何學(xué)錯(cuò)覺。人眼所接受的視覺平衡,往往不是設(shè)計(jì)軟件上精準(zhǔn)的對齊,我們總是會通過調(diào)整間距、大小或角度來補(bǔ)齊一些負(fù)空間,讓畫面保持視覺平衡。
以客戶案例的卡片樣式為例,客戶案例在 to B 產(chǎn)品中是必不可少的模塊,我們的客戶 logo 有的圓形,有的長方形,有的純文字,尺寸差距比較懸殊,這種情況下我們需要給他限制一個(gè)高度,在這個(gè)高度以內(nèi),再根據(jù) logo 本身的體量來調(diào)整圖形的大小,處理好 logo 的視覺平衡,最后紅色區(qū)域是 logo 的實(shí)際尺寸,藍(lán)色區(qū)域則是我們實(shí)際給到開發(fā)的尺寸,從開發(fā)的角度來看其實(shí)就是占位符,而規(guī)范的作圖則是把占位符的透明度調(diào)整為 0,以占位符為實(shí)際有效作圖區(qū)。
UI 設(shè)計(jì)中通常以「向右箭頭」來表示當(dāng)前鏈接可跳轉(zhuǎn),使用箭頭作圖時(shí),當(dāng)我們把箭頭和文字右對齊,箭頭其實(shí)會更加的往外突出,這時(shí)候我們會人為的往里邊推 1 至 2 像素,最后實(shí)際給到開發(fā)的也應(yīng)該是紅框的尺寸,也就是 16×16 的占位圖尺寸。
「按鈕」也是 UI 設(shè)計(jì)中常用的組件,當(dāng)我們在按鈕里使用圖標(biāo)加文字時(shí),由于文字的體量更大,整體重心會往右偏,所以我們通常會認(rèn)為讓圖標(biāo)和文字整體往左偏移,使整體的視覺更加平衡,實(shí)際給到開發(fā)的,也是兩個(gè)不同等的邊距。
1. 理性的設(shè)計(jì)
在 iOS 和 Android 的設(shè)計(jì)規(guī)范中,都有提到過使用「8點(diǎn)柵格」的概念,即建議使用 8×8 的網(wǎng)格系統(tǒng)進(jìn)行設(shè)計(jì),我們都知道 0.5px 的渲染在屏幕上會變模糊,之所以使用 8 的倍數(shù)是因?yàn)槭袌錾现髁鞯钠聊欢寄鼙?8 整除,使用 8 點(diǎn)柵格能夠的讓我們所設(shè)計(jì)的內(nèi)容樣式在屏幕上保持高清顯示,而在日常的網(wǎng)頁設(shè)計(jì)中,我其實(shí)更加傾向使用 4 點(diǎn)柵格系統(tǒng)。
我們以下圖 4 組數(shù)列為例,大家可能都曾使用過上面三組藍(lán)色數(shù)列中的數(shù)值應(yīng)用到設(shè)計(jì)中,或以 5 為倍數(shù),或以 10 為倍數(shù)、或以偶數(shù)為設(shè)計(jì)邏輯,而實(shí)際上以 5 為倍數(shù)則會包含奇數(shù),奇數(shù)會導(dǎo)致控件文字對不齊,當(dāng) 5 的倍數(shù)和偶數(shù)同時(shí)使用時(shí),則會出現(xiàn)類似 14、15、16 這種相差為 1 的相鄰數(shù),這樣會導(dǎo)致我們的尺寸規(guī)范不好定義規(guī)則,難以形成邏輯,而使用 4 的倍數(shù),他們的公差為 4,不會出現(xiàn)奇數(shù),也不會出現(xiàn)相鄰數(shù)。
我們再看看一些通用的尺寸定義,例如常見的 icon 設(shè)計(jì)尺寸都是以 4 為倍數(shù)。
常見的網(wǎng)頁柵格及其所均分的卡片和間距,也都是 4 的倍數(shù),如果我們的控件尺寸,圖標(biāo)尺寸和間距都使用 4 的倍數(shù)來定義,那所有的信息模塊自然都能更好的相互適應(yīng),層層遞進(jìn)的邏輯關(guān)系也會更加明顯。
我們把 4 點(diǎn)柵格的設(shè)計(jì)邏輯套用到卡片設(shè)計(jì)上,第一眼我們可能比較難去評判兩者的好壞,但仔細(xì)看,我們就會發(fā)現(xiàn)第一個(gè)卡片的按鈕沒有水平對齊,相互之間的間距尺寸也是沒什么邏輯性。假如今天調(diào)整一個(gè) 8px 的間距,明天調(diào)一個(gè) 10px 的間距,設(shè)計(jì)師走查起來也很難發(fā)現(xiàn)有問題,對接的開發(fā)也難以有一個(gè)可以參考的規(guī)范標(biāo)準(zhǔn)。而相對的,以 4 為倍數(shù),我們會發(fā)現(xiàn)所有的信息都會完美對齊,而且倍數(shù)為 4 的每個(gè)數(shù)值之間公差為 4,即使設(shè)計(jì)稿微調(diào)了 1px 我們都能很快發(fā)現(xiàn),開發(fā)在還原設(shè)計(jì)稿時(shí)也會有一個(gè)衡量標(biāo)準(zhǔn)。
網(wǎng)格設(shè)計(jì)在報(bào)紙、雜志、海報(bào)等平面設(shè)計(jì)領(lǐng)域中也是十分常見的設(shè)計(jì)手法,通過建立網(wǎng)格,考究每一個(gè)信息模塊在頁面中的擺放位置,大小占比,顏色占比,從而使得頁面信息保持秩序、均衡。
使用 4 點(diǎn)柵格系統(tǒng),通過理性、秩序、邏輯的設(shè)計(jì)方式賦予畫面秩序感以及閱讀體驗(yàn),而以 4 為倍數(shù),每個(gè)數(shù)字之間都相差為 4,不會太大,也不會太小,同時(shí)保持著秩序,讓設(shè)計(jì)更加理性。對于團(tuán)隊(duì)合作,設(shè)計(jì)師與開發(fā)也將更有默契,不必再為不清不楚的間距浪費(fèi)時(shí)間。
1. 有效切圖
關(guān)于切圖,切圖之前應(yīng)跟開發(fā)確定好輸出的格式和尺寸,確定應(yīng)該用 SVG,一倍圖或是兩倍圖。SVG 體量小渲染質(zhì)量好,單色使用時(shí)還能替換顏色,PNG 則通常用在實(shí)景圖,一倍圖和二倍圖則根據(jù)實(shí)際需要進(jìn)行輸出。
如果要做分層動畫,那我們就需要分層切圖,如果桌面端和手機(jī)端樣式差別較大,那我們需要和開發(fā)溝通好如何實(shí)現(xiàn),是否需要特殊切圖,所有的特殊切圖和特殊樣式,我們都應(yīng)該提前跟開發(fā)溝通好。
2. 交互細(xì)節(jié)
如果某個(gè)控件或信息模塊交互樣式較多,那我們可以有一個(gè)空白畫板來清晰地標(biāo)注這些狀態(tài)和樣式,很多開發(fā)在還原過程中都是一手視覺稿一手交互稿,但視覺設(shè)計(jì)師作為展示產(chǎn)品最終形態(tài)的執(zhí)行層,很多情況下,視覺階段依然會有很多需要跟交互和產(chǎn)品溝通修改的地方,所以為了避免遺漏修改點(diǎn),視覺稿應(yīng)該呈現(xiàn)最完整的設(shè)計(jì)細(xì)節(jié),這樣也會很大程度上節(jié)省開發(fā)的時(shí)間,減少出錯(cuò)的幾率。
當(dāng)頁面內(nèi)容有一定的更新頻率,我們則需要標(biāo)明視覺樣式規(guī)范,以及后續(xù)的運(yùn)營規(guī)則,完整的收尾,可以避免產(chǎn)品經(jīng)常過來尋求上線素材和規(guī)范。有些需要隔三個(gè)月或半年才上線的需求,清晰的標(biāo)注也能幫助我們快速回憶起需求背景,讓我們在日常工作中保持頭腦清晰,有條不紊,這其實(shí)也是在給我們自己節(jié)省時(shí)間。
3. 重構(gòu)稿走查
走查還原的時(shí)候,在 Chrome 瀏覽器的空白處右鍵點(diǎn)擊檢查,找到里面的 Computed 窗口,我們可以找到具體的文字、間距、投影等屬性,有時(shí)候一些比較細(xì)微的調(diào)整,我們可以雙擊具體的數(shù)值進(jìn)行調(diào)整,調(diào)整到自己滿意之后再把具體的數(shù)值給到開發(fā),這樣就不用在我們搖擺不定的情況下,造成雙方的困擾。
最后,在預(yù)發(fā)布的時(shí)候,我們可以利用 SwitchHosts 的客戶端來配置開發(fā)環(huán)境進(jìn)行體驗(yàn),保證最終上線的效果。
藍(lán)藍(lán)設(shè)計(jì)( m.wnxcall.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)。
如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里
如何爬去爬去今日頭條動態(tài)數(shù)據(jù),
網(wǎng)上有很多教程,我就不在啰嗦了
第一步如何分析得到存儲數(shù)據(jù)的真實(shí)url
首先打開https://www.toutiao.com/,搜索街拍,會跳轉(zhuǎn)https://www.toutiao.com/search/?keyword=%E8%A1%97%E6%8B%8D
你如果用傳統(tǒng)的方式你將的得不到任何有價(jià)值的信息
這個(gè)時(shí)候你怎么辦呢?
你這個(gè)時(shí)候注意查看requests url,
Request URL: https://www.toutiao.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword=街拍&autoload=true&count=20&en_qc=1&cur_tab=1&from=search_tab&pd=synthesis×tamp=1559831008973
到這里我們就找到了數(shù)據(jù)春芳的真正url了
你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學(xué)習(xí)如何使用Markdown編輯器, 可以仔細(xì)閱讀這篇文章,了解一下Markdown的基本語法知識。
后面就簡單了,直接上代碼
import os
import re
import json
import requests
from requests import RequestException
from requests import exceptions
from urllib.parse import urlencode
from demo01.util import buid_proxy
‘’’
抓取今日頭條圖片圖片集
因?yàn)榻裉祛^條數(shù)據(jù)是動態(tài),因此第一步是找到存儲圖片的真正url
第二步就是構(gòu)造瀏覽器(偽瀏覽器),因?yàn)楝F(xiàn)在防爬網(wǎng)站做的很好,他會更具某項(xiàng)標(biāo)準(zhǔn)你是否是機(jī)器人,因此這步很重要
‘’’
proxies=buid_proxy()
def get_one_page(offset, keyword):
‘’’
獲取網(wǎng)頁html內(nèi)容并返回
‘’’
params = {
‘a(chǎn)id’: ‘24’,
‘a(chǎn)pp_name’: ‘web_search’,
‘offset’: offset,
‘format’: ‘json’,
‘keyword’:keyword,
‘a(chǎn)utoload’: ‘true’,
‘count’: ‘20’,
‘cur_tab’: ‘1’,
‘from’: ‘search_tab’,
‘pd’: ‘synthesis’,
‘timestamp’: ‘1559660659001’}
header = {
"User-Agen":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36",
"referer":"https://www.toutiao.com/search/?keyword=%E8%A1%97%E6%8B%8D",
"cookie":"tt_webid=6692573135994799624; UM_distinctid=16ace1c56988c-06f62adc4fd369-7a1437-144000-16ace1c5699a3; csrftoken=368635b7c1d736ff1889c2b70705afa9; tt_webid=6692573135994799624; WEATHER_CITY=%E5%8C%97%E4%BA%AC; s_v_web_id=152a5d87eb7690f9953388e50371f37b; CNZZDATA1259612802=1893030441-1558619693-https%253A%252F%252Flanding.toutiao.com%252F%7C1559662594; _ga=GA1.2.569135354.1559664708; _gid=GA1.2.419995265.1559664708; __tasessionId=wb39ej38m1559741348358",
}
url = 'https://www.toutiao.com/api/search/content/?' + urlencode(params)
#print(url)
try:
# 獲取網(wǎng)頁內(nèi)容,返回json格式數(shù)據(jù)
response = requests.get(url, headers=header,proxies=proxies)
# 通過狀態(tài)碼判斷是否獲取成功
if response.status_code == 200:
#此處必須這樣寫不然會出現(xiàn)中文亂碼
response=response.content.decode('utf-8')
html=response
return html
return None
except RequestException:
return None
def parse_one_page(html):
‘’’
解析出組圖網(wǎng)址,并將網(wǎng)頁中所有圖集的標(biāo)題及圖片地址返回
‘’’
urls = []
data = json.loads(html,encoding=‘utf-8’)
if data and ‘data’ in data.keys():
for item in data.get(‘data’):
#print(item)
page_urls = []
title = item.get(‘title’)
#print(title)
image_list = item.get(‘image_list’)
if image_list !=None:
for i in range(len(image_list)):
# 獲取large圖片地址
url = image_list[i][‘url’]
# 替換URL獲取高清原圖
url = url.replace(‘large’, ‘origin’)
page_urls.append(url)
urls.append({‘title’: title,‘url_list’: page_urls})
return urls
def save_image_file(url, path):
‘’’
保存圖像文件
‘’’
ir = requests.get(url)
if ir.status_code == 200:
with open(path, ‘wb’) as f:
f.write(ir.content)
f.close()
def main(offset, word):
html = get_one_page(offset, word)
#print(html)
urls = parse_one_page(html)
print(urls)
#圖像文件夾不存在則創(chuàng)建
root_path = 'E:/test001/photo/TOUTIAO'
if not os.path.exists(root_path):
os.mkdir(root_path)
for i in range(len(urls)):
print('---正在下載 %s'%urls[i]['title'])
folder = root_path + '/' + urls[i]['title']
if not os.path.exists(folder):
try:
os.mkdir(folder)
except NotADirectoryError:
continue
except OSError:
continue
url_list = urls[i]['url_list']
try:
for j in range(len(url_list)):
path = folder + '/index_' + str("%02d"%j) + '.jpg'
if not os.path.exists(path):
save_image_file(urls[i]['url_list'][j], path)
except exceptions.ProxyError:
return None
if name == ‘main’:
main(0,‘街拍’)
新的改變
我們對Markdown編輯器進(jìn)行了一些功能拓展與語法支持,除了標(biāo)準(zhǔn)的Markdown編輯器功能,我們增加了如下幾點(diǎn)新功能,幫助你用它寫博客:
全新的界面設(shè)計(jì) ,將會帶來全新的寫作體驗(yàn);
在創(chuàng)作中心設(shè)置你喜愛的代碼高亮樣式,Markdown 將代碼片顯示選擇的高亮樣式 進(jìn)行展示;
增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區(qū)域直接展示;
全新的 KaTeX數(shù)學(xué)公式 語法;
增加了支持甘特圖的mermaid語法1 功能;
增加了 多屏幕編輯 Markdown文章功能;
增加了 焦點(diǎn)寫作模式、預(yù)覽模式、簡潔寫作模式、左右區(qū)域同步滾輪設(shè)置 等功能,功能按鈕位于編輯區(qū)域與預(yù)覽區(qū)域中間;
增加了 檢查列表 功能。
功能快捷鍵
撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標(biāo)題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入代碼:Ctrl/Command + Shift + K
插入鏈接:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G
合理的創(chuàng)建標(biāo)題,有助于目錄的生成
直接輸入1次#,并按下space后,將生成1級標(biāo)題。
輸入2次#,并按下space后,將生成2級標(biāo)題。
以此類推,我們支持6級標(biāo)題。有助于使用TOC語法后生成一個(gè)完美的目錄。
如何改變文本的樣式
強(qiáng)調(diào)文本 強(qiáng)調(diào)文本
加粗文本 加粗文本
標(biāo)記文本
刪除文本
引用文本
H2O is是液體。
210 運(yùn)算結(jié)果是 1024.
插入鏈接與圖片
鏈接: link.
圖片:
帶尺寸的圖片:
居中的圖片:
居中并且?guī)С叽绲膱D片:
當(dāng)然,我們?yōu)榱俗層脩舾颖憬?,我們增加了圖片拖拽功能。
如何插入一段漂亮的代碼片
去博客設(shè)置頁面,選擇一款你喜歡的代碼片高亮樣式,下面展示同樣高亮的 代碼片.
// An highlighted block
var foo = 'bar';
1
2
生成一個(gè)適合你的列表
項(xiàng)目
項(xiàng)目
項(xiàng)目
項(xiàng)目1
項(xiàng)目2
項(xiàng)目3
計(jì)劃任務(wù)
完成任務(wù)
創(chuàng)建一個(gè)表格
一個(gè)簡單的表格是這么創(chuàng)建的:
項(xiàng)目 Value
電腦 $1600
手機(jī) $12
導(dǎo)管 $1
設(shè)定內(nèi)容居中、居左、居右
使用:---------:居中
使用:----------居左
使用----------:居右
第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左
SmartyPants
SmartyPants將ASCII標(biāo)點(diǎn)字符轉(zhuǎn)換為“智能”印刷標(biāo)點(diǎn)HTML實(shí)體。例如:
TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash
創(chuàng)建一個(gè)自定義列表
Markdown
Text-to-HTML conversion tool
Authors
John
Luke
如何創(chuàng)建一個(gè)注腳
一個(gè)具有注腳的文本。2
注釋也是必不可少的
Markdown將文本轉(zhuǎn)換為 HTML。
KaTeX數(shù)學(xué)公式
您可以使用渲染LaTeX數(shù)學(xué)表達(dá)式 KaTeX:
Gamma公式展示 Γ(n)=(n?1)!?n∈N \Gamma(n) = (n-1)!\quad\foralln\in\mathbb NΓ(n)=(n?1)!?n∈N 是通過歐拉積分
Unexpected text node: ' 'Unexpected text node: ' '
Γ(z)=∫
0
∞
t
z?1
e
?t
dt.
你可以找到更多關(guān)于的信息 LaTeX 數(shù)學(xué)表達(dá)式here.
新的甘特圖功能,豐富你的文章
Mon 06
Mon 13
Mon 20
已完成
進(jìn)行中
計(jì)劃一
計(jì)劃二
現(xiàn)有任務(wù)
Adding GANTT diagram functionality to mermaid
關(guān)于 甘特圖 語法,參考 這兒,
UML 圖表
可以使用UML圖表進(jìn)行渲染。 Mermaid. 例如下面產(chǎn)生的一個(gè)序列圖::
張三
李四
王五
你好!李四, 最近怎么樣?
你最近怎么樣,王五?
我很好,謝謝!
我很好,謝謝!
李四想了很長時(shí)間,文字太長了不適合放在一行.
打量著王五...
很好... 王五, 你怎么樣?
張三
李四
王五
這將產(chǎn)生一個(gè)流程圖。:
鏈接
長方形
圓
圓角長方形
菱形
關(guān)于 Mermaid 語法,參考 這兒,
FLowchart流程圖
我們依舊會支持flowchart的流程圖:
開始
我的操作
確認(rèn)?
結(jié)束
yes
no
關(guān)于 Flowchart流程圖 語法,參考 這兒.
導(dǎo)出與導(dǎo)入
導(dǎo)出
如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當(dāng)你完成了一篇文章的寫作, 在上方工具欄找到 文章導(dǎo)出 ,生成一個(gè).md文件或者.html文件進(jìn)行本地保存。
導(dǎo)入
如果你想加載一篇你寫過的.md文件或者.html文件,在上方工具欄可以選擇導(dǎo)入功能進(jìn)行對應(yīng)擴(kuò)展名的文件導(dǎo)入,
繼續(xù)你的創(chuàng)作。
mermaid語法說明 ??
注腳的解釋 ??
藍(lán)藍(lán)設(shè)計(jì)( m.wnxcall.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)。
如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里
WWDC19 可能是最近幾年最令人激動的蘋果開發(fā)者大會了。重回高端專業(yè)領(lǐng)域的 Mac Pro 不僅僅是性能怪獸,在專業(yè)度、設(shè)計(jì)感甚至細(xì)節(jié)的模塊化的設(shè)計(jì)上,體現(xiàn)出了蘋果這一頂尖大廠應(yīng)有的底蘊(yùn),說實(shí)話,考驗(yàn)民間硬件評測玩家們的資金實(shí)力和評測能力的時(shí)候到了。在發(fā)布Mac Pro 這一系列產(chǎn)品的環(huán)節(jié),空耳幾乎完全聽不懂說的是啥,不過可以全程感知到每一個(gè)單詞都是牛X的,蘋果官方頁面的介紹現(xiàn)在肯定是最有說服力的,因?yàn)樽罱脑u測起碼是要等到今年年底。
屬于 iOS 13 的 Dark Mode 正正好好滿足了所有人的想象,但是和簡單直接的 Android Dark Mode 相比,又多出一絲優(yōu)雅,非常蘋果。擁有 App Store 和一連串新功能的 watchOS 終于成為了一個(gè)更加獨(dú)立、功能強(qiáng)大的硬件設(shè)備了,而 tvOS …… 不是重點(diǎn)。
重點(diǎn)是,在 iOS 和 macOS 之間,硬生生多出了一個(gè) iPadOS,這才是整個(gè)發(fā)布會上,最亮眼的星。
屏幕尺寸介于 iPhone 和 Mac 之間的 iPad ,一直沿用著交互機(jī)制相對比較簡約的 iOS 。也正是因此,絕大多數(shù)的用戶的重度需求,被電腦尤其是Mac 所分走了,而高頻輕量的需求則被 iPhone 給分走了,iPad 系列產(chǎn)品在很多時(shí)候都是作為家庭娛樂設(shè)備而存在,你聽到更多關(guān)于它的功能應(yīng)用場景,是看視頻追劇。
Apple Pencil 是這個(gè)系列的轉(zhuǎn)折點(diǎn)。書寫,創(chuàng)作,搭配鍵盤輸入,屏幕尺寸從9.7 一路上探到 12.9,iPad 開始在觸摸為王的時(shí)代,開始切入更多的使用場景。在學(xué)校里面越來越多的學(xué)生開始使用一臺iPad 來作為 All in one 學(xué)習(xí)/娛樂設(shè)備,藝術(shù)家和音樂者開始使用 iPad 替代手繪板和合成器,AR和娛樂的結(jié)合也越來越緊密,從創(chuàng)作到專業(yè)領(lǐng)域,iPad 成為了越來越多輕應(yīng)用場景的核心。
吃灰的 iPad 擁有了更多的可能性,而 iOS 的功能限制反倒成為了 iPad 短板,這大概也是 iPadOS 在整個(gè)生態(tài)中獨(dú)立出來的最重要原因之一吧。
使用單一屏幕作為輸入核心,圍繞觸摸來交互,以原有 iOS 作為開發(fā)核心,深入到更多的細(xì)分應(yīng)用場景,連通 macOS 和 iOS ,iPadOS 的定位看似曖昧,實(shí)則在這個(gè)多元和高度垂直的時(shí)代,幫蘋果趟出了第三條路。
iPadOS 的新布局看起來終于不那么 iPhone了,原有最左一屏的小組件匯集到主屏幕之后,看起來越來越有桌面的意思的。
……專為多點(diǎn)觸摸的顯示屏而設(shè)計(jì),通過直觀的手勢實(shí)現(xiàn)多任務(wù)……它現(xiàn)在被稱為iPadOS。
這是蘋果給 iPadOS 所寫的出道宣言。
比起 iOS 12 時(shí)代更強(qiáng)的分屏模式,發(fā)布會現(xiàn)場演示的時(shí)候,展示了使用托拽在多個(gè)應(yīng)用之間快托拽內(nèi)容和元素的操作,多屏互通效率極高。
而多任務(wù)不僅僅體現(xiàn)在多個(gè)應(yīng)用之間的互動,同一個(gè)應(yīng)用同樣可以多屏存在——也就是我們常說的多任務(wù)。比如打開兩個(gè)「提醒事項(xiàng)」應(yīng)用,在兩個(gè)筆記之間,來回編輯內(nèi)容。點(diǎn)擊Dock 中的特定應(yīng)用圖標(biāo),你就能看到它到底開了多少個(gè)頁面。
仔細(xì)想想,這是不是和桌面端的系統(tǒng)的邏輯越來越接近了?
想成為了一個(gè)獨(dú)立的設(shè)備,iPad 在用戶輸入端的短板需要補(bǔ)足,而為了解決這一問題,蘋果為 iPadOS 精心定制化了一套組合拳:編輯手勢,輸入提速,外設(shè)支持。
快速輸入是 iPad 的短板之一。不借助鍵盤而能快速輸入的方法之一,就是單手快速輸入。蘋果在iPadOS 上使用了一個(gè)全局的小鍵盤,使用雙指捏合快速呼出,全局浮動,使用QuichPath 滑動手勢輸入法,減少輸入的難度。這就是使用輸入法和鍵盤輸入提速的方法之一。
長段落或者是其他內(nèi)容,又要怎么編輯呢?蘋果巧妙地將 Macbook 系列觸控板的三指手勢微調(diào)了一下,給遷移過來了:三指捏合是復(fù)制,三指散開是粘貼,而三指滑動是撤銷。
而輔助快速編輯手勢的, 是智能選取功能,光標(biāo)定位比以往更加智能和精準(zhǔn),把編輯輸入的最后一個(gè)短板也給補(bǔ)上了。
iPad 的多點(diǎn)觸摸屏幕本就支持大量不同的手勢,功能支持不是難點(diǎn),難點(diǎn)在于用盡可能少、且認(rèn)知度足夠高的常見手勢,以的認(rèn)知負(fù)荷,讓用戶更快上手,更舒適地做到各種各樣的事情。
以觸摸為核心的交互,以及的指針的交互,在iPadOS 上交匯了。這種交互模式無疑是實(shí)驗(yàn)性的,但是這也是未來所有的移動端和數(shù)字產(chǎn)品的設(shè)計(jì)者都要考慮的問題,而iPadOS 就是最重要的試驗(yàn)田。
當(dāng)然,外置鍵盤輸入也并不是難事。iPad 本身的配套鍵盤套和第三方藍(lán)牙鍵盤,多數(shù)有輸入需求的用戶都已經(jīng)購置了,為此,蘋果給iPadOS 搭配了豐富的快捷鍵,來輔助輸入:
當(dāng)然,輸入這件事情上,Apple Pencil 也是非常重要的組成部分。蘋果將系統(tǒng)自帶的備忘錄應(yīng)用進(jìn)行了重設(shè)計(jì),其中很大一部分原因,就是為 Apple Pencil 提供更為強(qiáng)大的繪圖功能:
這樣一來,即使你沒有購買第三方的繪圖工具,同樣可以用它畫出足夠漂亮的插畫作品。除了特定APP中的手寫輸入和繪圖這樣的使用場景之外,Apple Pencil 還作為日常截圖批注的主力,方便日常作筆記:
更好的輸入,最終的目的,始終是為了更好地輸出內(nèi)容。
iPadOS 的野心很大。作為一塊10英寸上下的屏幕之內(nèi)的操作系統(tǒng),它作為內(nèi)容承載的硬件,是一個(gè)很合理的想象,不然也不會有那么多開發(fā)者一直在開發(fā)將iPad 作為外接屏幕的應(yīng)用,而現(xiàn)在,用戶只需要連上Wifi ,它就能作為 Mac的外接屏幕。
打通了這一個(gè)環(huán)節(jié)之后,后面的事情就自然而然了:Apple Pencil 可以在屏幕上畫畫,這樣一來,它很自然而然就成了手繪板。發(fā)布會上,蘋果官方所放出的圖片當(dāng)中,涵蓋了多數(shù)設(shè)計(jì)師都在使用的設(shè)計(jì)軟件,其中不乏 AI、AE、Pr、Sketch、C4D、Zbrush 這些大熱設(shè)計(jì)工具。
更重要的一點(diǎn)在于,Apple Pencil 原本 20ms 的反應(yīng)延遲,在這次的更新之后,將會達(dá)到9ms,反應(yīng)速度提升了一倍以上!它已經(jīng)是一個(gè)稱職的手繪板了。
有意思的地方在于,并沒有 PS。為什么?答案很簡單啊,iPadOS平臺上的原生 PS 馬上就要來了?。∵B上Adobe 的創(chuàng)意云,兩個(gè)平臺又呼應(yīng)上了……
畢竟,想要打通細(xì)分的應(yīng)用場景,iPadOS 是需要自身具備強(qiáng)大生產(chǎn)力的,這意味著大量的獨(dú)立功能、服務(wù)和應(yīng)用支撐。
想要 iPadOS 能夠獨(dú)立完成視覺創(chuàng)造的工作,對于多種字體的支持是肯定需要的。在iPad 上獨(dú)立運(yùn)行 Photoshop 也同樣是需要這樣的功能支撐的,所以,干脆官方提供支持了:
而值得注意的是,作為一個(gè)設(shè)計(jì)公司,蘋果的想象力并不止于此。這次更新的功能當(dāng)中,有一個(gè)非常引人矚目的功能是 SF Symbols。
蘋果將1000多個(gè)常見的 iOS 和 macOS 的圖標(biāo)和蘋果官方的舊金山字體融為一體,這些圖標(biāo)和符號支持 iOS 13、iPadOS以及的 watchOS 6 和 tvOS 13,而且你還可以在官方的文檔支持之下,自己創(chuàng)造!
具體可以戳這里了解:SF-symbols 使用文檔
完全獨(dú)立的 iPadOS 將會需要好好管理本地和云端的文件系統(tǒng),官方將文件管理器進(jìn)行了升級,確保它無需借助另外一臺電腦來完成操作。
核心應(yīng)用沒有問題,和外接內(nèi)容進(jìn)入口也要一并升級。功能強(qiáng)大的 TypeC接口能夠直接讀取U盤和存儲卡:
而作為主要的瀏覽器,Safari 瀏覽器也向著桌面端瀏覽器的方向進(jìn)了優(yōu)化和調(diào)整,比如支持下載:
此外,圖片、照片和視頻的本地管理和剪輯功能,也一并進(jìn)行了升級,這也是為了讓iPad 能夠成為一個(gè)更加獨(dú)立的產(chǎn)品而存在。
而真正改變游戲玩法的東西,在開發(fā)和設(shè)計(jì)上。
多年以前,蘋果為了統(tǒng)一全平臺的應(yīng)用開發(fā),開發(fā)語言從原本的 Obj-C 遷移到自家的 Swift 語言。隨著移動端應(yīng)用量的快速增長,移動端的應(yīng)用數(shù)量其實(shí)早已超過 macOS 平臺的開發(fā)數(shù)量和頻度,這種變化也催生了 Project Catalyst。
圖片來自 engatget
這個(gè)名為「催化劑」的項(xiàng)目的目標(biāo)是希望開發(fā)者可以更加便捷地將 iOS 應(yīng)用遷移到 macOS 上,比如說 Twitter 的開發(fā)者只花了幾天時(shí)間,就將現(xiàn)有的 iOS APP 遷移到 macOS 上。緊隨其后,成千上萬的移動端應(yīng)用將都可以逐步地反哺到 macOS 上。
但是 Project Catalyst 只是權(quán)宜之計(jì),真正治根又治本的東西,則是這次的新的UI框架,SwiftUI。SwiftUI 是一個(gè)典型的原生應(yīng)用框架,是蘋果在磨合了上十年的經(jīng)驗(yàn)之后,所創(chuàng)造出一個(gè)的UI開發(fā)框架,開發(fā)者僅僅只需要極少量的代碼和交互式的設(shè)計(jì),就能夠調(diào)用這一框架。這一改變對于 iOS 平臺的設(shè)計(jì)和開發(fā)都會有直接的影響。
在現(xiàn)場演示的時(shí)候,原本復(fù)雜無比的開發(fā)代碼,在換用 SwiftUI 之后僅需幾行代碼聲明就可以搞定:
新的 Xcode 11 當(dāng)中,開發(fā)者可以使用托拽的方式來增刪組件,而右側(cè)的實(shí)時(shí)預(yù)覽則能夠呈現(xiàn)每一點(diǎn)改變。而基于 SwiftUI 的代碼開發(fā)模式,可以快速復(fù)用遷移到整個(gè)蘋果的產(chǎn)品平臺上,比以往任何時(shí)候都要快:
關(guān)于SwiftUI 的相關(guān)文檔:https://developer.apple.com/documentation/swiftui/
官方教程:https://developer.apple.com/tutorials/swiftui/
在新的 iPadOS 和 iOS13 中,系統(tǒng)的整體速度和性能得到了進(jìn)一步的提升,解鎖速度提升了30%,啟動速度是以往的2倍,而應(yīng)用的容量也比以往要小。
對,深色模式也是蘋果這次 iOS 產(chǎn)品更新的最核心特點(diǎn),甚至整個(gè)WWDC19 主題演講環(huán)節(jié)的整體視覺設(shè)計(jì)也是完全沿用這種沉浸感極強(qiáng)的深色模式視覺來進(jìn)行構(gòu)建的。目前蘋果的 HIG 當(dāng)中 iOS 的章節(jié)中新增了 Dark mode 的章節(jié),而 iPadOS 相關(guān)的系統(tǒng)的設(shè)計(jì)設(shè)計(jì)指南還未更新。
「在 iOS 13 及以上的版本當(dāng)中,用戶可以選擇深色模式為默認(rèn)的外觀風(fēng)格。在深色模式下,系統(tǒng)界面、視圖、菜單和控件都會使用較暗的配色方案,并且讓前景元素更加鮮艷,確保突出。用戶可以選擇選擇深色模式作為默認(rèn)的視覺風(fēng)格,也可以通過設(shè)置,讓它在光線較暗的時(shí)候,自動切換過去。需要注意的是,深色模式可以讓人更加專注。在設(shè)計(jì)的時(shí)候,需要在淺色模式和深色模式中都進(jìn)行測試,因?yàn)橛行┰睾团渖谝环N模式下可用,在另一種模式下并不一定適用?!?
蘋果目前在設(shè)計(jì)規(guī)范中所提供的設(shè)計(jì)要求相對比較簡略,感興趣的同學(xué)可以借助翻譯工具看一下:Dark Mode
如果你對于深色模式感興趣,我們還有文章提供給你:
由于目前蘋果官方暫時(shí)沒有更多的內(nèi)容,我們可以把深色模式更多的內(nèi)容留到今后來聊。
覺得社交網(wǎng)絡(luò)帳號登錄不夠安全?Google 和 Facebook 兩大巨頭在發(fā)布會上成了反面案例,蘋果適時(shí)地推出了自家的帳號登錄服務(wù)。
蘋果將產(chǎn)品和用戶之間的邊界劃分得非常清晰,包括借助 Homekit 為用戶提供基于本地存儲的安全服務(wù),在網(wǎng)上登錄的時(shí)候使用經(jīng)過加密的郵箱帳號,等等。
而被蘋果點(diǎn)名的兩家著名科技企業(yè),Google 和 Facebook 也是在之前的 Google I/O 大會以及F8 大會上,相繼針對隱私策略、安全服務(wù)進(jìn)行了提升。
如果你對于這些大會感興趣可以看看之前的文章:
和每年9月的新品發(fā)布相比,WWDC 的信息量一點(diǎn)都不小。尤其今年還有超贊的 Mac Pro,單開2篇文章都不一定聊得完。但是在我看來,和設(shè)計(jì)關(guān)系最緊密的產(chǎn)品,應(yīng)該就是 iPadOS了。這個(gè)獨(dú)特操作系統(tǒng),巧妙地卡在一個(gè)獨(dú)特的需求點(diǎn)上,它本身的設(shè)計(jì)和定位、用戶體驗(yàn)的考量、服務(wù)用戶的思路、牽涉到的功能和服務(wù)乃至于它對于設(shè)計(jì)的影響,都是巨大的。
藍(lán)藍(lán)設(shè)計(jì)( m.wnxcall.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)。
如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里
Echarts數(shù)據(jù)化可視圖表
開發(fā)工具與關(guān)鍵技術(shù):Visual Studio 2015 使用Echarts圖表
作者:郭海明
撰寫時(shí)間:2019年 6月 4日
1
2
3
在創(chuàng)建一個(gè)網(wǎng)頁的時(shí)候,有一些頁面會有許多數(shù)據(jù),瀏覽起來枯燥而乏味,而且數(shù)據(jù)之間的對比也不夠明顯。那么有什么方法可以讓這些數(shù)據(jù)的對比明顯起來,使數(shù)據(jù)看起來也沒有那么枯燥呢!答案當(dāng)然是有的,我們只需要引用Echarts數(shù)據(jù)可視化圖表就可以了。使用Echarts數(shù)據(jù)化圖表不僅可以讓數(shù)據(jù)之間對比明顯,還可以使數(shù)據(jù)更加生動起來,增強(qiáng)用戶瀏覽頁面數(shù)據(jù)的體驗(yàn)感。
Echarts提供了常規(guī)的折線圖,柱狀圖,餅狀圖,散點(diǎn)圖。還有用于統(tǒng)計(jì)的盒型圖,用于地理數(shù)據(jù)可視化的地圖,熱力圖,線圖,用于關(guān)系數(shù)據(jù)可視化的關(guān)系圖,多維數(shù)據(jù)可視化的平行坐標(biāo)。還有用戶BI的漏斗圖,儀表盤,并且支持圖與圖之間的混搭。
Echarts圖表使用起來的方法頁很簡單,首先將Echarts插件引用到視圖里面,視圖里面添加顯示Echarts圖表的類。給這個(gè)類顯示圖表的空間,并給類ID,用于后面寫好圖表之后將圖表放到這個(gè)類里面。
然后在
將學(xué)生信息數(shù)據(jù)表格需要用到的數(shù)據(jù)表,進(jìn)行多表的連接查詢,連接完成之后,
獲取到需要用到的數(shù)據(jù),封裝到自定義的AchievementInfor的實(shí)體類里面。
寫出接收不同階段成績的方法。用于接收每個(gè)不同階段的成績.
寫完之后,返回到視圖里面去寫調(diào)用Echarts的圖表,這里我們顯示的是折線圖,所以首先在
藍(lán)藍(lán)設(shè)計(jì)( m.wnxcall.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)。
藍(lán)藍(lán)設(shè)計(jì)的小編 http://m.wnxcall.com