如何使用 CSS-in-JS 方法设置 body 标签的样式?
How to style body tag with CSS-in-JS approach?
我是 CSS-in-JS 和情感的初学者,正在尝试将 sass React 应用移植到情感。从一开始我就遇到了不知道如何设置 body 标签样式的问题。
人们通常使用 document.body.style
来做这个吗?我在任何地方都找不到这个...
假设我想把下面的代码移植到情感上,那将如何实现?
$bodyFillColor: rgb(218, 236, 236);
body {
margin: 0;
padding: 0;
min-height: 100vh;
max-width: 100vw;
background-color: $bodyFillColor;
.noScroll {
overflow: hidden;
}
}
是否有涵盖此问题的最佳实践?
如果您使用的是 React 应用程序,您可以创建 index.css 文件并为正文设置您想要的属性。然后您必须将 index.css 文件导入您的 index.js 文件中,更改才会发生。
使用 Emotion,您可以设置一些东西,例如下面的 create-react-app 示例,以注入全局样式:
import React from 'react';
import ReactDOM from 'react-dom';
import { Global, css } from '@emotion/core'
const bodyFillColor = `rgb(218,236,236)`;
class App extends React.Component {
render() {
return(
<div>
<Global
styles={css`
body {
background: ${bodyFillColor};
margin: 0;
padding: 0;
min-height: '100vh';
max-width: '100vw';
}
`}
/>
<Global
styles={{
'body.noScroll': {
// Prevent scrolling; conditionally activate this
// in subcomponents when necessary ...
overflow: 'hidden',
},
}}
/>
</div>
);
}
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
这显示了在正文中注入样式并为正文分配 class 的示例,稍后可以有条件地激活它。
例如
{this.state.activate && <Global styles={{`stylesetc`}}/>}
https://emotion.sh/docs/globals
备选
StyledComponents 使用 CSS-in-JS 方法并且与 React 应用程序配合得很好。这是我过去直接从文档中使用的技术:
import { createGlobalStyle } from 'styled-components'
const GlobalStyle = createGlobalStyle`
body {
color: ${props => (props.whiteColor ? 'white' : 'black')};
}
`
// later in your app
<React.Fragment>
<Navigation /> {/* example of other top-level stuff */}
<GlobalStyle whiteColor />
</React.Fragment>
根据这个问题,如果任务小到在 js 中更改 body 的背景颜色,那么下面的方法也可以在代码中的任何地方执行,最有可能在 App.js
if(theme==='dark')
document.body.style.background = '#000'
else
document.body.style.background = '#FFF'
无需为此使用整个样式库。
我也试过编辑document.body.style,你也可以按照下面的例子试试
if(theme==='dark')
bgColor = '#000'
else
bgColor = '#FFF'
document.body.style= `background: ${bgColor}`
请记住,按照第二种方法,您可能会覆盖整个 body 样式,因此请注意这一点。
希望对您有所帮助:)
我是 CSS-in-JS 和情感的初学者,正在尝试将 sass React 应用移植到情感。从一开始我就遇到了不知道如何设置 body 标签样式的问题。
人们通常使用 document.body.style
来做这个吗?我在任何地方都找不到这个...
假设我想把下面的代码移植到情感上,那将如何实现?
$bodyFillColor: rgb(218, 236, 236);
body {
margin: 0;
padding: 0;
min-height: 100vh;
max-width: 100vw;
background-color: $bodyFillColor;
.noScroll {
overflow: hidden;
}
}
是否有涵盖此问题的最佳实践?
如果您使用的是 React 应用程序,您可以创建 index.css 文件并为正文设置您想要的属性。然后您必须将 index.css 文件导入您的 index.js 文件中,更改才会发生。
使用 Emotion,您可以设置一些东西,例如下面的 create-react-app 示例,以注入全局样式:
import React from 'react';
import ReactDOM from 'react-dom';
import { Global, css } from '@emotion/core'
const bodyFillColor = `rgb(218,236,236)`;
class App extends React.Component {
render() {
return(
<div>
<Global
styles={css`
body {
background: ${bodyFillColor};
margin: 0;
padding: 0;
min-height: '100vh';
max-width: '100vw';
}
`}
/>
<Global
styles={{
'body.noScroll': {
// Prevent scrolling; conditionally activate this
// in subcomponents when necessary ...
overflow: 'hidden',
},
}}
/>
</div>
);
}
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
这显示了在正文中注入样式并为正文分配 class 的示例,稍后可以有条件地激活它。
例如
{this.state.activate && <Global styles={{`stylesetc`}}/>}
https://emotion.sh/docs/globals
备选
StyledComponents 使用 CSS-in-JS 方法并且与 React 应用程序配合得很好。这是我过去直接从文档中使用的技术:
import { createGlobalStyle } from 'styled-components'
const GlobalStyle = createGlobalStyle`
body {
color: ${props => (props.whiteColor ? 'white' : 'black')};
}
`
// later in your app
<React.Fragment>
<Navigation /> {/* example of other top-level stuff */}
<GlobalStyle whiteColor />
</React.Fragment>
根据这个问题,如果任务小到在 js 中更改 body 的背景颜色,那么下面的方法也可以在代码中的任何地方执行,最有可能在 App.js
if(theme==='dark')
document.body.style.background = '#000'
else
document.body.style.background = '#FFF'
无需为此使用整个样式库。
我也试过编辑document.body.style,你也可以按照下面的例子试试
if(theme==='dark')
bgColor = '#000'
else
bgColor = '#FFF'
document.body.style= `background: ${bgColor}`
请记住,按照第二种方法,您可能会覆盖整个 body 样式,因此请注意这一点。
希望对您有所帮助:)