3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

React で折り畳み (Collapse) をアニメーション付きで実装する

Last updated at Posted at 2021-09-25

React で折り畳み (Collapse) をアニメーション付きで実装しました。

ezgif.com-gif-maker (1).gif

ちょっとハマったので記録を残しておきます。

実装コード

App.tsx
import { useState } from 'react'

import './App.css'

const App = () => {
  const [open, setOpen] = useState(false)

  const onClick = () => setOpen((prev) => !prev)

  return (
    <>
      <button onClick={onClick}>{open ? 'close' : 'open'}</button>
      <div className={`collapse ${open ? 'visible' : 'hidden'}`}>example</div>
    </>
  )
}

export default App

App.css
.collapse {
  transition: height 300ms;
  overflow: hidden;
  color: white;
  background-color: #333;
}

.visible {
  height: 30px;
}

.hidden {
  height: 0;
}

CSS のポイント

  • 折り畳み (Collapse) を開いた時と閉じた時で height を切り替える
  • transition: height {X}ms; を指定する
  • overflow: hidden; を指定する

ハマった箇所

overflow: hidden;

overflow: hidden; を指定しないと、子要素(例だと「example」というテキスト)がアニメーションに関係なく表示されてしまいます。
ezgif.com-gif-maker (2).gif
stack overflow の記事を見て overflow: hidden; を指定する事に気づきました。

display: none;

元は Bootstrap の Collapse を真似て作ろうと思ったのですが、元のソースコードを眺めていると非表示時は display: none;設定されていました
この部分だけ読んでいた自分が早合点した可能性もありますが、 display: none; だと DOM がマウントされていないので transition が機能しませんでした。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?