JSFiddle - React, Tailwind, and code Playground

by joshmoto

HTML

<script src="//code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<link rel="stylesheet" href="//stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="//stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<!-- demo containers to center .btn-group please ignore this -->
<div class="d-flex align-items-center h-100">
  <div class="container">
    <div class="col-12 text-center">
      
      <!-- question related code only -->
      <div class="btn-group">
        <button class="btn btn-primary btn-demo" type="button">
          Long demo button title for testing
        </button>
        <div class="dropdown-menu">
        </div>
      </div>

    </div>
  </div>
</div>

SCSS

HTML,
BODY {
  height: 100%;
  min-height: 100%;
  cursor: crosshair;
  width: 100%;
}

BUTTON {
  cursor: crosshair !important;
}

.btn-group {
  position: relative;
  display: inline-flex;
  vertical-align: middle;
}

.dropdown-menu {
  opacity: 0;
  position: absolute;
  top: 0;
  left: 0;
  display: block;
  float: left;
  min-width: 0;
  margin: 0;
}

JavaScript

// demo button click event
$('.btn-demo').on('click', function(e) {

  // get the next element matching .dropdown-menu
  var $dropdown_menu = $(this).next('.dropdown-menu');

  // your custom button or add these however method you are doing
  var btn_1 = '<button class="dropdown-item" type="button">Button 1</button>';
  var btn_2 = '<button class="dropdown-item" type="button">Button 2</button>';
  var btn_3 = '<button class="dropdown-item" type="button">Button 3</button>';

  // add the desired buttons to the .dropdown-menu on click
  $dropdown_menu.html(btn_1 + btn_2 + btn_3);
  
  // show the dropdown menu so we can get its width height
  // currently hidden using css opacity: 0;
  $dropdown_menu.show();
  
  // dropdown menu width height
  var ddm_w = $dropdown_menu.outerWidth();
  var ddm_h = $dropdown_menu.outerHeight();

  // click position values inside button
  var click_x = (e.pageX - $(this).offset().left);
  var click_y = (e.pageY - $(this).offset().top);
  
  // new translate positions for center menu
  var trans_x = click_x - (ddm_w / 2);
  var trans_y = click_y - (ddm_h / 2);

  // add this css to .dropdown-menu menu on click
  $dropdown_menu.css({
		
    // translate position to top left corner of dropdown
    'transform' : 'translate(' + trans_x + 'px,' + trans_y + 'px)',
    
    // reveal the dropdown menu
    'opacity' : 1
	
  // use .show() function to reveal
  }).show();

});