Skip to content

Latest commit

 

History

History
156 lines (126 loc) · 3.78 KB

readme.md

File metadata and controls

156 lines (126 loc) · 3.78 KB

本节作者:@愚指导

这一讲,我们来实现 Wtfswap 的 Layout 头部部分的 UI。


设计稿如下所示:

headui

样式比较简单,右侧我们可以使用 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 组件,并设置了 typetext,以匹配设计稿的样式。

接下来我们继续完善 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 样式我们就完成了。