Overflow menu

Overflow menu

Code:
<!--
  Copyright IBM Corp. 2016, 2018

  This source code is licensed under the Apache-2.0 license found in the
  LICENSE file in the root directory of this source tree.
-->
<div data-overflow-menu class="bx--overflow-menu">
  <button
    class="bx--overflow-menu__trigger bx--tooltip__trigger bx--tooltip--a11y bx--tooltip--right bx--tooltip--align-start"
    aria-haspopup="true" aria-expanded="false" id="example-xuad5aeojs-trigger" aria-controls="example-xuad5aeojs">
    <span class="bx--assistive-text">Overflow</span>
    <svg focusable="false" preserveAspectRatio="xMidYMid meet" style="will-change: transform;" xmlns="http://www.w3.org/2000/svg" class="bx--overflow-menu__icon" width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="3" r="1"></circle><circle cx="8" cy="8" r="1"></circle><circle cx="8" cy="13" r="1"></circle></svg>
  </button>
  <div class="bx--overflow-menu-options" tabindex="-1" role="menu"
    aria-labelledby="example-xuad5aeojs-trigger" data-floating-menu-direction="bottom"
    id="example-xuad5aeojs">
    <ul  class="bx--overflow-menu-options__content">
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"  title="An example option that is really long to show what should be done to handle long text"
            data-floating-menu-primary-focus  >
          <span class="bx--overflow-menu-options__option-content">
            An example option that is really long to show what should be done to handle long text
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Option 2
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Option 3
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Option 4
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  bx--overflow-menu-options__option--disabled  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"    disabled >
          <span class="bx--overflow-menu-options__option-content">
            Disabled
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option   bx--overflow-menu-options__option--danger ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Danger option
          </span>
        </button>
      </li>
    </ul>
    <!-- Note: focusable span allows for focus wrap feature within Overflow Menus -->
    <span tabindex="0"></span>
  </div>
</div>

<div data-overflow-menu class="bx--overflow-menu">
  <button
    class="bx--overflow-menu__trigger bx--tooltip__trigger bx--tooltip--a11y bx--tooltip--left bx--tooltip--align-start"
    aria-haspopup="true" aria-expanded="false" id="example-l4bpfdxpgwn-trigger" aria-controls="example-l4bpfdxpgwn">
    <span class="bx--assistive-text">Overflow</span>
    <svg focusable="false" preserveAspectRatio="xMidYMid meet" style="will-change: transform;" xmlns="http://www.w3.org/2000/svg" class="bx--overflow-menu__icon" width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="3" r="1"></circle><circle cx="8" cy="8" r="1"></circle><circle cx="8" cy="13" r="1"></circle></svg>
  </button>
  <div class="bx--overflow-menu-options bx--overflow-menu--flip" tabindex="-1"
    data-floating-menu-direction="bottom" role="menu" aria-labelledby="example-l4bpfdxpgwn-trigger"
    id="example-l4bpfdxpgwn">
    <ul  class="bx--overflow-menu-options__content">
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"  title="An example option that is really long to show what should be done to handle long text"
            data-floating-menu-primary-focus  >
          <span class="bx--overflow-menu-options__option-content">
            An example option that is really long to show what should be done to handle long text
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Option 2
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Option 3
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Option 4
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  bx--overflow-menu-options__option--disabled  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"    disabled >
          <span class="bx--overflow-menu-options__option-content">
            Disabled
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option   bx--overflow-menu-options__option--danger ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Danger option
          </span>
        </button>
      </li>
    </ul>
    <span tabindex="0"></span>
  </div>
</div>

