設(shè)計(jì)界面上沒太多" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁(yè) > 營(yíng)銷資訊 > 網(wǎng)站運(yùn)營(yíng) > 怎樣花兩天時(shí)間設(shè)計(jì)和開發(fā)一個(gè)設(shè)計(jì)導(dǎo)航站?

怎樣花兩天時(shí)間設(shè)計(jì)和開發(fā)一個(gè)設(shè)計(jì)導(dǎo)航站?

時(shí)間:2023-05-31 04:57:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2023-05-31 04:57:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)

怎樣花兩天時(shí)間設(shè)計(jì)和開發(fā)一個(gè)設(shè)計(jì)導(dǎo)航站?:放假期間花兩天時(shí)間做了一個(gè)小網(wǎng)站,設(shè)計(jì)師網(wǎng)址導(dǎo)航。網(wǎng)站收錄了全網(wǎng)絕大多數(shù)互聯(lián)網(wǎng)設(shè)計(jì)相關(guān)的資源(目前大部分都是國(guó)外的資源),本文是對(duì)此項(xiàng)目的一個(gè)簡(jiǎn)單總結(jié)。

設(shè)計(jì)

界面上沒太多可說(shuō)的,采用的很傳統(tǒng)的兩欄布局。不敢和常規(guī)流程不同的是,我并沒有用任何設(shè)計(jì)軟件先進(jìn)行設(shè)計(jì),而是在腦海中有了大概樣子后,直接在瀏覽器中用 CSS 直接設(shè)計(jì)的。這樣比在設(shè)計(jì)軟件里設(shè)計(jì)好再動(dòng)手更節(jié)省時(shí)間。

DEX.List - The Index page for digital designers.

開發(fā)

開發(fā)選用的技術(shù)棧主要就是 React,當(dāng)然你也可以選擇再國(guó)內(nèi)更流行的 Vue,不過我個(gè)人認(rèn)為 React 無(wú)論是在核心理念、代碼友好度、后期可擴(kuò)展性、社區(qū)支持等方便都比后者要好。

目前快速開發(fā) React 項(xiàng)目的框架有很多很多,最流行的有 Create React App,Gatsby,Next.js 等,為了更方便我在這里選擇了 Gatsby,Gatsby 并不僅僅只是一個(gè)靜態(tài)網(wǎng)站生成器,因?yàn)楸旧砭椭С?React 的所有功能,它其實(shí)可以看做是一個(gè) React 開發(fā)框架。使用 Gatsby 的另一個(gè)好處是,你不需要做什么就可以制作一個(gè) PWA (Progressive Web App )的網(wǎng)站,也就是說(shuō)這是個(gè)漸進(jìn)式的網(wǎng)頁(yè)應(yīng)用程序,并且通過 Google Lighthouse 測(cè)試可以得到很高的評(píng)分。

先說(shuō)明一下 Gatsby 的原理:最底層的數(shù)據(jù),通過 GraphQL 連接,再通過 React 編輯業(yè)務(wù)邏輯,最后生成靜態(tài)頁(yè)面。

項(xiàng)目的目錄結(jié)構(gòu)如下圖所示,這里可以看到其實(shí)現(xiàn)在的設(shè)計(jì)軟件和代碼的理念很類似了,都是組件化的,我們需要做的就是把設(shè)計(jì)稿還原成代碼,并且拆分成一個(gè)個(gè)最小可用的組件,再組裝起來(lái)。

視覺的部分和寫靜態(tài)的網(wǎng)頁(yè)沒太大區(qū)別,都是通過 HTML 和 CSS 編寫樣式,只不過會(huì)用到部分 React 特有的 JSX 語(yǔ)法,以及部分邏輯代碼。為了更快速的完成這個(gè)項(xiàng)目,我還用到了 Rebass(Rebass)這個(gè)庫(kù),它可以讓你快速搭建組件而不需要從頭寫那些基礎(chǔ)的樣式。它是基于 styled-system 這個(gè) React UI 框架的,目前很多大公司的 design system 都是基于它,比如 Github 的 Primer Primer Design System。

關(guān)于 CSS 的部分,現(xiàn)有的成熟框架有很多,比如最流行的 bootstrap,tachyons 和目前公認(rèn)最好用的 Tailwind,但是初學(xué)者建議不使用任何框架,直接手寫,這樣對(duì)學(xué)習(xí)基本語(yǔ)法有好處。下圖代表了各個(gè)框架的使用體驗(yàn)示意圖:

