使用 CSS 关键帧和 React 切换幻灯片淡出、幻灯片淡入(返回)
Toggle slide fade out, slide fade (back) in with CSS Keyframes and React
我有一个框 (div),我想用滑出动画切换,然后在按下按钮时在动画中滑回(完全相反)。
我不希望在初始页面呈现时出现任何动画。我能够在按下按钮时成功滑动页面的框 left/fade-out,但是向后滑动没有任何过渡或动画。
如何在元素返回视图时添加此过渡,而不添加将在初始页面呈现时触发的 class?
SlideBoxApp.js
class SlideBoxApp extends React.Component {
constructor(props) {
super(props)
this.state = {
slideIn: false
}
}
toggleSlide() {
const { slideIn } = this.state
this.setState({slideIn: !slideIn})
}
render() {
const { slideIn } = this.state
return (
<div>
<button onClick={() => this.toggleSlide()}>slide in</button>
<div className={`box ${slideIn? 'slideLeft' : ''}`}></div>
</div>
)
}
}
ReactDOM.render(<SlideBoxApp />, document.querySelector("#app"))
SlideBoxApp.css
body {
background: #20262E;
padding: 20px;
font-family: Helvetica;
}
button {
margin-bottom: 10px;
}
#app {
background: #fff;
border-radius: 4px;
padding: 20px;
transition: all 0.2s;
}
.box {
width: 100px;
height: 100px;
background-color: pink;
}
.slideLeft {
animation-duration: 500ms;
animation-name: slideLeft;
animation-fill-mode: forwards;
}
.slideRight {
animation-duration: 500ms;
animation-name: slideLeft;
animation-fill-mode: forwards;
}
@keyframes slideLeft {
0% {
transform: translate(0, 0);
opacity: 1;
}
100% {
transform: translate(-100%, 0);
opacity: 0;
}
}
@keyframes slideRight {
0% {
transform: translate(0, 0);
opacity: 0;
}
100% {
transform: translate(100%, 0);
opacity: 1;
}
}
the slide back in does not have any transition or animation
我已经搜索了一种解决方案,可以在 keyframe
被移除后将元素动画恢复到其原始状态,但找不到。
拥有 keyframe
意味着 start 和 end 状态之间的动画,因此如果要为这两个状态设置动画,初始页面动画是不可避免的 in 和 out.
但是,您只需 transition
而不是 keyframes
就可以达到您想要的结果。
只需在 .slideLeft
class:
中添加新状态
.slideLeft {
transform: translate(-100%, 0);
opacity: 0;
}
并给 .box
一些 transition
属性:
.box {
transition-duration: .5s;
transition-property: transform, opacity;
}
我更新了你的JS Fiddle。
我有一个框 (div),我想用滑出动画切换,然后在按下按钮时在动画中滑回(完全相反)。
我不希望在初始页面呈现时出现任何动画。我能够在按下按钮时成功滑动页面的框 left/fade-out,但是向后滑动没有任何过渡或动画。
如何在元素返回视图时添加此过渡,而不添加将在初始页面呈现时触发的 class?
SlideBoxApp.js
class SlideBoxApp extends React.Component {
constructor(props) {
super(props)
this.state = {
slideIn: false
}
}
toggleSlide() {
const { slideIn } = this.state
this.setState({slideIn: !slideIn})
}
render() {
const { slideIn } = this.state
return (
<div>
<button onClick={() => this.toggleSlide()}>slide in</button>
<div className={`box ${slideIn? 'slideLeft' : ''}`}></div>
</div>
)
}
}
ReactDOM.render(<SlideBoxApp />, document.querySelector("#app"))
SlideBoxApp.css
body {
background: #20262E;
padding: 20px;
font-family: Helvetica;
}
button {
margin-bottom: 10px;
}
#app {
background: #fff;
border-radius: 4px;
padding: 20px;
transition: all 0.2s;
}
.box {
width: 100px;
height: 100px;
background-color: pink;
}
.slideLeft {
animation-duration: 500ms;
animation-name: slideLeft;
animation-fill-mode: forwards;
}
.slideRight {
animation-duration: 500ms;
animation-name: slideLeft;
animation-fill-mode: forwards;
}
@keyframes slideLeft {
0% {
transform: translate(0, 0);
opacity: 1;
}
100% {
transform: translate(-100%, 0);
opacity: 0;
}
}
@keyframes slideRight {
0% {
transform: translate(0, 0);
opacity: 0;
}
100% {
transform: translate(100%, 0);
opacity: 1;
}
}
the slide back in does not have any transition or animation
我已经搜索了一种解决方案,可以在 keyframe
被移除后将元素动画恢复到其原始状态,但找不到。
拥有 keyframe
意味着 start 和 end 状态之间的动画,因此如果要为这两个状态设置动画,初始页面动画是不可避免的 in 和 out.
但是,您只需 transition
而不是 keyframes
就可以达到您想要的结果。
只需在 .slideLeft
class:
.slideLeft {
transform: translate(-100%, 0);
opacity: 0;
}
并给 .box
一些 transition
属性:
.box {
transition-duration: .5s;
transition-property: transform, opacity;
}
我更新了你的JS Fiddle。