From 81e7cb76f76fbb9ecb79ea07e10e12febfb09311 Mon Sep 17 00:00:00 2001 From: Kevinjohn Gallagher Date: Mon, 20 Jul 2026 01:43:27 +0100 Subject: [PATCH] Fix offcanvas dispose scroll reset --- js/src/offcanvas.js | 4 ++++ js/tests/unit/offcanvas.spec.js | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/js/src/offcanvas.js b/js/src/offcanvas.js index 8d1feb13bb78..619ad3dbd889 100644 --- a/js/src/offcanvas.js +++ b/js/src/offcanvas.js @@ -158,6 +158,10 @@ class Offcanvas extends BaseComponent { } dispose() { + if (this._isShown && !this._config.scroll) { + new ScrollBarHelper().reset() + } + this._backdrop.dispose() this._focustrap.deactivate() super.dispose() diff --git a/js/tests/unit/offcanvas.spec.js b/js/tests/unit/offcanvas.spec.js index 3b6c98c1004c..5a435cff4bce 100644 --- a/js/tests/unit/offcanvas.spec.js +++ b/js/tests/unit/offcanvas.spec.js @@ -621,6 +621,26 @@ describe('Offcanvas', () => { expect(offCanvas._focustrap).toBeNull() expect(Offcanvas.getInstance(offCanvasEl)).toBeNull() }) + + it('should reset scrollbars when disposing a shown offcanvas with disabled scroll', () => { + return new Promise(resolve => { + fixtureEl.innerHTML = '
' + + const offCanvasEl = fixtureEl.querySelector('div') + const offCanvas = new Offcanvas(offCanvasEl) + const spyReset = spyOn(ScrollBarHelper.prototype, 'reset').and.callThrough() + + offCanvasEl.addEventListener('shown.bs.offcanvas', () => { + offCanvas.dispose() + + expect(spyReset).toHaveBeenCalled() + expect(document.body.style.overflow).toEqual('') + resolve() + }) + + offCanvas.show() + }) + }) }) describe('data-api', () => {