開發與維運

js實現仿桌面右鍵,出現右鍵菜單功能

最終樣式如下:

image.png

功能需求:和電腦桌面一樣,灰色的是自定義桌面區域(或全屏,或固定大小範圍,本次為固定大小舉例),綠色的為右鍵菜單,當點擊右鍵時,需顯示菜單,左鍵單點消失。
**
實現思路:**

0、首先禁用瀏覽器自帶默認右鍵行為。
1、兩個盒子,一個桌面區域div,一個右鍵菜單div。
2、菜單默認隱藏,在桌面div中點擊右鍵,顯示菜單。
3、拿到右鍵點擊的left和top值,並將彈窗定位到這個位置。
4、最後檢查點擊位置,控制菜單顯示區域,防止菜單超出桌面。

你需要知道的js方法:

1、右鍵事件:oncontextmenu
2、禁用瀏覽器默認行為 e.preventDefault()
3、獲取div左上角座標 div.offsetLeft 和 div.offsetTop
4、獲取div實際寬高 div.getBoundingClientRect().width 和 div.getBoundingClientRect().height
5、Dom基本操作

開始:

現將樣式寫出來:

HTML代碼:

<div id="box">
    <div id="menu">右鍵菜單</div>
</div>
CSS代碼:

 <style>

    #box {
      width: 1000px;
      height: 600px;
      background: #Ccc;
      margin: 0 auto;
      margin-top: 100px
    }

    #menu {
      position: absolute;
      min-width: 100px;
      height: 200px;
      background: #9f9;
      display: none;
    }
    
  </style>

實現js邏輯:


    var box = document.getElementById('box'); // 桌面區域
    var menu = document.getElementById('menu') // 右鍵菜單
    let b_w = box.getBoundingClientRect().width; // 桌面區域寬度
    let b_h = box.getBoundingClientRect().height; // 桌面區域高度
    let b_cX = box.offsetLeft; // box左上角left
    let b_cY = box.offsetTop; //  box左上角top
    
    box.oncontextmenu = function (e) { // 右鍵事件
      menu.style.display = "block"; // 菜單顯示
      menu.style.top = e.clientY + 'px' // 根據點擊位置定位菜單位置top
      menu.style.left = e.clientX + 'px'  // 根據點擊位置定位菜單位置left
      let m_w = menu.getBoundingClientRect().width; // 菜單寬度
      let m_h = menu.getBoundingClientRect().height; // 菜單高度

      // 控制菜單彈出區域,不能超過桌面右側和下側最大範圍
      if (e.clientX > (b_cX + b_w - m_w)) {
        menu.style.left = (e.clientX - m_w) + 'px'  // 如果菜單超出桌面寬度,讓菜單向左偏移本身寬度
      }
      if (e.clientY > (b_cY + b_h - m_h)) {
        menu.style.top = (b_cY + b_h - m_h - 5) + 'px'  //  如果菜單超出桌面高度,讓菜單定位到這個位置,為了美觀,菜單欄與底部桌面留有5px間距
      }
    }


    // window區域點擊菜單欄均消失
    window.onclick = function (e) {
      menu.style.display = "none";
    }
    
    // 禁用window區域右鍵默認菜單彈窗
    window.oncontextmenu = function (e) {
      e.preventDefault();
    }

-
-
-

以上就是博主實現的右鍵菜單實現方式,如果有更好的方式,歡迎溝通。
wechat:villinWeChat

Leave a Reply

Your email address will not be published. Required fields are marked *