tailwindcss を使用した Next.js のレスポンシブ グローバル ナビゲーション バー
29187 ワード
ナビゲーションバーは、ウェブサイトの最も重要な部分の 1 つです.ユーザーは、それなしではどこへ行くべきかわかりません. tailwindcss を使用して Next.js でレスポンシブなナビゲーション バーを作成する方法を詳しく見ていきましょう.また、ナビゲーション バーをすべてのページに表示する方法も紹介します.
すべてを読みたくない場合は、コードだけを読みたい場合は、https://github.com/dmuraco3/navbar にアクセスしてください.
プロジェクトの作成
Tailwind CSS のインストール
テンプレート パスの構成
CSS に Tailwind ディレクティブを追加する
これで環境がすべてセットアップされ、準備が整いました
コンポーネントを保持するために、ルート ディレクトリにコンポーネント フォルダを作成します.
このフォルダに
3 つの関数を作成し、1 つをインポートします.
最初にモバイル ナビゲーションを作成しましょう
これでナビゲーションバーを作成できます
これで、ナビゲーション バーは
すべてをまとめると、次のようになります.
これで、ナビゲーション バーが作成されましたが、表示されません.各ページ機能にアクセスしてコンポーネントを追加することもできますが、それは繰り返しになるため、より良い方法があります.
ルート レベル ファイル
これで、レスポンシブなナビゲーション バーが動作するようになりました.
読んでくれてありがとう!
すべてを読みたくない場合は、コードだけを読みたい場合は、https://github.com/dmuraco3/navbar にアクセスしてください.
環境のセットアップ
プロジェクトの作成
npx create-next-app@latest navbar
cd navbar
Tailwind CSS のインストール
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
テンプレート パスの構成
tailwind.config.js
module.exports = {
content: [
"./pages/**/*.{js,ts,jsx,tsx}",
"./components/**/*.{js,ts,jsx,tsx}",
],
theme: {
extend: {},
},
plugins: [],
}
CSS に Tailwind ディレクティブを追加する
globals.css
...
@tailwind base;
@tailwind components;
@tailwind utilities;
...
これで環境がすべてセットアップされ、準備が整いました
ナビゲーションバーの構築
コンポーネントを保持するために、ルート ディレクトリにコンポーネント フォルダを作成します.
このフォルダに
navbar.js
という名前の新しいファイルを作成します3 つの関数を作成し、1 つをインポートします.
navbar.js
import {useState} from 'react'
function NavLink({to, children}) {
}
function MobileNav({open, setOpen}) {
}
export default function Navbar() {
}
最初にモバイル ナビゲーションを作成しましょう
navbar.js
...
function MobileNav({open, setOpen}) {
return (
<div className={`absolute top-0 left-0 h-screen w-screen bg-white transform ${open ? "-translate-x-0" : "-translate-x-full"} transition-transform duration-300 ease-in-out filter drop-shadow-md `}>
<div className="flex items-center justify-center filter drop-shadow-md bg-white h-20"> {/*logo container*/}
<a className="text-xl font-semibold" href="/">LOGO</a>
</div>
<div className="flex flex-col ml-4">
<a className="text-xl font-medium my-4" href="/about" onClick={() => setTimeout(() => {setOpen(!open)}, 100)}>
About
</a>
<a className="text-xl font-normal my-4" href="/contact" onClick={() => setTimeout(() => {setOpen(!open)}, 100)}>
Contact
</a>
</div>
</div>
)
}
...
これでナビゲーションバーを作成できます
navbar.js
export default function Navbar() {
const [open, setOpen] = useState(false)
return (
<nav className="flex filter drop-shadow-md bg-white px-4 py-4 h-20 items-center">
<MobileNav open={open} setOpen={setOpen}/>
<div className="w-3/12 flex items-center">
<a className="text-2xl font-semibold" href="/">LOGO</a>
</div>
<div className="w-9/12 flex justify-end items-center">
<div className="z-50 flex relative w-8 h-8 flex-col justify-between items-center md:hidden" onClick={() => {
setOpen(!open)
}}>
{/* hamburger button */}
<span className={`h-1 w-full bg-black rounded-lg transform transition duration-300 ease-in-out ${open ? "rotate-45 translate-y-3.5" : ""}`} />
<span className={`h-1 w-full bg-black rounded-lg transition-all duration-300 ease-in-out ${open ? "w-0" : "w-full"}`} />
<span className={`h-1 w-full bg-black rounded-lg transform transition duration-300 ease-in-out ${open ? "-rotate-45 -translate-y-3.5" : ""}`} />
</div>
<div className="hidden md:flex">
<NavLink to="/contact">
CONTACT
</NavLink>
<NavLink to="/about">
ABOUT
</NavLink>
</div>
</div>
</nav>
)
}
これで、ナビゲーション バーは
NavLink
に依存します.これは非常に単純なコンポーネントです.navbar.js
function NavLink({to, children}) {
return <a href={to} className={`mx-4`}>
{children}
</a>
}
すべてをまとめると、次のようになります.
navbar.js
import { useState } from 'react'
function NavLink({to, children}) {
return <a href={to} className={`mx-4`}>
{children}
</a>
}
function MobileNav({open, setOpen}) {
return (
<div className={`absolute top-0 left-0 h-screen w-screen bg-white transform ${open ? "-translate-x-0" : "-translate-x-full"} transition-transform duration-300 ease-in-out filter drop-shadow-md `}>
<div className="flex items-center justify-center filter drop-shadow-md bg-white h-20"> {/*logo container*/}
<a className="text-xl font-semibold" href="/">LOGO</a>
</div>
<div className="flex flex-col ml-4">
<a className="text-xl font-medium my-4" href="/about" onClick={() => setTimeout(() => {setOpen(!open)}, 100)}>
About
</a>
<a className="text-xl font-normal my-4" href="/contact" onClick={() => setTimeout(() => {setOpen(!open)}, 100)}>
Contact
</a>
</div>
</div>
)
}
export default function Navbar() {
const [open, setOpen] = useState(false)
return (
<nav className="flex filter drop-shadow-md bg-white px-4 py-4 h-20 items-center">
<MobileNav open={open} setOpen={setOpen}/>
<div className="w-3/12 flex items-center">
<a className="text-2xl font-semibold" href="/">LOGO</a>
</div>
<div className="w-9/12 flex justify-end items-center">
<div className="z-50 flex relative w-8 h-8 flex-col justify-between items-center md:hidden" onClick={() => {
setOpen(!open)
}}>
{/* hamburger button */}
<span className={`h-1 w-full bg-black rounded-lg transform transition duration-300 ease-in-out ${open ? "rotate-45 translate-y-3.5" : ""}`} />
<span className={`h-1 w-full bg-black rounded-lg transition-all duration-300 ease-in-out ${open ? "w-0" : "w-full"}`} />
<span className={`h-1 w-full bg-black rounded-lg transform transition duration-300 ease-in-out ${open ? "-rotate-45 -translate-y-3.5" : ""}`} />
</div>
<div className="hidden md:flex">
<NavLink to="/contact">
CONTACT
</NavLink>
<NavLink to="/about">
ABOUT
</NavLink>
</div>
</div>
</nav>
)
}
すべてのページにナビゲーションバーを表示する
これで、ナビゲーション バーが作成されましたが、表示されません.各ページ機能にアクセスしてコンポーネントを追加することもできますが、それは繰り返しになるため、より良い方法があります.
ルート レベル ファイル
_app.js
では、Navbar コンポーネントをインポートして、ルート レベル コンポーネントでレンダリングする必要があります._app.js
import Navbar from '../components/navbar'
import '../styles/globals.css'
function MyApp({ Component, pageProps }) {
return <>
<Navbar/>
<Component {...pageProps} />
</>
}
export default MyApp
これで、レスポンシブなナビゲーション バーが動作するようになりました.
読んでくれてありがとう!
Reference
この問題について(tailwindcss を使用した Next.js のレスポンシブ グローバル ナビゲーション バー), 我々は、より多くの情報をここで見つけました https://dev.to/dmuraco3/responsive-global-navbar-in-nextjs-with-tailwindcss-45p4テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol