Javascript 在父DIV外部打开自定义上下文菜单

Javascript 在父DIV外部打开自定义上下文菜单,javascript,html,jquery,css,contextmenu,Javascript,Html,Jquery,Css,Contextmenu,类菜单{ 构造函数(){ this.menu=document.querySelector(“.menu”); this.ellipsis=document.querySelector('.fa.fa-ellipsis-v'); this.callEvent(); } callEvent(){ this.省略号.addEventListener('click',()=>{ $('.menu').toggleClass('show'); }); } } 常量菜单=新菜单() #父div{ 边框:2

类菜单{
构造函数(){
this.menu=document.querySelector(“.menu”);
this.ellipsis=document.querySelector('.fa.fa-ellipsis-v');
this.callEvent();
}
callEvent(){
this.省略号.addEventListener('click',()=>{
$('.menu').toggleClass('show');
});
}
}
常量菜单=新菜单()
#父div{
边框:2倍纯绿;
}
.菜单{
显示:无;
}
.表演{
显示器:flex;
边框:2倍实心;
}

您只需使用
位置:绝对
,将父菜单的位置设置为
位置:相对
。这将从文档流中删除菜单,并允许您使用
顶部
底部
左侧
右侧
css属性相对于父级对其进行定位

我通过添加以下CSS编辑了您的代码片段

#parent-div{
border: 2px solid green;

position: relative;     /* accommodates absolutely positioned children */
}

.show {
  display: flex;
  border: 2px solid;
  
  width: 80px;         /* set menu width */
  height: 60px;        /* set menu height */
  position: absolute;  /* position absolute relative to parent */
  bottom: -90px;       /* position the menu relative to parents bottom edge*/
}
const-button=document.getElementById('toggle-absolute');
按钮。addEventListener('单击',()=>{
const menu=document.getElementById('menu');
menu.classList.toggle('absolute');
});
.container{
背景:海蓝宝石;
位置:相对位置;
高度:50vh;
宽度:50vw;
}
#菜单{
填充:8px;
背景色:番茄;
宽度:80px;
高度:60px;
}
.绝对的{
位置:绝对位置;
最高:50%;
右:10%;
}

我在看菜单

绝对切换
您只需使用
位置:绝对
,将父菜单的位置设置为
位置:相对
。这将从文档流中删除菜单,并允许您使用
顶部
底部
左侧
右侧
css属性相对于父级对其进行定位

我通过添加以下CSS编辑了您的代码片段

#parent-div{
border: 2px solid green;

position: relative;     /* accommodates absolutely positioned children */
}

.show {
  display: flex;
  border: 2px solid;
  
  width: 80px;         /* set menu width */
  height: 60px;        /* set menu height */
  position: absolute;  /* position absolute relative to parent */
  bottom: -90px;       /* position the menu relative to parents bottom edge*/
}
const-button=document.getElementById('toggle-absolute');
按钮。addEventListener('单击',()=>{
const menu=document.getElementById('menu');
menu.classList.toggle('absolute');
});
.container{
背景:海蓝宝石;
位置:相对位置;
高度:50vh;
宽度:50vw;
}
#菜单{
填充:8px;
背景色:番茄;
宽度:80px;
高度:60px;
}
.绝对的{
位置:绝对位置;
最高:50%;
右:10%;
}

我在看菜单

绝对切换
请使用stackoverflow的内置代码片段工具创建代码片段,为人们提供一个工作示例,这将使其他人更容易帮助解决您的问题。您需要使用上下文菜单
position:absolute
,将其从文档流中删除,并且不会影响兄弟姐妹或父成员的大小或位置。@Capagris我添加了一个代码段。您会注意到,当您单击省略号时,会在父div中打开一个排序菜单,我希望该菜单在父div之外打开。您还会注意到,我希望在父div之外打开的上下文菜单有3层深度。@pilchard我在css中的菜单中添加了绝对位置,但现在当我单击省略号时,我再也看不到我的上下文菜单了。我在回答中编辑了您的代码片段。您还需要将父级的位置设置为
position:relative
,然后调整其相对于父级div的位置。请使用stackoverflow的内置代码片段工具创建代码片段,为人们提供一个工作示例,这将使其他人更容易帮助解决您的问题。您需要使用上下文菜单
position:absolute
,将其从文档流中删除,并且不会影响兄弟姐妹或父成员的大小或位置。@Capagris我添加了一个代码段。您会注意到,当您单击省略号时,会在父div中打开一个排序菜单,我希望该菜单在父div之外打开。您还会注意到,我希望在父div之外打开的上下文菜单有3层深度。@pilchard我在css中的菜单中添加了绝对位置,但现在当我单击省略号时,我再也看不到我的上下文菜单了。我在回答中编辑了您的代码片段。您还需要将父级的位置设置为
position:relative
,然后调整它相对于父级div的位置。当我尝试实现您的代码时,上下文菜单仍会在父级div内打开,然后它只会创建滚动条。为什么会这样?可能是我将父样式应用于错误的div吗?这是可能的。位置为
position:absolute
的元素将相对于位置为
position:relative
的最近父元素进行定位。在我的示例中,我将
position:relative
应用于
#parent div
,因此它从该div的点向下逃逸流。如果这样做,我在尝试实现代码时创建了一个房间,上下文菜单仍然在parent div内打开,然后它只创建滚动条。为什么会这样?可能是我将父样式应用于错误的div吗?这是可能的。位置为
position:absolute
的元素将相对于位置为
position:relative
的最近父元素进行定位。在我的示例中,我将
position:relative
应用于
#parent div
,因此它从该div的点向下逃逸流