Positioning Context Menu

后端 未结 3 1012
孤城傲影
孤城傲影 2021-02-20 02:15

I\'m trying to position a custom context menu with jQuery.
The first time it appears at the right position (mouse coordinates), but then the current position is being summed

相关标签:
3条回答
  • 2021-02-20 02:44

    Try position: fixed; with position of context menu changes based on following condition -

    var windowHeight = $(window).height()/2;
    var windowWidth = $(window).width()/2;
    if(e.clientY > windowHeight && e.clientX <= windowWidth) {
      $("#contextMenuContainer").css("left", e.clientX);
      $("#contextMenuContainer").css("bottom", $(window).height()-e.clientY);
      $("#contextMenuContainer").css("right", "auto");
      $("#contextMenuContainer").css("top", "auto");
    } else if(e.clientY > windowHeight && e.clientX > windowWidth) {
      $("#contextMenuContainer").css("right", $(window).width()-e.clientX);
      $("#contextMenuContainer").css("bottom", $(window).height()-e.clientY);
      $("#contextMenuContainer").css("left", "auto");
      $("#contextMenuContainer").css("top", "auto");
    } else if(e.clientY <= windowHeight && e.clientX <= windowWidth) {
      $("#contextMenuContainer").css("left", e.clientX);
      $("#contextMenuContainer").css("top", e.clientY);
      $("#contextMenuContainer").css("right", "auto");
      $("#contextMenuContainer").css("bottom", "auto");
    } else {
      $("#contextMenuContainer").css("right", $(window).width()-e.clientX);
      $("#contextMenuContainer").css("top", e.clientY);
      $("#contextMenuContainer").css("left", "auto");
      $("#contextMenuContainer").css("bottom", "auto");
    }
    

    http://jsfiddle.net/AkshayBandivadekar/zakn7Lwb/14/

    0 讨论(0)
  • 2021-02-20 02:48

    The problem is that when you right click then left click elsewhere and then right click again, the position is incorrect.

    The root of the problem is that you set the offset before showing the element. It appears that it confuses jQuery if the element is set to display:none and then its offset is changed.

    To fix the problem you need to switch the show and the offset lines in your code:

    $(document).bind("contextmenu", function(e) {
        $("#box").offset({left:e.pageX, top:e.pageY});
        $('#box').show();
        e.preventDefault();
    });
    

    becomes

    $(document).bind("contextmenu", function(e) {
        $('#box').show();
        $("#box").offset({left:e.pageX, top:e.pageY});
        e.preventDefault();
    });
    

    Demo
    and
    Source

    0 讨论(0)
  • 2021-02-20 03:01

    Don't use offset method, try css instead, positioning context menu absolutely:

    $("#box").css({left:e.pageX, top:e.pageY});
    

    CSS:

    #box {
        ...
        position: absolute;
    }
    

    http://jsfiddle.net/smxLk/

    0 讨论(0)
提交回复
热议问题