要定義每一個(gè)鏈接條目最外面容器,也就是那個(gè)白色的圓角矩形,我們可以從 Rebass 引入 Card,則得到了一個(gè)默認(rèn)的矩形。

當(dāng)然你不想要默認(rèn)的樣式,那么我們可以通過它提供的參數(shù)更改設(shè)置,比如 px={2} 就代表設(shè)置 padding 的上下邊距,1 代表 4px,2 代表 8px,3 代表 16px,以此類推。于是 px={2} 就等于寫了 padding-left: 16px; padding-right: 16px;對(duì)于官方?jīng)]有定義的值,也可以直接用你想要的數(shù)值,比如下面那個(gè) py = “12px”。

除了官方提供的快捷操作參數(shù),還有很多 CSS 屬性比較復(fù)雜,Rebass 并沒有直接提供,我們可以通過 CSS in JS 方式補(bǔ)充。如上圖,把它保存為 Card.js 放到 components 目錄,我們就完成了一個(gè) UI 組件的代碼。當(dāng)然大部分人都不喜歡 CSS in JS 這樣的書寫方式,這里可以搭配 styled-components 或 emotion ,把 CSS 分離出來(lái)。

數(shù)據(jù)存儲(chǔ)和綁定

UI 組件寫好了,我們還需要最底層的數(shù)據(jù)。Gatsby 支持多種數(shù)據(jù)存儲(chǔ)方式,可以直接綁定其他第三方 CMS 如 Contentful,通過 API 調(diào)用,也就是現(xiàn)在特別火的一個(gè)概念 Headless CMS;也可以通過存到本地 YAML 或 JSON 文件,通過 GraphQL 調(diào)用??紤]到這個(gè)網(wǎng)站的數(shù)據(jù)主要是文本而不是富文本,為了更方便管理,我采用了本地 YAML 文件的數(shù)據(jù)存儲(chǔ)方式。

每一個(gè) id 對(duì)應(yīng)了一個(gè)分類,展開后,每一個(gè)第一級(jí)數(shù)組 的 item 里面,又包含了二級(jí)數(shù)組:name logo location price slogan link 等。(如果你用 VSCode,可以通過插件直接在左側(cè)預(yù)覽 logo 中的圖片數(shù)據(jù)。)

數(shù)據(jù)搞定了,怎么使用呢?Gatsby 的數(shù)據(jù)處理采用了同樣來(lái)自于 Facebook 的一個(gè)項(xiàng)目 GraphQL,簡(jiǎn)單來(lái)說(shuō) GraphQL 是一個(gè)可以用來(lái)查詢 API 的數(shù)據(jù)庫(kù)工具(值得一提的是:GraphQL 的核心開發(fā)設(shè)計(jì)者之一,現(xiàn)在是 Figma 的設(shè)計(jì)總監(jiān))

安裝 gatsby-transformer-yaml 插件,通過 GraphQL 我們可以把剛才的 YAML 數(shù)據(jù)抓取過來(lái):

query($id: String!) { listPage: listYaml(id: { eq: $id }) { id title item { name slogan price location link logo { childImageSharp { fixed( width: 32 height: 32 ) { ...GatsbyImageSharpFixed_tracedSVG } } } } } }其中 id, title, item, name...分別對(duì)應(yīng)了 YAML 文件中寫好的那些數(shù)據(jù),我們只需要根據(jù)官方給出的語(yǔ)法,把它們 query 出來(lái)就好了。

你肯定注意到了,logo 里面和其他地方不一樣,多出來(lái)一大坨東西,那些是 Gatsby 提供的一套圖片處理的函數(shù),它可以幫你自動(dòng)化處理圖片預(yù)加載、響應(yīng)式處理、支持 Webp 圖片格式等操作。

因?yàn)槲覀兊?logo 圖片上固定尺寸的,所以這里用到了 GatsbyImageSharpFixed_tracedSVG 這個(gè)函數(shù),tracedSVG 代表預(yù)加載圖片之前給它一個(gè)默認(rèn)的占位圖,并且是用 SVG 畫的。通過 Gatsby 你不需要再關(guān)心這一切背后復(fù)雜的處理邏輯,只要一行代碼就夠了。

效果如下圖:

在終端輸入 gatsby develop,打開本地測(cè)試環(huán)境,如果編譯成功你會(huì)看到兩個(gè)鏈接,第一個(gè)是網(wǎng)站的鏈接,第二個(gè) http://localhost:8000/___graphql 是它自帶的 GraphQL 測(cè)試工具,把你寫好的 GraphQL 代碼貼進(jìn)去,如果右邊顯示無(wú)誤,則說(shuō)明你剛才寫的代碼是沒有問題的??梢钥吹轿覀冃枰臄?shù)據(jù)已經(jīng)通過 GraphQL 獲取到了。

