在「打造Instagram Clone」系列的第三篇文章中,我們將完成 Instagram Clone 的側邊欄。
首先,我們將編寫側邊欄,先從容易的logo開始編寫,我們到維基百科取得Instagram logo圖片,https://en.wikipedia.org/wiki/Instagram#/media/File:Instagram_logo.svg ,儲存到專案的public資料夾底下。
接著修改Sidebar.jsx,讓它顯示Instagram logo,將return區塊裏的內容替換成以下程式碼。
<div>
<div>
<img className="w-40" src="Instagram_logo.svg.png" alt="" />
</div>
<div>
</div>
</div>
className="w-40"代表寬度是10rem,10倍的font-size的寬度,font-size預設是16px,在這裏寬度是160px。
啟動專案,就能看到到logo出現在畫面上了。
接下來,我們使用react-icons的內容做出Instagram側邊欄底部的按鈕,可以使用這個網站https://react-icons.github.io/react-icons/ ,尋找適合的icon。
來到Sidebar.jsx,調整一下排版並新增按鈕。
return (
<div>
<div>
<div>
<img className="w-40" src="Instagram_logo.svg.png" alt="" />
</div>
<div>
</div>
</div>
<div>
<IoReorderThreeOutline />
</div>
</div>
);
別忘了引入IoReOrderThreeOutline
import { IoReorderThreeOutline } from "react-icons/io5";
啟動專案,完成的畫面長這樣。
繼續完善側邊欄,這些按鈕有很高的相關性,有相同的大小、間隔,寫在一起方便管理。
在Components/Sidebar底下新增SidebarMenu.jsx,用來放這些按鈕。
import {
AiFillCompass,
AiFillHeart,
AiFillHome,
AiFillPlusCircle,
AiOutlineCompass,
AiOutlineHeart,
AiOutlineHome,
AiOutlinePlusCircle,
AiOutlineSearch,
} from "react-icons/ai";
import { RiVideoFill, RiVideoLine } from "react-icons/ri";
import { IoPaperPlaneOutline, IoPaperPlane } from "react-icons/io5";
import { CgProfile } from "react-icons/cg";
export const menu = [
{
title: "Home",
icon: <AiOutlineHome className="text-2xl mr-5"></AiOutlineHome>,
activeIcon: <AiFillHome className="text-2xl mr-5"></AiFillHome>,
},
{
title: "Search",
icon: <AiOutlineSearch className="text-2xl mr-5"></AiOutlineSearch>,
activeIcon: <AiOutlineSearch className="text-2xl mr-5"></AiOutlineSearch>,
},
{
title: "Explore",
icon: <AiOutlineCompass className="text-2xl mr-5"></AiOutlineCompass>,
activeIcon: <AiFillCompass className="text-2xl mr-5"></AiFillCompass>,
},
{
title: "Reels",
icon: <RiVideoLine className="text-2xl mr-5"></RiVideoLine>,
activeIcon: <RiVideoFill className="text-2xl mr-5"></RiVideoFill>,
},
{
title: "Message",
icon: <IoPaperPlaneOutline className="text-2xl mr-5"></IoPaperPlaneOutline>,
activeIcon: <IoPaperPlane className="text-2xl mr-5"></IoPaperPlane>,
},
{
title: "Notification",
icon: <AiOutlineHeart className="text-2xl mr-5"></AiOutlineHeart>,
activeIcon: <AiFillHeart className="text-2xl mr-5"></AiFillHeart>,
},
{
title: "Create",
icon: <AiOutlinePlusCircle className="text-2xl mr-5"></AiOutlinePlusCircle>,
activeIcon: <AiFillPlusCircle className="text-2xl mr-5"></AiFillPlusCircle>,
},
{
title: "Profile",
icon: <CgProfile className="text-2xl mr-5"></CgProfile>,
activeIcon: <CgProfile className="text-2xl mr-5"></CgProfile>,
},
];
icon是平時顯示的icon,activeIcon是按下後顯示的icon。
在className裏,text-2xl代表1.5倍的字體大小以及每一行的間隔是2倍,mr-5代表右邊的間隔是1.25rem。
修改Sidebar.jsx,使用SidebarMenu的內容,修改後完整的程式碼如下:
import React from "react";
import { IoReorderThreeOutline } from "react-icons/io5";
import { menu } from "./SidebarMenu";
const Sidebar = () => {
return (
<div>
<div>
<div>
<img className="w-40" src="Instagram_logo.svg.png" alt="" />
</div>
<div className="mt-10">
{menu.map((item) => (
<div className="flex items-center cursor-pointer mb-5 text-lg">
{item.icon}
<p>{item.title}</p>
</div>
))}
</div>
</div>
<div className="flex items-center cursor-pointer">
<IoReorderThreeOutline />
<p className="ml-5">More</p>
</div>
</div>
);
};
export default Sidebar;
mt-10代表調整上方的邊距,items-center代表置中,cursor-pointer表示放在上面的遊標會變化,mr-5代表調整左邊的邊距。
添加一些細節的排版設定,完成後的Sidebar.css如下:
import React from "react";
import { IoReorderThreeOutline } from "react-icons/io5";
import { menu } from "./SidebarMenu";
const Sidebar = () => {
return (
<div className="sticky top-0 h-[100vh]">
<div className="flex flex-col justify-between h-full px-10">
<div>
<div className="pt-10">
<img className="w-40" src="Instagram_logo.svg.png" alt="" />
</div>
<div className="mt-10">
{menu.map((item) => (
<div className="flex items-center cursor-pointer mb-5 text-lg">
{item.icon}
<p>{item.title}</p>
</div>
))}
</div>
</div>
<div className="flex items-center cursor-pointer pb-10">
<IoReorderThreeOutline />
<p className="ml-5">More</p>
</div>
</div>
</div>
);
};
export default Sidebar;
sticky搭配top-0可以將側邊欄固定在上面。
h-[100vh]代表高度是100%的可見範圍,加[]是因為tailwindcss原來沒有這個屬性,要使用tailwindcss的自訂功能。
flex-col可以條列內容。
justify-between將間距自動分配為相同。
h-full高度為父元素的100%。
px-10是設定左右間距2.5rem。
pt-10是設定上間距2.5rem。
pb-10是設定下間距2.5rem。
側邊欄的外觀已經完成了。