Open1
Next.jsでパンクズリストを作る
概要
Next.jsでパンクズリストを作りました。
開発環境
- Next.js
- Typescript
- スタイルはCSS Module を採用。
使用例
<BreadCrumb
lists={[
{
name: "ホーム",
path: "/",
},
{
name: "会社概要",
},
]}
/>
...
propsとして、listsという連想配列を渡す。
実装内容
Breadcrumb.tsx
import Link from "next/link";
import breadCrumbStyles from "./styles/components/BreadCrumb.module.scss";
type Props = {
lists: {
name: string;
path?: string;
}[];
};
export const BreadCrumb = ({ lists }: Props) => {
return (
<ol className={`${breadCrumbStyles["list"]}`} aria-label="breadcrumb">
{lists.map(({ name = "ホーム", path = "/" }, index) => (
<li className={`${breadCrumbStyles["item"]}`} key={index}>
// 最後の要素以外は項目の右に 「>」 マークを表示させる。
{lists.length - 1 !== index ? (
<Link href={path}>
<a className={`${breadCrumbStyles["next"]}`}>{name}</a>
</Link>
) : (
<span aria-current="page">{name}</span>
)}
</li>
))}
</ol>
);
};
Breadcrumb.module.scss
.next {
&::after {
content: "";
width: 5px;
height: 5px;
transform: rotate(45deg);
display: inline-block;
border-top: 1px solid #ccc;
border-right: 1px solid #ccc;
margin: 0 6px 2px 4px;
}
}
.list {
display: flex;
}
.item {
font-size: 11px;
color: #aba4a2;
}
備考
-
WAI-AREAを意識して、olタグには
aria-label="breadcrumb"
、
現在表示中のページに該当するliタグにはaria-current="page"
を書くようにした。 -
現在のページに該当する項目はテキストリンクにならないように
span
で実装。
したがって現在のページに該当する項目にはパスを渡す必要がないので、propsの型であるpath
はオプショナルで定義。 -
スタイルは適当に残してます。