模板和動(dòng)態(tài)創(chuàng)建頁(yè)面

接下來(lái)創(chuàng)建頁(yè)面模板文件。在 templates 目錄新建 list.js, 這個(gè)模板的作用是自動(dòng)生成每一個(gè)分類頁(yè)面,也就是類似 https://dexlist.page/agency 這樣的二級(jí)頁(yè)面。下圖是模板文件的邏輯部分,你還需要把上面的那段 GraphQL 代碼加到這個(gè)文件里,當(dāng)然還有 CSS 樣式部分的代碼。

const ListPage = ({data}) => { const page = data.listPage return ( <Layout> <SEO title={page.title} /> <Section> <Topic>{page.title}</Topic> {page.item.map(props => ( <Card key={props.link} href={props.link} title={props.name} > <Item> <Flex> <Avatar> <Img fixed={props.logo.childImageSharp.fixed} /> </Avatar> <Box pl={2}> <Name> {props.name} {props.location ? <Location>{props.location}</Location> : <Price>{props.price}</Price> } </Name> <Slogan>{props.slogan}</Slogan> </Box> </Flex> </Item> </Card> ))} </Section> </Layout> )}這段代碼非常簡(jiǎn)單,基本上就是把 UI 組件拼起來(lái),再通過參數(shù)把剛才 query 到的數(shù)據(jù)傳進(jìn)來(lái)。

另外有一個(gè)地方需要說(shuō)明的是,我在 Name 標(biāo)簽里面用到了條件運(yùn)算符,也就是語(yǔ)法為 ::條件表達(dá)式 ? 真值 : 假值:: 的東西,如果你看首頁(yè)也會(huì)注意到有些標(biāo)題(只有 agency 有)后面有國(guó)家的 emoji,有些標(biāo)題(如軟件)后面則是跟著價(jià)格,它的意思是:如果數(shù)據(jù)中存在 location 這個(gè)值,則顯示 location 也就是國(guó)家的 emoji,如果沒有,則默認(rèn)顯示 price 也就是價(jià)格。為了方便說(shuō)明我把這段代碼和剛才 YAML 文件的代碼放在一起:

到此我們已經(jīng)寫好了 list.js 這個(gè)模板,既然是通過程序自動(dòng)生成 list 頁(yè)面,自然還要寫生成頁(yè)面的邏輯。Gatsby 提供了一個(gè) createPages 的功能,接下來(lái)打開根目錄下面 gatsby-node.js 這個(gè)文件輸入如下代碼:

