diff --git a/js/src/dropdown.js b/js/src/dropdown.js
index 39a4a86ca4ce19805e8e6d5dfa0aaed9e3907716..846746384b073534188158a8d10ae7d3bdd553b4 100644
--- a/js/src/dropdown.js
+++ b/js/src/dropdown.js
@@ -52,8 +52,11 @@ const Dropdown = (($) => {
   }
 
   const ClassName = {
-    DISABLED : 'disabled',
-    SHOW     : 'show'
+    DISABLED  : 'disabled',
+    SHOW      : 'show',
+    DROPUP    : 'dropup',
+    MENURIGHT : 'dropdown-menu-right',
+    MENULEFT  : 'dropdown-menu-left'
   }
 
   const Selector = {
@@ -142,7 +145,7 @@ const Dropdown = (($) => {
       }
 
       // Handle dropup
-      const dropdownPlacement = $(this._element).parent().hasClass('dropup') ? AttachmentMap.TOP : this._config.placement
+      const dropdownPlacement = $(this._element).parent().hasClass(ClassName.DROPUP) ? AttachmentMap.TOP : this._config.placement
       this._popper = new Popper(this._element, this._menu, {
         placement : dropdownPlacement,
         modifiers : {
@@ -151,6 +154,11 @@ const Dropdown = (($) => {
           },
           flip : {
             enabled : this._config.flip
+          },
+          beforeApplyStyle: {
+            order: 899, // 900 is the order of applyStyle
+            enabled: true,
+            fn: this._beforePopperApplyStyle
           }
         }
       })
@@ -230,6 +238,23 @@ const Dropdown = (($) => {
       return this._menu
     }
 
+    _beforePopperApplyStyle(data) {
+      if ($(data.instance.popper).hasClass(ClassName.MENURIGHT)) {
+        data.styles = {
+          right: 0,
+          left: 'auto'
+        }
+      }
+
+      if ($(data.instance.popper).hasClass(ClassName.MENULEFT)) {
+        data.styles = {
+          right: 'auto',
+          left: 0
+        }
+      }
+      return data
+    }
+
     // static
 
     static _jQueryInterface(config) {
diff --git a/js/tests/visual/dropdown.html b/js/tests/visual/dropdown.html
index 45c5d51722b53aa7a4c45c2f9888ee99572a03ec..166cbf7259b76470d63445b987a9d388ef50d29e 100644
--- a/js/tests/visual/dropdown.html
+++ b/js/tests/visual/dropdown.html
@@ -59,19 +59,45 @@
         </li>
       </ul>
 
-    <!-- Default dropup button -->
-    <div class="btn-group dropup" style="margin-top: 60px;">
-      <button type="button" class="btn btn-secondary">Dropup</button>
-      <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-        <span class="sr-only">Toggle Dropdown</span>
-      </button>
-      <div class="dropdown-menu">
-        <a class="dropdown-item" href="#">Action</a>
-        <a class="dropdown-item" href="#">Another action</a>
-        <a class="dropdown-item" href="#">Something else here</a>
+      <div class="row">
+        <div class="col-sm-12 mt-4">
+          <!-- Default dropup button -->
+          <div class="btn-group dropup">
+            <button type="button" class="btn btn-secondary">Dropup</button>
+            <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+              <span class="sr-only">Toggle Dropdown</span>
+            </button>
+            <div class="dropdown-menu">
+              <a class="dropdown-item" href="#">Action</a>
+              <a class="dropdown-item" href="#">Another action</a>
+              <a class="dropdown-item" href="#">Something else here</a>
+            </div>
+          </div>
+
+          <div class="btn-group">
+            <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+              This dropdown's menu is right-aligned
+            </button>
+            <div class="dropdown-menu dropdown-menu-right">
+              <button class="dropdown-item" type="button">Action</button>
+              <button class="dropdown-item" type="button">Another action</button>
+              <button class="dropdown-item" type="button">Something else here</button>
+            </div>
+          </div>
+
+          <div class="btn-group">
+            <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+              This dropdown's menu is left-aligned
+            </button>
+            <div class="dropdown-menu dropdown-menu-left">
+              <button class="dropdown-item" type="button">Action</button>
+              <button class="dropdown-item" type="button">Another action</button>
+              <button class="dropdown-item" type="button">Something else here</button>
+            </div>
+          </div>
+        </div>
       </div>
     </div>
-    </div>
 
     <script src="../../../docs/assets/js/vendor/jquery-slim.min.js"></script>
     <script src="../../../docs/assets/js/vendor/popper.min.js"></script>
diff --git a/scss/_dropdown.scss b/scss/_dropdown.scss
index 981a17cb86344312a5c16af904bc7fb44510d449..d9e75b0aa7450cb4d44fc26adbf899ce6f3c519f 100644
--- a/scss/_dropdown.scss
+++ b/scss/_dropdown.scss
@@ -108,20 +108,6 @@
   }
 }
 
-// Menu positioning
-//
-// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
-// menu with the parent.
-.dropdown-menu-right {
-  right: 0;
-  left: auto !important; // Reset the default from `.dropdown-menu`
-}
-
-.dropdown-menu-left {
-  right: auto !important;
-  left: 0;
-}
-
 .dropdown-menu.show {
   display: block;
 }