javascript - 在 React 转换之前,Div 已经填补了它的位置
问题描述
我正在动态渲染和动画 div。它工作得很好,但它有点“弹出”另一个 div 的位置,并且不能顺利地将它向下推或拉回来。
所以基本上我有一个按钮,下面有两个 div。在您单击按钮之前,不会呈现第一个 div。然后第二个 div 立即向下推并为 div 清除空间。当您再次点击该按钮时,它会等待另一个 div 呈现出屏幕并突然弹回。
问题是我不能只拉起第二个 div,因为当第一个 div 没有被渲染时,它只会掩盖我的按钮,我不能在第二个 div 进入时将其动画化,否则它将是低。所以我有点卡在这里。
class App extends React.Component {
constructor(props) {
super(props)
this.state = {
show: false,
shouldRender: false,
class: ''
}
}
componentDidUpdate(prevProps, prevState) {
if (!prevState.show && this.state.show) {
this.setState({
shouldRender: true
})
setTimeout(() => {
this.setState({ class: 'showDiv' })
}, 0)
}
if (prevState.show && !this.state.show) {
setTimeout(() => {
this.setState({
shouldRender: false
})
}, 1000)
this.setState({ class: '' })
}
}
render() {
return (
<div>
<button
style={{
display: 'block',
border: 'none',
padding: '20px',
background: 'blue',
color: 'white',
fontSize: '20px',
margin: '10px',
cursor: 'pointer'
}}
onClick={() => this.setState({ show: !this.state.show }) }
>
Toggle Div
</button>
{this.state.shouldRender && <div className={`baseDiv ${this.state.class}`} />}
<div
style={{
width: '200px',
height: '200px',
background: '#999',
margin: '5px'
}}
/>
</div>
)
}
}
ReactDOM.render(<App />, document.getElementById('root'));
.baseDiv {
width: 200px;
height: 200px;
background: #333;
margin: 5px;
transition: all 1s ease;
transform: translateY(-200%);
}
.showDiv {
transform: translateY(0%);
}
<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>
<div id="root"></div>
解决方案
您还应该同时为第二个 div 设置动画。我也使用同一个showDiv
类来触发 secondDiv 上的动画。另一个大问题是,一旦第一个 div 得到渲染,它的整个高度就会被计算(200px),这会立即将 secondDiv 向下推。相反,给你的 firstDiv 一个position: absolute
,以便它的高度在添加到 dom 时不会影响 secondDiv:
class App extends React.Component {
constructor(props) {
super(props)
this.state = {
show: false,
shouldRender: false,
class: ''
}
}
componentDidUpdate(prevProps, prevState) {
if (!prevState.show && this.state.show) {
this.setState({
shouldRender: true
})
setTimeout(() => {
this.setState({ class: 'showDiv' })
}, 0)
}
if (prevState.show && !this.state.show) {
setTimeout(() => {
this.setState({
shouldRender: false
})
}, 1000)
this.setState({ class: '' })
}
}
render() {
return (
<div style={{ position: 'relative' }}>
<button
style={{
display: 'block',
border: 'none',
padding: '20px',
background: 'blue',
color: 'white',
fontSize: '20px',
margin: '10px',
cursor: 'pointer'
}}
onClick={() => this.setState({ show: !this.state.show }) }
>
Toggle Div
</button>
{this.state.shouldRender && <div className={`baseDiv ${this.state.class}`} />}
<div
className={`secondDiv ${this.state.class}`}
style={{
width: '200px',
height: '200px',
background: '#999',
margin: '5px'
}}
/>
</div>
)
}
}
ReactDOM.render(<App />, document.getElementById('root'));
.baseDiv {
width: 200px;
height: 200px;
background: #333;
margin: 5px;
transition: all 1s ease;
transform: translateY(-200%);
position: absolute;
top: 70px;
left: 0;
}
.showDiv {
transform: translateY(0%);
}
.secondDiv {
transition: all 1s ease;
transform: translateY(0%);
}
.secondDiv.showDiv {
transform: translateY(105%);
}
<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>
<div id="root"></div>
推荐阅读
- button - 在applescript中需要帮助编程按钮
- flutter - 如何在应用内浏览器窗口中打开链接
- javascript - requestAnimationFrame 仅在需要时运行动画比一直使用 requestAnimationFrame 快得多
- python - 返回 -1 (len(splits) - 1)?
- python - 使用 statsmodels 包应用动态因子模型后如何准确获得拟合值?
- postgresql - 如何为 psql 动态创建输出文件
- python - Django Rest API - 无法发出 PUT 或 DELETE 请求
- html - 内部 css 在移动浏览器上的电子邮件模板中不起作用
- android - 如何创建一个自定义的 AlertDialog,它能够将输入的数据传回 Android 中的调用 Activity?
- playlist - youtube-dl:如何跳过播放列表中不可用片段的视频,但不中止播放列表下载?