Logo

dev-resources.site

for different kinds of informations.

Fix Bootstrap 5.3 modal's rootElement

Published at
11/29/2024
Categories
bootstrap
javascript
Author
andrewelans
Categories
2 categories in total
bootstrap
open
javascript
open
Author
11 person written this
andrewelans
open
Fix Bootstrap 5.3 modal's rootElement

When placing a Bootstrap 5.3 modal inside a container other than body, bootstrap's <div class="modal-backdrop fade show"></div>, that is a dark half-transparent layer under modal, is always appended to body instead of the specified container, giving wrong behavior as explained here or here.

Backdrop's source code has this part:

const Default = {
  className: 'modal-backdrop',
  clickCallback: null,
  isAnimated: false,
  isVisible: true, // if false, we use the backdrop helper without adding any element to the dom
  rootElement: 'body' // give the choice to place backdrop under different elements
}
Enter fullscreen mode Exit fullscreen mode

However there is no mechanism provided to specify rootElement in the bootstrap options.

I fixed as follows in bootstrap.bundle.js version v5.3.3

  1. Find class Backdrop extends Config, there _configAfterMerge(config)
  2. Replace config.rootElement = ... with config.rootElement = getElement(config.rootElement) || document.body; with will fallback to body if rootElement is not found, ie. null returned from getElement():
_configAfterMerge(config) {
      // use getElement() with the default "body" to get a fresh Element on each instantiation
      config.rootElement = getElement(config.rootElement) || document.body;
      return config;
}
Enter fullscreen mode Exit fullscreen mode
  1. Find class Modal extends BaseComponent, there _initializeBackDrop()
  2. add after isAnimated: this._isAnimated() a new property rootElement: this._config.rootElement:
_initializeBackDrop() {
      return new Backdrop({
        isVisible: Boolean(this._config.backdrop),
        // 'static' option will be translated to true, and booleans will keep their value,
        isAnimated: this._isAnimated(),
        rootElement: this._config.rootElement
      });
}
Enter fullscreen mode Exit fullscreen mode

When initializing your bootstrap with new bootstrap add rootElement: <your container: HTMLElement as object or string selector>, for example:

const myModal = new bootstrap.Modal(
    document.getElementById('myModal')
    , {
        backdrop: "static", 
        rootElement: '#your-div'
    }
)
myModal.show()
Enter fullscreen mode Exit fullscreen mode

Here's my usage in SPA.

// I have a dynamic modal in my SPA, so I'm rendering a modal
// inside a DocumentFragment first and save this modal object
// in a variable so that I can call modal's methods after, like close()

const VALUES = {
    modal: {
        id: 'my-modal',
        obj: null
    }
}

const fragment = document.createRange().createContextualFragment(
    `<div class="modal fade" id="my-modal" tabindex="-1">
     ...
     </div>`
)
const rootElement = document.getElementById('my-container');
VALUES.modal.obj = new bootstrap.Modal(
    fragment.getElementById('my-modal')    
    , {
        backdrop: "static", 
        rootElement
    }
)
rootElement.append(fragment)
VALUES.modal.obj.show()
Enter fullscreen mode Exit fullscreen mode
bootstrap Article's
30 articles in total
Favicon
JSON Visual Edit
Favicon
Best Card Styling
Favicon
Tailwind CSS vs Bootstrap: Which one of these is going to last in the future?
Favicon
How to Compile and Use fw_printenv in the OKMX6UL Series Linux 4.1.15 System
Favicon
Learnings From Startup to Multimillion-Dollar EdTech Empire
Favicon
Top 15+ Free & Open-source React Admin Dashboard Templates with GitHub Links for 2025
Favicon
What are the best UI libraries stack for bootstrap 5 or react bootstrap for single project?
Favicon
A Beginnerโ€™s Guide to Getting Started with Front-End Frameworks
Favicon
Bootstrap: Creating Menus, Navbars, and Modals in Web Development
Favicon
Bootstrap vs. Pure CSS Grid: A Comparison Guide
Favicon
bootstrap
Favicon
Getting Started with Bootstrap in React: A Complete Guide
Favicon
Organize your layout by using <div> elements and Bootstrap ๐Ÿคน
Favicon
Case Study of a Tech Education Startup of $15 Million Revenue
Favicon
Web-Based Medical Prescription Management System
Favicon
๐Ÿš€ Bootstrap: The Essential Front-End Framework ๐Ÿ’ป
Favicon
Top 10 CSS Frameworks for Front-End Developers in 2024
Favicon
Building a Feature-Rich Admin Dashboard with Angular and Bootstrap 5
Favicon
5 Top Libraries Each Frontend Developer Must Know
Favicon
Fix Bootstrap 5.3 modal's rootElement
Favicon
CSS Flexbox vs Gridbox: A Detailed Comparison
Favicon
Blur page body when hover on Nav Bar
Favicon
My New Bootstrap 4 Card Generator
Favicon
How to Install Bootstrap 5 in Laravel 11 with Vite?
Favicon
Why I Built the "Soo Good" Vegan Burger Website ๐ŸŒฑ
Favicon
My Journey from BootstrapCSS to TailwindCSS: A Backend Developerโ€™s Perspective
Favicon
How to Install Bootstrap 5 in Laravel 11 with Vite?
Favicon
work with projects in php or laravel framework with html, css, js, boostrap, mysql.
Favicon
Level Up Your Game
Favicon
Stop the AI Obsession: The Smart Way to Validate Your Startup Idea

Featured ones: