本节作者:@愚指导 这一讲,我们来实现 Wtfswap 的 Layout 头部部分的 UI。 设计稿如下所示: headui 样式比较简单,右侧我们可以使用 Ant Design Web3 的 ConnectButton 组件,其它部分可以直接用些样式,样式我们基于 CSSModules 来写,NextJS 默认支持,而且更好理解,比较适合课程中使用。当然实际项目中你也可以按照你的需求使用其它方案。 我们新建 ,并初始化部分内容: 稍后我们再来补充相关内容,在这之前先修改 : 这里用了 Link 组件来实现页面的跳转。另外引入了 ConnectButton 组件,并设置了 为 ,以匹配设计稿的样式。
本节作者:@愚指导
这一讲,我们来实现 Wtfswap 的 Layout 头部部分的 UI。
设计稿如下所示:

样式比较简单,右侧我们可以使用 Ant Design Web3 的 ConnectButton 组件,其它部分可以直接用些样式,样式我们基于 CSSModules 来写,NextJS 默认支持,而且更好理解,比较适合课程中使用。当然实际项目中你也可以按照你的需求使用其它方案。
我们新建 components/WtfLayout/styles.module.css,并初始化部分内容:
.header { .title { } .nav { } }
稍后我们再来补充相关内容,在这之前先修改 Header.tsx:
import Link from "next/link"; import { ConnectButton } from "@ant-design/web3"; import styles from "./styles.module.css"; export default function WtfHeader() { return ( <div className={styles.header}> <div className={styles.title}>WTFSwap</div> <div className={styles.nav}> <Link href="/wtfswap">Swap</Link> <Link href="/wtfswap/pool">Pool</Link> </div> <div> <ConnectButton type="text" /> </div> </div> ); }
这里用了 Link 组件来实现页面的跳转。另外引入了 ConnectButton 组件,并设置了 type 为 text,以匹配设计稿的样式。
接下来我们继续完善 styles.module.csss 中的样式:
.header { height: 56px; line-height: 56px; padding-inline: 24px; background-color: #e8f1ff; display: flex; flex-direction: row; justify-content: space-between; border-bottom: 1px solid #d7e1eb; } .title { font-size: 16px; font-weight: bold; } .nav { display: flex; gap: 64px; } .nav a { font-size: 14px; opacity: 0.65; }
接下来我们还要实现高亮当前页面对应的导航的样式,首先我们需要把要高亮的 Link 组件添加上一个 className:
import Link from "next/link"; + import { usePathname } from "next/navigation"; import { ConnectButton } from "@ant-design/web3"; import styles from "./styles.module.css"; export default function WtfHeader() { + const pathname = usePathname(); + const isSwapPage = pathname === "/wtfswap"; return ( <div className={styles.header}> <div className={styles.title}>WTFSwap</div> <div className={styles.nav}> <Link href="/wtfswap" + className={isSwapPage ? styles.active : undefined} > Swap </Link> <Link href="/wtfswap/pool" + className={!isSwapPage ? styles.active : undefined} > Pool </Link> </div> <div> <ConnectButton type="text" /> </div> </div> ); }
然后添加相关样式:
.nav a.active { font-weight: bold; opacity: 1; }
除了头部样式外,我们再补充一下布局的背景颜色。修改 WtfLayout/index.tsx 如下:
import React from "react"; import Header from "./Header"; + import styles from "./styles.module.css"; interface WtfLayoutProps { children: React.ReactNode; } const WtfLayout: React.FC<WtfLayoutProps> = ({ children }) => { return ( - <div> + <div className={styles.layout}> <Header /> {children} </div> ); }; export default WtfLayout;
然后在 styles.module.css 中添加:
min-height: 100vh; background: linear-gradient(to bottom, #e8f1ff, #f6f7f9);
至此,布局头部的 UI 样式我们就完成了。