← 動的パーツギャラリーへ戻る

パーツ番号 03-02-03 ・ JavaScript使用

右クリック風コンテキストメニュー

領域内をクリックすると、その位置にメニューがポップアップ表示。外側クリックで閉じます。WordPressの一覧テーブルやブロック操作の右クリックメニューに応用可能。

clickjsoverlay

プレビュー

ソースコード

HTML

<div class="d03-02-03-area">右クリック領域内をクリック<br><small>お好きな位置をクリックしてください</small></div>
        <ul class="d03-02-03-menu">
          <li data-a="copy">コピー</li>
          <li data-a="edit">編集</li>
          <li data-a="dup">複製</li>
          <li class="sep"></li>
          <li data-a="del" class="danger">削除</li>
        </ul>

CSS

.d03-02-03-area{position:absolute;inset:24px;border:2px dashed #cbd5e1;border-radius:12px;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#64748b;font-size:14px;text-align:center;line-height:1.7;user-select:none;background:#f8fafc}
        .d03-02-03-area small{color:#94a3b8;font-size:12px}
        .d03-02-03-menu{position:absolute;list-style:none;margin:0;padding:6px;min-width:150px;background:#fff;border:1px solid #e5e7eb;border-radius:10px;box-shadow:0 14px 32px rgba(30,41,59,.18);opacity:0;visibility:hidden;transform:scale(.94);transform-origin:top left;transition:opacity .14s,transform .14s;z-index:9}
        .d03-02-03-menu.open{opacity:1;visibility:visible;transform:scale(1)}
        .d03-02-03-menu li{padding:8px 12px;border-radius:7px;font-size:13.5px;color:#374151;cursor:pointer;transition:background .15s}
        .d03-02-03-menu li:hover{background:#eef2ff}
        .d03-02-03-menu li.danger{color:#dc2626}
        .d03-02-03-menu li.danger:hover{background:#fee2e2}
        .d03-02-03-menu li.sep{height:1px;padding:0;margin:4px 6px;background:#eef2f7;cursor:default}

JavaScript

(function(){
        var root=document.getElementById('item-03-02-03');
        var area=root.querySelector('.d03-02-03-area');
        var menu=root.querySelector('.d03-02-03-menu');
        var prev=root.querySelector('.d03-02-03');
        area.addEventListener('click',function(e){
          e.stopPropagation();
          var r=prev.getBoundingClientRect();
          var x=e.clientX-r.left,y=e.clientY-r.top;
          menu.style.left=Math.min(x,r.width-160)+'px';
          menu.style.top=Math.min(y,r.height-160)+'px';
          menu.classList.add('open');
        });
        area.addEventListener('contextmenu',function(e){e.preventDefault();area.click(e);});
        document.addEventListener('click',function(){menu.classList.remove('open');});
        menu.addEventListener('click',function(e){e.stopPropagation();if(e.target.dataset.a){menu.classList.remove('open');}});
      })();

クラス名 .d03-02-03 は本ライブラリ内での識別用です。複数のパーツを同じページで使う場合は、重複しないよう名前を変更してください。