接著我們要做的是打開 menu hamberger 後的 full screen modal,裡面包含了所有 VOGUE links
首先我們再新增一個 modal 的 partial,抽離出來管理這個物件的 style,並且在 Header.js 中加入相關的 div 以及 class
// main.sass
@import "variable"
@import "basic"
@import "typography"
@import "header"
@import "dropdown"
@import "modal"
打開的方式跟之前的 dropdown 一樣,只在於這次有開關的按鈕區別,所以會有參數帶入控制開關
// Header.js
export default function Header() {
// ...
const [modalOpen, setModalOpen] = React.useState(false);
const handleModalClick = (status) => {
setModalOpen(status);
};
return (
<nav className="header">
// ...
<div className={modalOpen === true ? "modal show" : "modal"}>
<div className="modal-dialog">
<div className="modal-content">
<div className="modal-header">
<div className="modal-title">VOGUE</div>
<label
className="close-button"
onClick={() => handleModalClick(false)}
>
</label>
</div>
<div className="modal-body">
<p>Modal body text goes here.</p>
</div>
</div>
</div>
</div>
</nav>
);
}
在 sass 的部分加上 modal 以及 show 來控制顯示的開關,以及移動到 modal-button 上的 hover style
// _modal.sass
.modal
position: fixed
top: 0
left: 0
display: none
width: 100%
height: 100%
background-color: $primary-color
color: $primary-background-color
.modal-button:hover
@extend %hover-style
.show
display: block
接下來利用 fontawesome 中的 close 來當作關閉按鈕
// Header.js
<div className="modal-header">
<div className="modal-title">VOGUE</div>
<label
className="close-button"
onClick={() => handleModalClick(false)}
>
<FontAwesomeIcon icon={faTimes} size="3x" />
</label>
</div>
sass 的部分針對 button 調整位置
// _modal.sass
.modal-header
.close-button
margin: 8px
padding: 16px
position: fixed
top: 0
right: 0
cursor: pointer
接下來看看畫面
可以看到 logo、menu 的位置是有對齊的!
接著要完成的是 Modal 中的 Content 部分,裡面包含了去各頁的連結 link
小提醒!可以先把 const [modalOpen, setModalOpen] = React.useState(true);
設定為 true,這樣比較方便檢視 modal 的效果,不然每次重新 render 還要打開來太麻煩了XD
因為 content 中有三個欄位,所以我們要再另外設置一個 modal column 來分裝這三個欄位
.modal-column
vertical-align: top
border-top: 1.5px solid $primary-background-color
width: 29vw
display: inline-block
margin: 16px
大概調整一下跟官網的配置一樣,這邊要注意的是:
再來針對 column 中的內容個別去設定 style
.modal-column
// ...
a
padding: 16px 0
display: block
color: $primary-background-color
&:hover
color: $secondary-color
hr
border: none
height: 1px
color: $darker-gray
background-color: $darker-gray
.logo-font
font-family: $logo-font
font-size: 48px
font-weight: 300
text-transform: capitalize
接下來是 js 的部分,因為 secondary menu 的部分被重複使用了,為了方便我將它做成 array 的形式來使用,而右側其他資訊 info 的地方也一併使用 array 的形式作儲存,方便我們後續帶出資料
const secondaryMenu = [
"fashion",
"beauty",
"entertainment",
"lifestyle",
"luxury",
"video",
"Vogue有意識",
];
const info = [
"秀場圖輯 RUNWAY SHOW",
"可能研究所",
"美人會部落格",
"風格達人",
"評美時尚客",
"活動快報",
];
而 render 出的方式使用前面使用過的 map,整個 modal 的內容目前會如下
<div className={modalOpen === true ? "modal show" : "modal"}>
<div className="modal-dialog">
<div className="modal-content">
<div className="modal-header">
<div className="modal-title">VOGUE</div>
<label
className="close-button"
onClick={() => handleModalClick(false)}
>
<FontAwesomeIcon icon={faTimes} size="3x" />
</label>
</div>
<div className="modal-body">
<div className="modal-column">
<a href="/">membership</a>
<hr />
<a href="/">vogue shop</a>
</div>
<div className="modal-column">
{secondaryMenu.map(function (item) {
return (
<div>
<a className="logo-font" href="/">
{item}
</a>
<hr />
</div>
);
})}
</div>
<div className="modal-column">
{info.map(function (item) {
return (
<div>
<a href="/">{item}</a>
<hr />
</div>
);
})}
</div>
</div>
</div>
</div>
</div>
前面有設定的 logo-font 樣式使用 class 的方式套用上去了,大功告成!
今天就先到這邊,大家掰掰~~~
除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章
juck30808 - Python - 數位行銷分析與 Youtube API 教學
SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?