如何使弹出窗口溢出:溢出内部可见:自动上下文
how to make a popover overflow: visible inside overflow: auto context
我有一个 div 的列表(如果超出父框,overflow-x 应该滚动),悬停时,我想看到一个弹出窗口。
我的问题是,如果我将鼠标悬停在任何子项 div 上,弹出窗口会被考虑用于溢出计算,但我只想让它在所有内容之上可见,而不是让它扩展滚动区域它也没有隐藏在父级的右边框上。我能以某种方式将它从 parent/child 上下文中分离出来吗?
.parent {overflow-x: visible}
不是一个选项,因为我想保持父级大小并让子级可滚动。
div {
border-style: solid;
margin: 10px;
}
.parent {
overflow-x: auto;
white-space : nowrap;
width: 200px;
height: 150px;
background-color: grey;
}
.child {
position: relative;
display: inline-block;
width: 70px;
height: 100px;
background-color: lightblue;
}
.popover {
display: none;
position: absolute;
left: 30px;
z-index:9999;
width: 80px;
height: 50px;
background-color: lightgreen;
}
.child:hover .popover {
display: block;
}
<div class="parent">
<div class="child">
<div class="popover">
</div>
</div
><div class="child">
<div class="popover">
</div>
</div
><div class="child">
<div class="popover">
</div>
</div>
</div>
恕我直言,只要您的弹出窗口位于 div 中且带有“溢出:自动”、“溢出:滚动”或“溢出:隐藏”。但是请有人纠正我。
根据我的示例,我建议为此使用最少的 JS (jQuery)。它也可以使用 vanilla JS 来完成,但恕我直言,这不值得付出努力。
基本上 JS 做了三件事,(1) 附加到 mouseenter 和 mouseleave 事件,(2) 在捕获和冒泡阶段停止事件的进一步传播,以及 (3) 设置弹出窗口的位置。
这还有一个额外的好处,就是能够控制弹出窗口的其他各个方面。
为了完整起见,我也创建了一个普通的 JS 版本,尽管我不会那样做。
https://jsfiddle.net/rq1xc548/
$(".child").on( {
mouseenter: function(event) {
event.stopPropagation();
let position = $(this).offset();
$(this).find(".popover").css("top", position.top);
$(this).find(".popover").css("left", position.left-10);
$(this).find(".popover").css("display", "block");
},
mouseleave: function(event) {
event.stopPropagation();
$(this).find(".popover").css("display", "none");
}
});
div {
border-style: solid;
margin: 10px;
}
.parent {
overflow-x: auto;
white-space : nowrap;
width: 200px;
height: 150px;
background-color: grey;
}
.child {
position: relative;
display: inline-block;
width: 70px;
height: 100px;
background-color: lightblue;
}
.popover {
display: none;
position: fixed;
z-index:9999;
width: 80px;
height: 50px;
background-color: lightgreen;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="parent">
<div class="child">
<div class="popover">
</div>
</div
><div class="child">
<div class="popover">
</div>
</div
><div class="child">
<div class="popover">
</div>
</div>
</div>
我有一个 div 的列表(如果超出父框,overflow-x 应该滚动),悬停时,我想看到一个弹出窗口。
我的问题是,如果我将鼠标悬停在任何子项 div 上,弹出窗口会被考虑用于溢出计算,但我只想让它在所有内容之上可见,而不是让它扩展滚动区域它也没有隐藏在父级的右边框上。我能以某种方式将它从 parent/child 上下文中分离出来吗?
.parent {overflow-x: visible}
不是一个选项,因为我想保持父级大小并让子级可滚动。
div {
border-style: solid;
margin: 10px;
}
.parent {
overflow-x: auto;
white-space : nowrap;
width: 200px;
height: 150px;
background-color: grey;
}
.child {
position: relative;
display: inline-block;
width: 70px;
height: 100px;
background-color: lightblue;
}
.popover {
display: none;
position: absolute;
left: 30px;
z-index:9999;
width: 80px;
height: 50px;
background-color: lightgreen;
}
.child:hover .popover {
display: block;
}
<div class="parent">
<div class="child">
<div class="popover">
</div>
</div
><div class="child">
<div class="popover">
</div>
</div
><div class="child">
<div class="popover">
</div>
</div>
</div>
恕我直言,只要您的弹出窗口位于 div 中且带有“溢出:自动”、“溢出:滚动”或“溢出:隐藏”。但是请有人纠正我。
根据我的示例,我建议为此使用最少的 JS (jQuery)。它也可以使用 vanilla JS 来完成,但恕我直言,这不值得付出努力。 基本上 JS 做了三件事,(1) 附加到 mouseenter 和 mouseleave 事件,(2) 在捕获和冒泡阶段停止事件的进一步传播,以及 (3) 设置弹出窗口的位置。
这还有一个额外的好处,就是能够控制弹出窗口的其他各个方面。
为了完整起见,我也创建了一个普通的 JS 版本,尽管我不会那样做。
https://jsfiddle.net/rq1xc548/
$(".child").on( {
mouseenter: function(event) {
event.stopPropagation();
let position = $(this).offset();
$(this).find(".popover").css("top", position.top);
$(this).find(".popover").css("left", position.left-10);
$(this).find(".popover").css("display", "block");
},
mouseleave: function(event) {
event.stopPropagation();
$(this).find(".popover").css("display", "none");
}
});
div {
border-style: solid;
margin: 10px;
}
.parent {
overflow-x: auto;
white-space : nowrap;
width: 200px;
height: 150px;
background-color: grey;
}
.child {
position: relative;
display: inline-block;
width: 70px;
height: 100px;
background-color: lightblue;
}
.popover {
display: none;
position: fixed;
z-index:9999;
width: 80px;
height: 50px;
background-color: lightgreen;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="parent">
<div class="child">
<div class="popover">
</div>
</div
><div class="child">
<div class="popover">
</div>
</div
><div class="child">
<div class="popover">
</div>
</div>
</div>