<div data-overflow-menu class="bx--overflow-menu">
  <button
    class="bx--overflow-menu__trigger bx--tooltip__trigger bx--tooltip--a11y bx--tooltip--left bx--tooltip--align-start"
    aria-haspopup="true" aria-expanded="false" id="example-84hcfck7wg-trigger" aria-controls="example-84hcfck7wg">
    <span class="bx--assistive-text">Overflow</span>
    <svg focusable="false" preserveAspectRatio="xMidYMid meet" style="will-change: transform;" xmlns="http://www.w3.org/2000/svg" class="bx--overflow-menu__icon" width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="3" r="1"></circle><circle cx="8" cy="8" r="1"></circle><circle cx="8" cy="13" r="1"></circle></svg>
  </button>
  <div class="bx--overflow-menu-options bx--overflow-menu--flip" tabindex="-1"
    data-floating-menu-direction="bottom" role="menu" aria-labelledby="example-84hcfck7wg-trigger"
    id="example-84hcfck7wg">
    <ul  class="bx--overflow-menu-options__content">
      <li
        class="bx--overflow-menu-options__option">
        <a href="https://www.ibm.com" class="bx--overflow-menu-options__btn" role="menuitem" 
          title="An example option that is really long to show what should be done to handle long text"   data-floating-menu-primary-focus>
          <span class="bx--overflow-menu-options__option-content">
            An example option that is really long to show what should be done to handle long text
          </span>
        </a>
      </li>
      <li
        class="bx--overflow-menu-options__option">
        <a href="https://www.ibm.com" class="bx--overflow-menu-options__btn" role="menuitem"  >
          <span class="bx--overflow-menu-options__option-content">
            Option 2
          </span>
        </a>
      </li>
      <li
        class="bx--overflow-menu-options__option">
        <a href="https://www.ibm.com" class="bx--overflow-menu-options__btn" role="menuitem"  >
          <span class="bx--overflow-menu-options__option-content">
            Option 3
          </span>
        </a>
      </li>
      <li
        class="bx--overflow-menu-options__option">
        <a href="https://www.ibm.com" class="bx--overflow-menu-options__btn" role="menuitem"  >
          <span class="bx--overflow-menu-options__option-content">
            Option 4
          </span>
        </a>
      </li>
      <li
        class="bx--overflow-menu-options__option bx--overflow-menu-options__option--disabled">
        <a href="https://www.ibm.com" class="bx--overflow-menu-options__btn" role="menuitem"  
          tabindex="-1" aria-disabled="true" >
          <span class="bx--overflow-menu-options__option-content">
            Disabled
          </span>
        </a>
      </li>
      <li
        class="bx--overflow-menu-options__option bx--overflow-menu-options__option--danger">
        <a href="https://www.ibm.com" class="bx--overflow-menu-options__btn" role="menuitem"  >
          <span class="bx--overflow-menu-options__option-content">
            Danger option
          </span>
        </a>
      </li>
    </ul>
    <span tabindex="0"></span>
  </div>
</div>

Overflow menu up

Code:
<!--
  Copyright IBM Corp. 2016, 2018

  This source code is licensed under the Apache-2.0 license found in the
  LICENSE file in the root directory of this source tree.
-->
<div data-overflow-menu class="bx--overflow-menu">
  <button
    class="bx--overflow-menu__trigger bx--tooltip__trigger bx--tooltip--a11y bx--tooltip--right bx--tooltip--align-start"
    aria-haspopup="true" aria-expanded="false" id="example-xuad5aeojs-trigger" aria-controls="example-xuad5aeojs">
    <span class="bx--assistive-text">Overflow</span>
    <svg focusable="false" preserveAspectRatio="xMidYMid meet" style="will-change: transform;" xmlns="http://www.w3.org/2000/svg" class="bx--overflow-menu__icon" width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="3" r="1"></circle><circle cx="8" cy="8" r="1"></circle><circle cx="8" cy="13" r="1"></circle></svg>
  </button>
  <div class="bx--overflow-menu-options" tabindex="-1" role="menu"
    aria-labelledby="example-xuad5aeojs-trigger" data-floating-menu-direction="top"
    id="example-xuad5aeojs">
    <ul  class="bx--overflow-menu-options__content">
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"  title="An example option that is really long to show what should be done to handle long text"
            data-floating-menu-primary-focus  >
          <span class="bx--overflow-menu-options__option-content">
            An example option that is really long to show what should be done to handle long text
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Option 2
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Option 3
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Option 4
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  bx--overflow-menu-options__option--disabled  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"    disabled >
          <span class="bx--overflow-menu-options__option-content">
            Disabled
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option   bx--overflow-menu-options__option--danger ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Danger option
          </span>
        </button>
      </li>
    </ul>
    <!-- Note: focusable span allows for focus wrap feature within Overflow Menus -->
    <span tabindex="0"></span>
  </div>
