Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

97
LINES

< > BotCompany Repo | #1030975 // HTMLPopDownButton - HTML triangle pop-down menu v2

JavaX fragment (include) [tags: use-pretranspiled]

Libraryless. Click here for Pure Java version (5463L/31K).

// entries are HTML (e.g. links)
// requires JQuery for click-outside-to-close trick
// Note: Make sure containing elements have overflow: visible,
// otherwise pop-up can get cut off
sclass HTMLPopDownButton {
  Cl<S> entries = new L;
  int width = 200, height = 200;
  
  S id = "dropdown-" + aGlobalID(), outerID = "outer-" + id;
  
  S onclick = replaceDollarVars([[
    var x = document.getElementById($id);
    x.style.display = window.getComputedStyle(x).display === "none" ? "block" : "none";
    console.log("popup " + id + " display: " + x.style.display);
  ]], $id := jsQuote(id));
  
  *(S... entries) { this.entries = asList(entries); }
  *(Cl<S> *entries) {}
  
  void add(S entry) { main add(this.entries, entry); }
  void addAll(S... entries) { main addAll(this.entries, entries); }
  
  S html() {
    ret hstyle(replaceDollarVars([[
      #$id ul {
        list-style-type: none;
        margin: 0;
        padding: 0;
        width: ]] + width + [[px;
        background-color: #f1f1f1;
      }
      
      #$id {
        position: absolute;
        display:none;
        background-color: #f9f9f9;
        width:auto;
        height: ]] + height + [[px;
        overflow: auto;
       
        min-width: 160px;
        box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
        
        z-index: 99;
      }
      
      #$id li a {
        text-decoration: none;
        color: #000;
      }
  
      #$id li {    
        display: block;
        border-bottom: 1px solid #555;
        padding: 8px 16px;
        color: #000;
      }
    ]]
    /*
      #$id li:hover, #$id li:hover a {
        background-color: #3399ff;
        color: white;
      }
      
      /* exclude sub menus - works but submenu loses hover highlights *//*
      #$id li:hover ul li, #$id li:hover ul li a {
        background-color: #f9f9f9;
        color: #000;
      }
    */
    // version 2 of the trick
    + [[
      #$id li:hover, #$id li:hover > a {
        background-color: #3399ff;
        color: white;
      }
    ]], $id := id))
    + hdiv(
        span(htmlEncode2(unicode_smallDownPointingTriangle()), +onclick)
      + hdiv(ul(entries), +id),
      style := "position: relative; display: inline-block; cursor: context-menu",
      /*+onclick,*/ id := outerID)
      + hscript(replaceDollarVars([[
        if (typeof $ !== 'undefined')
          $('body').click(function(e) {
            //console.log("target=" + e.target + ", outerID=$outerID");
            if (!$(e.target).closest('#$outerID').length) {
              //console.log("hiding $id");
              $("#$id").hide();
            }
          });
      ]], +id, +outerID));
  }
  
  selfType width(int width) { this.width = width; this; }
  selfType height(int height) { this.height = height; this; }
}

Author comment

Began life as a copy of #1030222

download  show line numbers  debug dex  old transpilations   

Travelled to 4 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, vouqrxazstgt

No comments. add comment

Snippet ID: #1030975
Snippet name: HTMLPopDownButton - HTML triangle pop-down menu v2
Eternal ID of this version: #1030975/11
Text MD5: a7c13d33e616dbf68602e314c880c8ea
Transpilation MD5: 403f8483175cc7bda2243eb58e44c2d1
Author: stefan
Category: javax / html
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2021-09-10 04:27:13
Source code size: 2874 bytes / 97 lines
Pitched / IR pitched: No / No
Views / Downloads: 145 / 347
Version history: 10 change(s)
Referenced in: [show references]