mirror of https://github.com/twbs/bootstrap.git
Offcanvas: activate focustrap when backdrop is enabled (#36717)
* fix(offcanvas): activate focustrap when backdrop is enabled * Adding tabindex='-1' for both offcanvases in the docs * Remove useless aria-expanded='false' in togglers * Update js/tests/unit/offcanvas.spec.js Co-authored-by: Julien Déramond <julien.deramond@orange.com> Co-authored-by: Julien Déramond <juderamond@gmail.com> Co-authored-by: Patrick H. Lauke <redux@splintered.co.uk>
This commit is contained in:
parent
8bb68b04b3
commit
713d7140f1
|
@ -114,7 +114,7 @@ class Offcanvas extends BaseComponent {
|
||||||
this._element.classList.add(CLASS_NAME_SHOWING)
|
this._element.classList.add(CLASS_NAME_SHOWING)
|
||||||
|
|
||||||
const completeCallBack = () => {
|
const completeCallBack = () => {
|
||||||
if (!this._config.scroll) {
|
if (!this._config.scroll || this._config.backdrop) {
|
||||||
this._focustrap.activate()
|
this._focustrap.activate()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -293,7 +293,8 @@ describe('Offcanvas', () => {
|
||||||
|
|
||||||
const offCanvasEl = fixtureEl.querySelector('.offcanvas')
|
const offCanvasEl = fixtureEl.querySelector('.offcanvas')
|
||||||
const offCanvas = new Offcanvas(offCanvasEl, {
|
const offCanvas = new Offcanvas(offCanvasEl, {
|
||||||
scroll: true
|
scroll: true,
|
||||||
|
backdrop: false
|
||||||
})
|
})
|
||||||
|
|
||||||
const spy = spyOn(offCanvas._focustrap, 'activate').and.callThrough()
|
const spy = spyOn(offCanvas._focustrap, 'activate').and.callThrough()
|
||||||
|
@ -306,6 +307,27 @@ describe('Offcanvas', () => {
|
||||||
offCanvas.show()
|
offCanvas.show()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('should trap focus if scroll is allowed OR backdrop is enabled', () => {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
fixtureEl.innerHTML = '<div class="offcanvas"></div>'
|
||||||
|
|
||||||
|
const offCanvasEl = fixtureEl.querySelector('.offcanvas')
|
||||||
|
const offCanvas = new Offcanvas(offCanvasEl, {
|
||||||
|
scroll: true,
|
||||||
|
backdrop: true
|
||||||
|
})
|
||||||
|
|
||||||
|
const spy = spyOn(offCanvas._focustrap, 'activate').and.callThrough()
|
||||||
|
|
||||||
|
offCanvasEl.addEventListener('shown.bs.offcanvas', () => {
|
||||||
|
expect(spy).toHaveBeenCalled()
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
|
||||||
|
offCanvas.show()
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('toggle', () => {
|
describe('toggle', () => {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{{ define "main" }}
|
{{ define "main" }}
|
||||||
<div class="container-xxl bd-gutter mt-3 my-md-4 bd-layout">
|
<div class="container-xxl bd-gutter mt-3 my-md-4 bd-layout">
|
||||||
<aside class="bd-sidebar">
|
<aside class="bd-sidebar">
|
||||||
<div class="offcanvas-lg offcanvas-start" id="bdSidebar" aria-labelledby="bdSidebarOffcanvasLabel">
|
<div class="offcanvas-lg offcanvas-start" tabindex="-1" id="bdSidebar" aria-labelledby="bdSidebarOffcanvasLabel">
|
||||||
<div class="offcanvas-header border-bottom">
|
<div class="offcanvas-header border-bottom">
|
||||||
<h5 class="offcanvas-title" id="bdSidebarOffcanvasLabel">Browse docs</h5>
|
<h5 class="offcanvas-title" id="bdSidebarOffcanvasLabel">Browse docs</h5>
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close" data-bs-target="#bdSidebar"></button>
|
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close" data-bs-target="#bdSidebar"></button>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<header class="navbar navbar-expand-lg navbar-dark bd-navbar sticky-top">
|
<header class="navbar navbar-expand-lg navbar-dark bd-navbar sticky-top">
|
||||||
<nav class="container-xxl bd-gutter flex-wrap flex-lg-nowrap" aria-label="Main navigation">
|
<nav class="container-xxl bd-gutter flex-wrap flex-lg-nowrap" aria-label="Main navigation">
|
||||||
{{- if eq .Layout "docs" }}
|
{{- if eq .Layout "docs" }}
|
||||||
<button class="navbar-toggler p-2" type="button" data-bs-toggle="offcanvas" data-bs-target="#bdSidebar" aria-controls="bdSidebar" aria-expanded="false" aria-label="Toggle docs navigation">
|
<button class="navbar-toggler p-2" type="button" data-bs-toggle="offcanvas" data-bs-target="#bdSidebar" aria-controls="bdSidebar" aria-label="Toggle docs navigation">
|
||||||
{{ partial "icons/hamburger.svg" (dict "class" "bi" "width" "24" "height" "24") }}
|
{{ partial "icons/hamburger.svg" (dict "class" "bi" "width" "24" "height" "24") }}
|
||||||
<span class="d-none fs-6 pe-1">Browse</span>
|
<span class="d-none fs-6 pe-1">Browse</span>
|
||||||
</button>
|
</button>
|
||||||
|
@ -13,11 +13,11 @@
|
||||||
{{ partial "icons/bootstrap-white-fill.svg" (dict "class" "d-block my-1" "width" "40" "height" "32") }}
|
{{ partial "icons/bootstrap-white-fill.svg" (dict "class" "d-block my-1" "width" "40" "height" "32") }}
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<button class="navbar-toggler d-flex d-lg-none order-3 p-2" type="button" data-bs-toggle="offcanvas" data-bs-target="#bdNavbar" aria-controls="bdNavbar" aria-expanded="false" aria-label="Toggle navigation">
|
<button class="navbar-toggler d-flex d-lg-none order-3 p-2" type="button" data-bs-toggle="offcanvas" data-bs-target="#bdNavbar" aria-controls="bdNavbar" aria-label="Toggle navigation">
|
||||||
<svg class="bi" aria-hidden="true"><use xlink:href="#three-dots"></use></svg>
|
<svg class="bi" aria-hidden="true"><use xlink:href="#three-dots"></use></svg>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<div class="offcanvas-lg offcanvas-end flex-grow-1" id="bdNavbar" aria-labelledby="bdNavbarOffcanvasLabel" data-bs-scroll="true">
|
<div class="offcanvas-lg offcanvas-end flex-grow-1" tabindex="-1" id="bdNavbar" aria-labelledby="bdNavbarOffcanvasLabel" data-bs-scroll="true">
|
||||||
<div class="offcanvas-header px-4 pb-0">
|
<div class="offcanvas-header px-4 pb-0">
|
||||||
<h5 class="offcanvas-title text-white" id="bdNavbarOffcanvasLabel">Bootstrap</h5>
|
<h5 class="offcanvas-title text-white" id="bdNavbarOffcanvasLabel">Bootstrap</h5>
|
||||||
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvas" aria-label="Close" data-bs-target="#bdNavbar"></button>
|
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvas" aria-label="Close" data-bs-target="#bdNavbar"></button>
|
||||||
|
|
Loading…
Reference in New Issue