aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartijn Cuppens <[email protected]>2020-11-25 22:12:32 +0200
committerXhmikosR <[email protected]>2020-12-06 18:42:40 +0200
commitd8f247392d203726a5d59404d96b54d8987fbc01 (patch)
tree87581b7f23f03cfd7b294787a8d8565a9fecf0c2
parent444715744644965a977080fa7f74b4fed005cab5 (diff)
downloadbootstrap-d8f247392d203726a5d59404d96b54d8987fbc01.tar.xz
bootstrap-d8f247392d203726a5d59404d96b54d8987fbc01.zip
Fix conflict with Bootstrap CSS
-rw-r--r--js/src/dropdown.js30
-rw-r--r--scss/_dropdown.scss23
2 files changed, 25 insertions, 28 deletions
diff --git a/js/src/dropdown.js b/js/src/dropdown.js
index 04c299600..4e25f5729 100644
--- a/js/src/dropdown.js
+++ b/js/src/dropdown.js
@@ -57,7 +57,6 @@ const CLASS_NAME_SHOW = 'show'
const CLASS_NAME_DROPUP = 'dropup'
const CLASS_NAME_DROPEND = 'dropend'
const CLASS_NAME_DROPSTART = 'dropstart'
-const CLASS_NAME_MENUEND = 'dropdown-menu-end'
const CLASS_NAME_NAVBAR = 'navbar'
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]'
@@ -268,22 +267,23 @@ class Dropdown extends BaseComponent {
_getPlacement() {
const parentDropdown = this._element.parentNode
- let placement = PLACEMENT_BOTTOM
- // Handle dropup
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
+ return PLACEMENT_RIGHT
+ }
+
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
+ return PLACEMENT_LEFT
+ }
+
+ // We need to trim the value because custom properties can also include spaces
+ const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'
+
if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
- placement = this._menu.classList.contains(CLASS_NAME_MENUEND) ?
- PLACEMENT_TOPEND :
- PLACEMENT_TOP
- } else if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
- placement = PLACEMENT_RIGHT
- } else if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
- placement = PLACEMENT_LEFT
- } else if (this._menu.classList.contains(CLASS_NAME_MENUEND)) {
- placement = PLACEMENT_BOTTOMEND
- }
-
- return placement
+ return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP
+ }
+
+ return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM
}
_detectNavbar() {
diff --git a/scss/_dropdown.scss b/scss/_dropdown.scss
index 9db6937ae..c86aac625 100644
--- a/scss/_dropdown.scss
+++ b/scss/_dropdown.scss
@@ -32,19 +32,29 @@
border: $dropdown-border-width solid $dropdown-border-color;
@include border-radius($dropdown-border-radius);
@include box-shadow($dropdown-box-shadow);
+
+ // Reset positioning when positioned with Popper
+ &[style] {
+ right: auto;
+ }
}
// scss-docs-start responsive-breakpoints
+// We deliberately hardcode the `bs-` prefix because we check
+// this custom property in JS to determine Popper's positioning
+
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
.dropdown-menu#{$infix}-start {
+ --bs-position: start;
right: auto #{"/* rtl:ignore */"};
left: 0 #{"/* rtl:ignore */"};
}
.dropdown-menu#{$infix}-end {
+ --bs-position: end;
right: 0 #{"/* rtl:ignore */"};
left: auto #{"/* rtl:ignore */"};
}
@@ -101,19 +111,6 @@
}
}
-// When Popper is enabled, reset the basic dropdown position
-// stylelint-disable-next-line no-duplicate-selectors
-.dropdown-menu {
- &[data-popper-placement^="top"],
- &[data-popper-placement^="right"],
- &[data-popper-placement^="bottom"],
- &[data-popper-placement^="left"] {
- right: auto;
- bottom: auto;
- left: auto;
- }
-}
-
// Dividers (basically an `<hr>`) within the dropdown
.dropdown-divider {