涉及的技術棧
- vue3
- vite
- bootstrap5
背景
- 在用bootstrap5的時候遇到一個問題,就是offcanvas在nav上的時候居然會有兩個背景BackDrop,關閉之後頁面上還有一個backdrop留在那
- bootstrap5文件裡面提供了幾個Method可以控制Offcanvas例項的顯示隱藏,但是不會用
復現問題
- 點選offcanvas中的導航控制元件,頁面正常跳轉,但是無法關閉offcanvas
- 點選offcanvas外部區域,會多一次backdrop,無法直接關閉
解決方式
參考連結:https://stackoverflow.com/questions/73428036/how-to-hide-bootstrap-offcanvas-in-vue3-when-router-link-is-clicked#:~:text=you have to create an offcanvas instance with,let myOffcanvas %3D document.getElementById('offcanvasDarkNavbar') let bsOffcanvas %3D bootstrap.Offcanvas.getInstance(myOffcanvas)%3B
- 跳轉無法關閉offcanvas
透過StackOverflow中提供的解決方式
部分offcanvas程式碼
<div id="offcanvasNavbar" ref="offcanvasRef" class="offcanvas-start offcanvas">
<div class="offcanvas-header"></div>
<div class="offcanvas-body"></div>
</div>
點選跳轉連結,觸發點選事件的時候,加上這個來隱藏offcanvas
引入bootstrap
import * as bootstrap from 'bootstrap';
hideThisCanvas(){
let myOffcanvas = document.getElementById('offcanvasDarkNavbar');
let bsOffcanvas = bootstrap.Offcanvas.getInstance(myOffcanvas);
bsOffcanvas.hide();
}
透過ref的方式試了一下對我這裡好像沒什麼用,所以就直接透過查詢DOM來獲取offcanvas的例項了
- 自動關閉offcanvas無法關閉多出來的backdrop
為什麼一個offcanvas會有倆backdrop,我也還沒明白為啥,文件裡面的示例都只有一個backdrop來的
所以目前就透過在關閉offcanvas的時候,再呼叫一下刪除所有backdrop的方法了
在@click的事件裡面同時傳入點選事件例項
<ul class="dropdown-menu">
<li><a class="dropdown-item bi bi-file-image" @click="jump($event, '/path1')">套圖</a></li>
<li><a class="dropdown-item bi bi-file-richtext" @click="jump($event, '/path2')">圖文</a>
</li>
</ul>
removeDocumentBackdrops(e) {
let list = document.getElementsByClassName('offcanvas-backdrop');
for (let i = 0; i < list.length; i++) {
list[i].remove();
}
},
一通百通
上述過程也可以應用到Bootstrap其他的元件上,呼叫對應的method控制元件狀態
- 引入import * as bootstrap from 'bootstrap';
- 初始化元件 bootstrap.Offcanvas.getInstance(myOffcanvas);
注意 bootstrap有些元件可能沒有