7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【chakra-ui】謎のマージンが降りてくる

Last updated at Posted at 2022-05-09

謎のマージンが降りてくる

事象

Stackの子要素にマージンを当てたいが・・・

export default function App() {
  return (
    <VStack bg="grey">
      <Box h={50} w={100} bg="pink" marginLeft={10}>
        A
      </Box>
      <Box h={50} w={100} bg="pink" marginLeft={10}>
        B
      </Box>
      <Box h={50} w={100} bg="pink" marginLeft={10}>
        C
      </Box>
    </VStack>
  );
}

謎のcssがあたってくるので、想定通りのマージンを当てることができない

image.png

*:not(style)~*:not(style)というスタイルが打ち消しのスタイルを持っており、それを当てない場合はコード通りのスタイルがあたる。

image.png

これはChakraのIssueにも取り上げられています。

ここでのコメントにある通り、Stackコンポーネントの目的上、正しい挙動のようです。

しかし、設計システムの観点からは、現在の動作は正しいです。このStackコンポーネントは、「どのコンポーネントが空白を所有しているか」という問題を解決するためのアプローチです。
https://github.com/chakra-ui/chakra-ui/issues/2578#issuecomment-753468114

Stackは子要素のスペースを管理している(責務がある)ので、Stackに設定されたspacingが優先される。

    <VStack>
      <A />
      <B />
      <C marginTop="4" />
      <D />
    </VStack>

ではなく

    <VStack>
      <A />
      <VStack spacing="4">
        <B />
        <C />
      </VStack>
      <D />
    </VStack>

が正しい。

これらを踏まえると、個人的にはStackのspacingで混乱しそうなコンポーネント(≒階層が深いコンポーネント)はStackを使わずに、margin/paddingで実装していくほうが混乱を招かないので、Boxで階層構造を作り、階層が1つの見通しのよいコンポーネントでStackのspacingを使用していくのが直感的かなと感じています。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?