我在一个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有一个额外的样式:
为什么样式化的组件要添加带有边距的额外样式?
1条答案
按热度按时间yqlxgs2m1#
原因是CSS specificity .当你把样式直接放到样式对象中时,它具有最高的特异性,因此会覆盖任何其他竞争CSS。当你把它放在
styled-components
中时,它会有效地把样式放在CSS类中,并将元素链接到它。你在其他组件中有其他样式(可能是父样式),因为它们具有更高的特异性而变得相关。您需要找到那些您不想要的样式并删除它们。你也可以像
margin: 1rem !important;
一样添加!important
,以强制它具有更高的特异性,但这通常被认为是相当笨拙的。