css 当我有margin属性时,为什么样式化组件要添加边距

w6mmgewl  于 2023-02-20  发布在  其他
关注(0)|答案(1)|浏览(127)

我在一个flex容器中有3个样式化的组件,第二个和第三个没有正确的边距。它们有一个额外的样式,其边距覆盖了StyledDiv中的边距,但我不知道为什么。
我有一个这样的样式组件

const StyledComponent = (): JSX.Element => {
// assume all divs are flex
  return (
    <StyledDiv>
      <SomeComponent />
    </StyledDiv>
  )
}
const BorderStack = styled.div<{ isExistingWorkflow: boolean }>`
  margin: 1rem;
  padding: 1.5rem;
  width: 100%;
  border: 1px solid #d5dadf' ;

另一个里面装着这些东西:

const Component = (): JSX.Element => {
  return (
    <div>
      <StyledComponent />
      <StyledComponent />
      <StyledComponent />
    </div>
  )
}

如果我把margin属性放到div中,就像<div style={{margin: '1rem'}}>这样,就不会有问题了。在DOM中,第一个StyledComponent是这样的:

然后下面两个StyledComponent有一个额外的样式:

为什么样式化的组件要添加带有边距的额外样式?

yqlxgs2m

yqlxgs2m1#

原因是CSS specificity .当你把样式直接放到样式对象中时,它具有最高的特异性,因此会覆盖任何其他竞争CSS。当你把它放在styled-components中时,它会有效地把样式放在CSS类中,并将元素链接到它。你在其他组件中有其他样式(可能是父样式),因为它们具有更高的特异性而变得相关。您需要找到那些您不想要的样式并删除它们。
你也可以像margin: 1rem !important;一样添加!important,以强制它具有更高的特异性,但这通常被认为是相当笨拙的。

相关问题