TLDR -使用css在js解决方案(如情感或样式组件),享受最好的css和js所提供的
在css或scss文件中,很难管理动态样式。在内联样式标签中,不能使用媒体查询或伪选择器。
在JS中使用CSS,你可以享受两全其美。JS中的Css之于Css有点像React之于HTML。它允许在JS代码中以对象或字符串的形式编写css,并享受javascript生态系统的强大功能和工具。
到目前为止,js库中有一些受欢迎的、得到良好支持的CSS,包括Emotion、styles - components和镭。
让我们比较一下样式化简单元素时代码的样子。我们将设置“hello world”div的样式,这样它在桌面上显示大,在移动端显示小。
使用style属性
return (
<div style={{fontSize:24}} className="hello-world">
Hello world
</div>
)
由于媒体查询在样式标签中是不可能的,我们必须向元素中添加一个className并添加一个css规则。
@media screen and (max-width: 700px){
.hello-world {
font-size: 16px;
}
}
使用Emotion的10 CSS标签
return (
<div
css={{
fontSize: 24,
[CSS_CONSTS.MOBILE_MAX_MEDIA_QUERY]:{
fontSize: 16
}
}
>
Hello world
</div>
)
Emotion还支持模板字符串和样式化组件。所以如果你喜欢,你可以这样写:
return (
<Box>
Hello world
</Box>
)
const Box = styled.div`
font-size: 24px;
${CSS_CONSTS.MOBILE_MAX_MEDIA_QUERY}{
font-size: 16px;
}
`
“JS中的CSS”背后使用的是CSS类。
最佳实践
以下是我推荐的一些最佳实践:
在JS中使用CSS解决方案
在JS中构造样式代码与构造一般的代码非常相似。例如:
识别重复的样式,并将它们写在一个地方。在Emotion中有两种方法:
// option 1 - Write common styles in CONSTANT variables
// styles.js
export const COMMON_STYLES = {
BUTTON: css`
background-color: blue;
color: white;
:hover {
background-color: dark-blue;
}
`
}
// SomeButton.js
const SomeButton = (props) => {
...
return (
<button
css={COMMON_STYLES.BUTTON}
...
>
Click Me
</button>
)
}
// Option 2 - Write your common styles in a dedicated component
const Button = styled.button`
background-color: blue;
color: white;
:hover {
background-color: dark-blue;
}
`
const SomeButton = (props) => {
...
return (
<Button ...>
Click me
</Button>
)
}
React编码模式是封装组件- HTML和JS,控制组件被写在一个文件中。这是你的css/样式代码样式的组件属于。
必要时,为组件添加样式道具。通过这种方式,您可以重用在子组件中编写的代码和样式,并通过父组件对其进行定制以满足您的特定需求。
const Button = styled.button([COMMON_STYLES.BUTTON, props=>props.stl])
const SmallButton = (props)=>(
<Button
...
stl={css`font-size: 12px`}
>
Click me if you can see me
</Button>
)
const BigButton = (props) => (
<Button
...
stl={css`font-size: 30px;`}
>
Click me
</Button>
)