</div>

<div data-overflow-menu class="bx--overflow-menu">
  <button
    class="bx--overflow-menu__trigger bx--tooltip__trigger bx--tooltip--a11y bx--tooltip--left bx--tooltip--align-start"
    aria-haspopup="true" aria-expanded="false" id="example-l4bpfdxpgwn-trigger" aria-controls="example-l4bpfdxpgwn">
    <span class="bx--assistive-text">Overflow</span>
    <svg focusable="false" preserveAspectRatio="xMidYMid meet" style="will-change: transform;" xmlns="http://www.w3.org/2000/svg" class="bx--overflow-menu__icon" width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="3" r="1"></circle><circle cx="8" cy="8" r="1"></circle><circle cx="8" cy="13" r="1"></circle></svg>
  </button>
  <div class="bx--overflow-menu-options bx--overflow-menu--flip" tabindex="-1"
    data-floating-menu-direction="top" role="menu" aria-labelledby="example-l4bpfdxpgwn-trigger"
    id="example-l4bpfdxpgwn">
    <ul  class="bx--overflow-menu-options__content">
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"  title="An example option that is really long to show what should be done to handle long text"
            data-floating-menu-primary-focus  >
          <span class="bx--overflow-menu-options__option-content">
            An example option that is really long to show what should be done to handle long text
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Option 2
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Option 3
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Option 4
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option  bx--overflow-menu-options__option--disabled  ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"    disabled >
          <span class="bx--overflow-menu-options__option-content">
            Disabled
          </span>
        </button>
      </li>
      <li
        class="bx--overflow-menu-options__option   bx--overflow-menu-options__option--danger ">
        <button class="bx--overflow-menu-options__btn" role="menuitem"   >
          <span class="bx--overflow-menu-options__option-content">
            Danger option
          </span>
        </button>
      </li>
    </ul>
    <span tabindex="0"></span>
  </div>
</div>

<div data-overflow-menu class="bx--overflow-menu">
  <button
    class="bx--overflow-menu__trigger bx--tooltip__trigger bx--tooltip--a11y bx--tooltip--left bx--tooltip--align-start"
    aria-haspopup="true" aria-expanded="false" id="example-84hcfck7wg-trigger" aria-controls="example-84hcfck7wg">
    <span class="bx--assistive-text">Overflow</span>
    <svg focusable="false" preserveAspectRatio="xMidYMid meet" style="will-change: transform;" xmlns="http://www.w3.org/2000/svg" class="bx--overflow-menu__icon" width="16" height="16" viewBox="0 0 16 16" aria-hidden="true"><circle cx="8" cy="3" r="1"></circle><circle cx="8" cy="8" r="1"></circle><circle cx="8" cy="13" r="1"></circle></svg>
  </button>
  <div class="bx--overflow-menu-options bx--overflow-menu--flip" tabindex="-1"
    data-floating-menu-direction="top" role="menu" aria-labelledby="example-84hcfck7wg-trigger"
    id="example-84hcfck7wg">
    <ul  class="bx--overflow-menu-options__content">
      <li
        class="bx--overflow-menu-options__option">
        <a href="https://www.ibm.com" class="bx--overflow-menu-options__btn" role="menuitem" 
          title="An example option that is really long to show what should be done to handle long text"   data-floating-menu-primary-focus>
          <span class="bx--overflow-menu-options__option-content">
            An example option that is really long to show what should be done to handle long text
          </span>
        </a>
      </li>
      <li
        class="bx--overflow-menu-options__option">
        <a href="https://www.ibm.com" class="bx--overflow-menu-options__btn" role="menuitem"  >
          <span class="bx--overflow-menu-options__option-content">
            Option 2
          </span>
        </a>
      </li>
      <li
        class="bx--overflow-menu-options__option">
        <a href="https://www.ibm.com" class="bx--overflow-menu-options__btn" role="menuitem"  >
          <span class="bx--overflow-menu-options__option-content">
            Option 3
          </span>
        </a>
      </li>
      <li
        class="bx--overflow-menu-options__option">
        <a href="https://www.ibm.com" class="bx--overflow-menu-options__btn" role="menuitem"  >
          <span class="bx--overflow-menu-options__option-content">
            Option 4
          </span>
        </a>
      </li>
      <li
        class="bx--overflow-menu-options__option bx--overflow-menu-options__option--disabled">
        <a href="https://www.ibm.com" class="bx--overflow-menu-options__btn" role="menuitem"  
          tabindex="-1" aria-disabled="true" >
          <span class="bx--overflow-menu-options__option-content">
            Disabled
          </span>
        </a>
      </li>
      <li
        class="bx--overflow-menu-options__option bx--overflow-menu-options__option--danger">
        <a href="https://www.ibm.com" class="bx--overflow-menu-options__btn" role="menuitem"  >
          <span class="bx--overflow-menu-options__option-content">
            Danger option
          </span>
        </a>
      </li>
    </ul>
    <span tabindex="0"></span>
  </div>
