Ell*_*iot 12 reactjs styled-components
我正在尝试构建一个React组件来处理淡入和淡出.在下面的代码中,如果我out
作为prop 传递给组件,它会在动画制作之前被隐藏为隐藏.我试图让它在默认情况下淡入,然后在我传入out
道具时淡出.有人看到这个问题的解决方案吗?
import React from 'react';
import styled, { keyframes } from 'styled-components';
const fadeIn = keyframes`
from {
transform: scale(.25);
opacity: 0;
}
to {
transform: scale(1);
opacity: 1;
}
`;
const fadeOut = keyframes`
from {
transform: scale(1);
opacity: 0;
}
to {
transform: scale(.25);
opacity: 1;
}
`;
const Fade = styled.div`
${props => props.out ?
`display: none;`
: `display: inline-block;`
}
animation: ${props => props.out ? fadeOut : fadeIn} 1s linear infinite;
`;
function App() {
return (
<div>
<Fade><test></Fade>
</div>
);
}
export default App;
Run Code Online (Sandbox Code Playgroud)
mxs*_*tbr 15
您的代码的问题是,当props.out为true时,您将display属性设置为none.这就是为什么你没有看到任何动画,因为在此之前甚至可以开始你已经隐藏了组件!
执行淡出动画的方法是使用visibility属性,并将其转换为与动画相同的时间.(见这个旧的答案)
这样的事情可以解决你的问题:
const Fade = styled.default.div`
display: inline-block;
visibility: ${props => props.out ? 'hidden' : 'visible'};
animation: ${props => props.out ? fadeOut : fadeIn} 1s linear;
transition: visibility 1s linear;
`;
Run Code Online (Sandbox Code Playgroud)
const fadeIn = styled.keyframes`
from {
transform: scale(.25);
opacity: 0;
}
to {
transform: scale(1);
opacity: 1;
}
`;
const fadeOut = styled.keyframes`
from {
transform: scale(1);
opacity: 1;
}
to {
transform: scale(.25);
opacity: 0;
}
`;
const Fade = styled.default.div`
display: inline-block;
visibility: ${props => props.out ? 'hidden' : 'visible'};
animation: ${props => props.out ? fadeOut : fadeIn} 1s linear;
transition: visibility 1s linear;
`;
class App extends React.Component {
constructor() {
super()
this.state = {
visible: true,
}
}
componentDidMount() {
setTimeout(() => {
this.setState({
visible: false,
})
}, 1000)
}
render() {
return (
<div>
<Fade out={!this.state.visible}><test></Fade>
</div>
);
}
}
ReactDOM.render(
<App />,
document.getElementById('root')
)
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<script src="https://unpkg.com/styled-components/dist/styled-components.min.js"></script>
<div id="root" />
Run Code Online (Sandbox Code Playgroud)
注意:您的fadeOut动画也从0变为1不透明度,而不是相反.我已经在片段中解决了这个问题.
归档时间: |
|
查看次数: |
9307 次 |
最近记录: |