exports.createPages = ({ graphql, actions }) => { const { createPage } = actions return graphql( ` { allListYaml { edges { node { id } } } } ` ).then(result => { if (result.errors) { throw result.errors } const listTemplate = path.resolve(`src/templates/list.js`) const Lists = result.data.allListYaml.edges _.each(Lists, edge => { createPage({ path: edge.node.id, component: listTemplate, context: { id: edge.node.id, }, }) }) })至此已經(jīng)寫好了每個(gè)分類頁(yè)面的代碼了,接下來(lái)完成首頁(yè)的部分。同樣通過 GraphQL 把數(shù)據(jù)抓取過來(lái),只不過這一次我們需要抓取所有的數(shù)據(jù),所以剛才的 listYaml 變成了 allListYaml :

query IndexPage { allListYaml( sort: { order: ASC, fields: [id] } ) { edges { node { id title item { name slogan price location link logo { childImageSharp { fixed( width: 32 height: 32 ) { ...GatsbyImageSharpFixed_tracedSVG } } } } } } } }首頁(yè)這部分基本和 list 頁(yè)面一樣,唯一不同的是,分類 list 頁(yè)面只需要每一個(gè)分類下的所有數(shù)據(jù),所以遍歷一次就夠了,而首頁(yè)是把所有分類的所有數(shù)據(jù)全部展示出來(lái),所以在 Card 標(biāo)簽外,我們還需要在 Section 外再遍歷一次所有分類。也就是 cards.map 遍歷一遍 id(分類)items.map 再遍歷一遍 分類里面的 item(鏈接條目)。

const IndexPage = ({ data }) => { const cards = data.allListYaml.edges return ( <Layout> <SEO title='' keywords={[`bookmarks`, `design`, `all-in-one`]} /> {cards.map(({ node }) => { const items = node.item const shuffledItems = shuffle(items) const url = `/${node.id}` return ( <Section key={node.id}> <Topic>{node.title}</Topic> {shuffledItems.slice(0, 24).map(item => { return ( <Card key={item.link} href={item.link} title={item.name} > <Item> <Flex> <Avatar> <Img fixed={item.logo.childImageSharp.fixed} /> </Avatar> <Box pl={2}> <Name> {item.name} {item.location ? <Location>{item.location}</Location> : <Price>{item.price}</Price> } </Name> <Slogan>{item.slogan}</Slogan> </Box> </Flex> </Item> </Card> ) })} {(items.length >=24) ? <Viewall to={url} /> : null} </Section> ) })} </Layout> )}如果首頁(yè)展示所有內(nèi)容,會(huì)導(dǎo)致加載時(shí)間過長(zhǎng),而且很多分類內(nèi)容過多也會(huì)讓頁(yè)面太長(zhǎng)不美觀,所以我在遍歷第二次的時(shí)候加上了 slice(0, 24),它讓每一個(gè)分類的內(nèi)容最多只顯示 24 條,超過則隱藏。而最后一句 {(items.length >=24) ? <Viewall /to/={url} /> : null}和剛才那個(gè) location 的條件判斷類似,如果分類內(nèi)容 ≥ 24 條,則在下面加上 view all 的鏈接,點(diǎn)擊后跳轉(zhuǎn)到每一個(gè)對(duì)應(yīng)的分類頁(yè)面,如果不足 24 條,則不顯示 view all (只能通過左邊導(dǎo)航欄進(jìn)入)。

還有一個(gè)問題是,如果首頁(yè)每次都是默認(rèn)的順序顯示內(nèi)容,那么超過 24 條的分類,被隱藏的鏈接就永遠(yuǎn)不會(huì)在首頁(yè)顯示,也就永遠(yuǎn)沒有展示機(jī)會(huì)了。于是我又加上了一個(gè)隨機(jī)函數(shù),讓它隨機(jī)顯示 items,并把它的結(jié)果定義成 shuffledItems,這樣首頁(yè)每次打開都會(huì)隨機(jī)展示不同的內(nèi)容,而不會(huì)局限于默認(rèn)的前 24 條了。

function shuffle(array) { let i = array.length - 1; for (; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); const temp = array[i]; array[i] = array[j]; array[j] = temp; } return array;}

編譯運(yùn)行和上線發(fā)布

前面提到了終端輸入 gatsby develop 是本地測(cè)試環(huán)境,現(xiàn)在輸入 gatsby build 就可以編譯并打包成可上線的版本了。

目前比較好用的云端平臺(tái)有 Zeit 和 Netify,兩者都是免費(fèi)的。他們可以讓你綁定 Github,直接把你的倉(cāng)庫(kù) push 到他們的網(wǎng)站上。這里我選擇了 Netify。

首先需要把項(xiàng)目 push 到 Github,Git 的具體操作就不再這里寫了。接下來(lái)在 Netlify 賬戶右上角點(diǎn)擊 New Site from Git,如下圖。當(dāng)然除了 Github 你也可以選擇其他 Git 托管平臺(tái)。

選好了倉(cāng)庫(kù)就會(huì)看到下面這個(gè)界面,默認(rèn)指定了 master 分支,并且 Netlify 可以根據(jù)你的項(xiàng)目自動(dòng)識(shí)別 Build 命令和發(fā)布的文件夾。

點(diǎn)擊上傳,等待一會(huì)網(wǎng)站就上線了。它可以免費(fèi)綁定你自己的域名,同時(shí)還有很多豐富的設(shè)置選項(xiàng)。

上傳后,把 Auto publishing 功能打開,這樣以后每次更新了內(nèi)容,只要你的 Github 倉(cāng)庫(kù)更新了,被它檢測(cè)到就會(huì)自動(dòng)幫你發(fā)布新版本了。

本文只是簡(jiǎn)單介紹了一些基本思路和流程,還有很多設(shè)計(jì)細(xì)節(jié)和 React 基礎(chǔ)知識(shí)就不討論了,網(wǎng)站的邏輯代碼也比較簡(jiǎn)單,比較適合初學(xué)者或設(shè)計(jì)師。

如果設(shè)計(jì)師對(duì) React 感興趣想學(xué)代碼,F(xiàn)ramer 創(chuàng)始人寫的 React 簡(jiǎn)易教程是很好的資料。








掃碼關(guān)注我們的公眾號(hào)


關(guān)鍵詞:設(shè)計(jì),導(dǎo)航,怎樣

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