</div>

Documentation

SCSS

Modifiers

Use these modifiers with .bx--overflow-menu-options class.

Selector Description
.bx--overflow-menu--flip Reverse the direction of the overflow menu.
.bx--overflow-menu-options--open Displays the overflow menu options.

JavaScript

Getting component class reference

ES2015
import { OverflowMenu } from 'carbon-components';
With pre-build bundle (carbon-components.min.js)
var OverflowMenu = CarbonComponents.OverflowMenu;

Instantiating

// `#my-overflow-menu` is an element with `[data-overflow-menu]` attribute
OverflowMenu.create(document.getElementById('my-overflow-menu'));

Public Methods

Name Params Description
shouldStateBeChanged state: String Return true if the given state is different from the current state
release Deletes the instance and removes document event listeners

Options

Option Default Selector Description
selectorInit [data-overflow-menu] The CSS selector to find menu
selectorPlacementScope body The CSS selector to find the element you wish the append the menu contents to
selectorOptionMenu .bx--overflow-menu-options The CSS selector to find the contents of the menu
objMenuOffset { top: 3, left: 61 } An object containing the top and left offset values in px
objMenuOffsetFlip { top: 3, left: -61 } An object containing the top and left offset values in px for the "flipped" state
Example - Changing menu position by 8 pixels vertically
// `#my-overflow-menu` is an element with `[data-overflow-menu]` attribute
OverflowMenu.create(document.getElementById('my-overflow-menu'), {
  objMenuOffset(menuBody, direction) {
    const { objMenuOffset: offset } = OverflowMenu.options;
    const { top, left } =
      typeof offset !== 'function' ? offset : offset(menuBody, direction);
    return {
      top: top + 8,
      left,
    };
  },
});

Events

Event Name Description
'floating-menu-beingshown' The custom event fired before the menu gets open.
'floating-menu-shown' The custom event fired after the menu gets open.
'floating-menu-beinghidden' The custom event fired before the menu gets closed.
'floating-menu-hidden' The custom event fired after the menu gets closed.
Example - Preventing menu from being closed in a certain condition
document.addEventListener('floating-menu-beinghidden', function(evt) {
  if (myApplication.shouldMenuKeptOpen(evt.target)) {
    evt.preventDefault();
  }
});
Example - Notifying events of all overflow menus being closed to an analytics library
document.addEventListener('floating-menu-hidden', function(evt) {
  myAnalyticsLibrary.send({
    action: 'Overflow menu closed',
    id: evt.target.id,
  });
});

HTML

By default, the menu body (ul.bx--overflow-menu-options) goes right under <body>. To ensure the proper accessibility experience, add data-floating-menu-container to one of the DOM ancestors of the root element (div[data-overflow-menu]). For example, if you have HTML structure like below, the menu body will go under the second <div>:

<body>
  <div>
    <div data-floating-menu-container>
      <div>
        <div data-overflow-menu class="bx--overflow-menu" ...>
          ...
          <ul class="bx--overflow-menu-options" ...>
            ...
          </ul>
        </div>
      </div>
    </div>
  </div>
</body>