【Bootstrap】modalやnavbarが動作しないとき

Bootstrapを使っていてmodalが表示されない、navbarのメニューボタンを押しても作動しないという問題が生じて詰まったので記録。

# 該当のコード
こちらだとボタンを押してもモーダルが表示されないという状況でした
（今回の例ではBootstrapをCDN経由で利用しています）

```modal.html
<!-- Bootstrap core CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
</head>
<body>

<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal">
  Launch demo modal
</button>

<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
        <button type="button" class="btn-close" data-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>
<!-- Bootstrap JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
</body>
```

# 解決策
`data-`を`data-bs-`に変更する
```modal.html
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">
<!-- 略 -->

<!-- Modal -->
        <!-- 略 -->
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
        <!-- 略 -->
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
    　　　　　　　　<!-- 略 -->
```
Bootstrap 4.xと5.xでは若干仕様の変更があったようです（ https://getbootstrap.jp/docs/5.0/migration/ ）
 > すべての JavaScript プラグインのデータ属性は、Bootstrap の機能をサードパーティやあなた自身のコードと区別するために、名前付きになりました。例えば、data-toggle の代わりに data-bs-toggle を使用します。
* 4.xだと`data-`
* 5.xだと`data-bs-`
* navbarのtogglerボタンも同様
  ```navbar.html
  <!-- Bootstrap 4.x -->
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
  <!-- Bootstrap 5.x -->
  <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
  ```
つまり、使用するBootstrapのバージョンと`data`属性の書き方を揃えないといけないということでした

# 補足
関連する仕様の変更として、5.xではこれまでjQueryに依存していた部分がJavaScriptで書き換えられたようです
したがって4.xを使用する場合は引き続きjQueryも読み込む必要があります
```modal.html
<!-- Bootstrap core CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css">
<body>
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal">
  Launch demo modal
</button>

<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
        <button type="button" class="btn-close" data-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>
<!-- jQuery -->
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<!-- Bootstrap JS -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.bundle.min.js"></script>
</body>
</html>
```
ちなみに、`bootstrap.bundle.`とか`bootstrap.min`が何かよくわからなかったので調べてみました
* `bootstrap.js`：コンパイルされたCSS, JS
* `bootstrap.min.js`：ミニファイ（圧縮）されたCSS, JS
* `bootstrap.bundle.min.js`：バンドル（一つにまとめる）されたJS
  * popper.jsが含まれている
  * jQueryは含まない
  * CSSには`bundle`なし 


### Bootstrapのファイル構成
```
bootstrap/
├── css/
│   ├── bootstrap-grid.css
│   ├── bootstrap-grid.css.map
│   ├── bootstrap-grid.min.css
│   ├── bootstrap-grid.min.css.map
│   ├── bootstrap-reboot.css
│   ├── bootstrap-reboot.css.map
│   ├── bootstrap-reboot.min.css
│   ├── bootstrap-reboot.min.css.map
│   ├── bootstrap.css
│   ├── bootstrap.css.map
│   ├── bootstrap.min.css
│   └── bootstrap.min.css.map
└── js/
    ├── bootstrap.bundle.js
    ├── bootstrap.bundle.js.map
    ├── bootstrap.bundle.min.js
    ├── bootstrap.bundle.min.js.map
    ├── bootstrap.js
    ├── bootstrap.js.map
    ├── bootstrap.min.js
    └── bootstrap.min.js.map
```
参考　https://getbootstrap.jp/docs/4.2/getting-started/contents/