React
通过JS改变CSS
Styled
代码示例:
// src/App.jsx
import React from "react";
import {createRoot} from "react-dom/client";
import Animation from "./styled-components/Animation";
createRoot(document.getElementById('root')).render(<Animation/>)
// src/styled-components/App.jsx
import React from "react";
import {StyledFooter} from "./StyledAll";
export default function App() {
return (
<StyledFooter>
<ul>
<li>首页</li>
<li>内容</li>
<li>我的</li>
</ul>
</StyledFooter>
)
}
// src/styled-components/Pierce.jsx
import React from "react";
import {StyledInput, StyledDiv} from "./StyledAll";
export default function Pierce() {
return (
<div>
<StyledInput type="text" placeholder={'请输入'}/>
<StyledDiv bg={'gray'}/>
</div>
)
}
// src/styled-components/Custom.jsx
import React from "react";
import {StyledChild} from './StyledAll'
function Child(props) {
// 接收传过来的样式属性
return (
<div className={props.className}>
Child
</div>
)
}
export {Child}
export default function Custom() {
return (
<div>
<StyledChild/>
</div>
)
}
// src/styled-components/StyledAll.jsx
import styled, {keyframes} from "styled-components";
import {Child} from "./Custom";
// 变量名规范写法(支持嵌套写法)
const StyledFooter = styled.footer`
background: #30363d;
position: fixed;
left: 0;
bottom: 0;
width: 100%;
height: 50px;
line-height: 50px;
text-align: center;
ul {
display: flex;
list-style: none;
li {
flex: 1;
&:hover {
background: #1f1e33;
}
}
}
`
// 原生属性直接透传过去
const StyledInput = styled.input`
outline: none;
border-radius: 10px;
border-bottom: 1px solid gray;
`
// 自定义属性(||:没有对应的自定义属性时默认的样式)
const StyledDiv = styled.div`
background: ${props => props.bg || 'aqua'};
width: 100px;
height: 100px;
`
// 高阶组件封装时会传一个props属性给包装的组件
const StyledChild = styled(Child)`
background: aquamarine;
`
// 样式扩展(继承)
const StyledButton01 = styled.button`
width: 100px;
height: 100px;
background: #30363d;
`
const StyledButton02 = styled(StyledButton01)`
background: aqua;
`
// 加动画
const myanimation = keyframes`
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
`
const StyledDiv02 = styled.div`
width: 100px;
height: 100px;
background: aqua;
animation: ${myanimation} 1s infinite;
`
export {
StyledFooter,
StyledInput,
StyledDiv,
StyledChild,
StyledButton01,
StyledButton02,
StyledDiv02
}
// src/styled-components/Animation.jsx
import React from "react";
import {StyledDiv02} from "./StyledAll";
export default function Animation() {
return (
<div>
<StyledDiv02/>
</div>
)
}
// src/styled-components/Extend.jsx
import React from "react";
import {StyledButton01, StyledButton02} from './StyledAll'
export default function Extend() {
return (
<div>
<StyledButton01>Button01</StyledButton01>
<StyledButton02>Button02</StyledButton02>
</div>
)
}