Is Bootstrap Multiselect Still Viable? Native Support and Modern Alternatives

Bootstrap multiselect remains viable for basic interfaces through native HTML styling, but advanced functionality requires third-party plugins compatible with Bootstrap 5's vanilla JavaScript architecture.

The twbs/bootstrap repository fundamentally changed its approach to interactive components in version 5, removing jQuery dependencies and shifting to vanilla ES6. While this modernization improved performance, it disrupted legacy plugin ecosystems. Understanding the current state of bootstrap multiselect implementation requires examining the core source files and evaluating which external libraries align with the framework's current JavaScript patterns.

Bootstrap 5's Native Multiselect Capabilities

The .form-select Class Implementation

Bootstrap 5 does not ship a dedicated multiselect widget. Instead, the framework provides visual styling for the native HTML <select> element through the .form-select class, defined in scss/forms/_form-select.scss. This stylesheet handles borders, focus states, sizing variables, and disabled states for all select elements, including those bearing the multiple attribute.

The documentation in site/src/content/docs/forms/select.mdx confirms that adding multiple to a .form-select element creates a standard multi-select box without requiring additional JavaScript initialization. This approach ensures accessibility and zero-dependency performance but provides only the browser's default interaction patterns.

Limitations of Native Implementation

Relying solely on Bootstrap's core styling limits your user experience to basic HTML multi-select behavior. You will not receive searchable dropdowns, removable tag pills, select-all controls, or checkbox-based selection interfaces. For applications requiring these patterns, you must integrate external libraries that complement Bootstrap's CSS foundation.

Third-Party Bootstrap Multiselect Solutions

The jQuery Compatibility Break

The original bootstrap-multiselect plugin was built exclusively on jQuery, which Bootstrap 5 removed as a core dependency. As implemented in the current architecture documented in site/src/content/docs/getting-started/javascript.mdx, Bootstrap's JavaScript utilities use vanilla ES6 modules. Using the legacy plugin requires loading jQuery as an additional dependency, increasing bundle size and introducing potential namespace conflicts.

Modern Vanilla JavaScript Alternatives

For production applications requiring rich functionality, choose framework-agnostic libraries that respect Bootstrap's styling:

Choices.js provides a lightweight, accessible replacement with search, filtering, and tag removal features. Because it uses vanilla JavaScript, it aligns perfectly with Bootstrap 5's architectural decisions.

Select2 remains viable when configured with Bootstrap 5-specific themes, though initialization requires careful management to avoid CSS specificity conflicts with .form-select classes.

Modern forks of bootstrap-multiselect have emerged that refactor the original codebase to remove jQuery dependencies, maintaining familiar APIs while supporting Bootstrap 5's vanilla-JS ecosystem.

Implementation Examples

Basic Native Multiple Select

For simple use cases requiring no additional dependencies, use Bootstrap's built-in styling:

<select class="form-select" multiple aria-label="Multiple select example">
  <option selected>Option 1</option>
  <option>Option 2</option>
  <option>Option 3</option>
  <option>Option 4</option>
</select>

This produces a standard multi-select box that inherits Bootstrap's form-control aesthetics, including focus rings and validation states.

Integrating Choices.js with Bootstrap 5

To add search and tagging capabilities while maintaining visual consistency:

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/choices.js/public/assets/styles/choices.min.css" rel="stylesheet">

<select id="mySelect" class="form-select" multiple>
  <option value="1">Apple</option>
  <option value="2">Banana</option>
  <option value="3">Cherry</option>
  <option value="4">Date</option>
</select>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/choices.js/public/assets/scripts/choices.min.js"></script>
<script>
  const element = document.getElementById('mySelect');
  const choices = new Choices(element, {
    removeItemButton: true,
    searchEnabled: true,
    shouldSort: false
  });
</script>

The element retains the .form-select class for Bootstrap's base styling, while Choices.js enhances interactivity without jQuery.

Legacy jQuery Plugin (With Compatibility Caveats)

If your project already includes jQuery, the original bootstrap-multiselect plugin remains functional:

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-multiselect@1.0.16/dist/css/bootstrap-multiselect.css" rel="stylesheet">

<select id="legacySelect" multiple class="form-select">
  <option value="1">Red</option>
  <option value="2">Green</option>
  <option value="3">Blue</option>
</select>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-multiselect@1.0.16/dist/js/bootstrap-multiselect.min.js"></script>
<script>
  $('#legacySelect').multiselect({
    enableFiltering: true,
    buttonWidth: '100%'
  });
</script>

Warning: This approach requires jQuery, which contradicts Bootstrap 5's vanilla-JS philosophy. Use only if your project already depends on jQuery, otherwise prefer modern alternatives.

Best Practices for Implementation

  • Load order matters: Include third-party CSS after Bootstrap's stylesheet to ensure proper cascade resolution and prevent style overrides.
  • Preserve base classes: Initialize plugins on elements that already have the .form-select class to maintain Bootstrap's visual foundation.
  • Check CSS custom properties: Verify that chosen libraries support Bootstrap 5's CSS variables defined in the source SCSS files.
  • Test accessibility: Custom multiselect widgets must manually implement ARIA patterns that native selects handle automatically, as noted in the framework's accessibility guidelines.

Summary

  • Bootstrap 5 does not include a dedicated multiselect widget; native support is limited to CSS styling via .form-select in scss/forms/_form-select.scss.
  • The original bootstrap-multiselect plugin requires jQuery, creating compatibility friction with Bootstrap 5's vanilla JavaScript architecture.
  • For advanced functionality, integrate modern vanilla-JS libraries like Choices.js that complement Bootstrap's form styling without adding jQuery overhead.
  • Always load external plugin assets after Bootstrap's core files to ensure visual consistency with the design system.
  • Native <select multiple> elements remain the most accessible and performant option for simple multi-selection scenarios.

Frequently Asked Questions

Does Bootstrap 5 have a built-in multiselect component?

No. According to the source code in scss/forms/_form-select.scss and documentation in site/src/content/docs/forms/select.mdx, Bootstrap 5 only provides CSS styling for the native HTML <select multiple> element. The framework intentionally excludes JavaScript functionality for advanced multiselect features like search or tagging to keep the core library lightweight.

Why doesn't the original bootstrap-multiselect plugin work with Bootstrap 5?

The original plugin depends on jQuery for DOM manipulation and event handling, which Bootstrap 5 removed as a core dependency. The framework's JavaScript utilities, as documented in site/src/content/docs/getting-started/javascript.mdx, are now written in vanilla ES6. Using the legacy plugin requires either adding jQuery as a separate dependency or migrating to a modern fork that eliminates jQuery requirements.

Which multiselect library works best with Bootstrap 5?

Choices.js offers the cleanest integration because it uses vanilla JavaScript and respects existing CSS classes without conflicting with Bootstrap's JavaScript modules. It provides search, filtering, and tag removal while maintaining Bootstrap 5's visual design language. Alternatively, Select2 works with proper theme configuration, and modern jQuery-free forks of bootstrap-multiselect maintain familiar APIs for developers transitioning from older versions.

How do I style a native multiselect to look like Bootstrap?

Add the .form-select class to your <select multiple> element. The SCSS definitions in scss/forms/_form-select.scss automatically apply Bootstrap's form-control aesthetics, including border styling, focus states, sizing variants, and validation coloring, ensuring the element matches other Bootstrap form components without additional JavaScript.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →