Chakra UI で Menu や Popover で表示される謎のスペースをなくす方法

2024/03/16に公開

こんにちは 👋
先日、Chakra UI を使っているときに MenuPopover で生まれる絶妙なスペースを消したい場面に遭遇して、その解決方法を探すのに苦労したので、今回はその方法を備忘録的に残したいと思います!

やりたいこと

消したいスペースを矢印で指している画像

ソースコードは以下です。説明のためにそれぞれ isOpen={true} を指定しています。

App.tsx
import { ChevronDownIcon } from "@chakra-ui/icons";
import {
  Button,
  Flex,
  Menu,
  MenuButton,
  MenuItem,
  MenuList,
  Popover,
  PopoverBody,
  PopoverCloseButton,
  PopoverContent,
  PopoverHeader,
  PopoverTrigger,
} from "@chakra-ui/react";

function App() {
  return (
    <Flex w="100vw" px={10} pt={5} gap={"300px"}>
      <Menu isOpen={true}>
        <MenuButton as={Button} rightIcon={<ChevronDownIcon />}>
          Menu
        </MenuButton>
        <MenuList>
          <MenuItem>Download</MenuItem>
          <MenuItem>Create a Copy</MenuItem>
          <MenuItem>Mark as Draft</MenuItem>
          <MenuItem>Delete</MenuItem>
          <MenuItem>Attend a Workshop</MenuItem>
        </MenuList>
      </Menu>
      <Popover isOpen={true}>
        <PopoverTrigger>
          <Button>Popover</Button>
        </PopoverTrigger>
        <PopoverContent>
          <PopoverCloseButton />
          <PopoverHeader>Confirmation!</PopoverHeader>
          <PopoverBody>
            Are you sure you want to have that milkshake?
          </PopoverBody>
        </PopoverContent>
      </Popover>
    </Flex>
  );
}

export default App;

解決方法

解決方法は簡単で、<Menu /><Popover />offset={[0, 0]} を指定してあげることで解決できます!

App.tsx
import { ChevronDownIcon } from "@chakra-ui/icons";
import {
  Button,
  Flex,
  Menu,
  MenuButton,
  MenuItem,
  MenuList,
  Popover,
  PopoverBody,
  PopoverCloseButton,
  PopoverContent,
  PopoverHeader,
  PopoverTrigger,
} from "@chakra-ui/react";

function App() {
  return (
    <Flex w="100vw" px={10} pt={5} gap={"300px"}>
      <Menu isOpen={true} offset={[0, 0]}>
        <MenuButton as={Button} rightIcon={<ChevronDownIcon />}>
          Menu
        </MenuButton>
        <MenuList>
          <MenuItem>Download</MenuItem>
          <MenuItem>Create a Copy</MenuItem>
          <MenuItem>Mark as Draft</MenuItem>
          <MenuItem>Delete</MenuItem>
          <MenuItem>Attend a Workshop</MenuItem>
        </MenuList>
      </Menu>
      <Popover isOpen={true} offset={[0, 0]}>
        <PopoverTrigger>
          <Button>Popover</Button>
        </PopoverTrigger>
        <PopoverContent>
          <PopoverCloseButton />
          <PopoverHeader>Confirmation!</PopoverHeader>
          <PopoverBody>
            Are you sure you want to have that milkshake?
          </PopoverBody>
        </PopoverContent>
      </Popover>
    </Flex>
  );
}

export default App;

すると、こんな感じにスペースがなくなります。

消したいスペースの除去に成功した画像

最後に

以上で終わりになります!

それにしても、こういう言語化しにくい問題の検索の仕方って難しいですね 🤔
そして記事のタイトルの付け方も難しい!

同じ問題で困っている人がしっかりこの記事に辿り着けますように 🙏

それでは 👋

GitHubで編集を提案

Discussion