在具有 overflow:hidden DIV 的父列表前面显示子列表
Show A Sub-List In Front Of Parent List That Have overflow:hidden DIV
我正在创建一个侧边菜单,其中包含悬停时可见的子列表。为此,我有以下代码。
#sidebar {
width: 160px; position: relative;
}
.parent {
width: 160px;
height: 400px;
position: relative;
overflow-y: scroll;
overflow-x: hidden;
}
.child {
height: 0px;
overflow:hidden;
position: absolute;
left: 120px;
}
.sub_menu:hover .child {
height: 100px;
width: 300px;
background: #DDD;
}
.sub_menu {
position: relative;
}
<div id="sidebar">
<ul class="parent">
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li class="sub_menu">YYYYYYYYYYY
<ul class="child">
<li>Need To Show This In Full Width</li>
<li>XXXXXXXXXX</li>
<li>XXXXXXXXXX</li>
<li>XXXXXXXXXX</li>
</ul>
</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
</ul>
</div>
问题是我的子列表隐藏在父列表 DIV 后面,因为我需要 overflow-y: scroll; overflow-x: hidden;
,还因为我正在制作一个固定高度的菜单,所以如果包含更多项目,它将显示仅在 y 轴上滚动条。
那么这在我上面的代码中可能吗?
您可以将 position: relative
设置为最外部的 <div>
(#sidebar
) 并使用 JavaScript.
定位子菜单
document.querySelectorAll("li.sub_menu").forEach(function(item) {
item.addEventListener("mouseover", function() {
submenuWrapper = item.querySelector(".child"),
menuItemPosTop = (item.offsetTop - document.querySelector("#sidebar > ul").scrollTop) + 20 + "px",
menuItemPosLeft = Math.round(item.offsetWidth * 0.75) + "px"
submenuWrapper.style.cssText = "top:" + menuItemPosTop + "; left:" + menuItemPosLeft;
})
})
#sidebar {
position: relative;
}
ul {
width: 160px;
max-height: 400px;
overflow-x: hidden;
overflow-y: auto;
list-style: none;
}
li {
position: static;
}
li .child {
position: absolute;
z-index: 10;
display: none;
}
li:hover > .child {
display: block;
}
ul {
margin: 1em;
color: white;
font-family: sans-serif;
font-size: 16px;
}
li {
padding: 1em;
}
li ul {
margin: 0;
}
li .child {
cursor: auto;
}
li .child li {
padding: 12px 20px;
}
li:nth-child(2n) {
background: #949494;
}
li:nth-child(2n+1) {
background: #bbbbbb;
}
li.sub_menu {
background: #505050;
cursor: pointer;
}
<div id="sidebar">
<ul>
<li>XXX XXX XXX XXX</li>
<li>XXX XXX XXX</li>
<li>XXX XXX</li>
<li>XXX</li>
<li class="sub_menu">YYYYYYYYYYY
<div class="child">
<ul>
<li>XXX XXX XXX</li>
<li>XXX XXX</li>
<li>XXX</li>
</ul>
</div>
</li>
<li>XXX XXX XXX XXX</li>
<li>XXX XXX XXX</li>
<li>XXX XXX</li>
<li>XXX</li>
<li>XXX XXX XXX XXX</li>
<li>XXX XXX XXX</li>
<li>XXX XXX</li>
<li>XXX</li>
</ul>
</div>
对于top位置,需要获取item的位置,减去当前滚动位置。然后您可以根据需要添加偏移量(在本例中为 20px)。
对于 left 位置,您可以获得宽度并可以使用百分比来确定它的显示位置(例如在这种情况下从左侧开始的 75%)。
参考:CSS-tricks.
我正在创建一个侧边菜单,其中包含悬停时可见的子列表。为此,我有以下代码。
#sidebar {
width: 160px; position: relative;
}
.parent {
width: 160px;
height: 400px;
position: relative;
overflow-y: scroll;
overflow-x: hidden;
}
.child {
height: 0px;
overflow:hidden;
position: absolute;
left: 120px;
}
.sub_menu:hover .child {
height: 100px;
width: 300px;
background: #DDD;
}
.sub_menu {
position: relative;
}
<div id="sidebar">
<ul class="parent">
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li class="sub_menu">YYYYYYYYYYY
<ul class="child">
<li>Need To Show This In Full Width</li>
<li>XXXXXXXXXX</li>
<li>XXXXXXXXXX</li>
<li>XXXXXXXXXX</li>
</ul>
</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
<li>XXXXXXXXXXXX</li>
</ul>
</div>
问题是我的子列表隐藏在父列表 DIV 后面,因为我需要 overflow-y: scroll; overflow-x: hidden;
,还因为我正在制作一个固定高度的菜单,所以如果包含更多项目,它将显示仅在 y 轴上滚动条。
那么这在我上面的代码中可能吗?
您可以将 position: relative
设置为最外部的 <div>
(#sidebar
) 并使用 JavaScript.
document.querySelectorAll("li.sub_menu").forEach(function(item) {
item.addEventListener("mouseover", function() {
submenuWrapper = item.querySelector(".child"),
menuItemPosTop = (item.offsetTop - document.querySelector("#sidebar > ul").scrollTop) + 20 + "px",
menuItemPosLeft = Math.round(item.offsetWidth * 0.75) + "px"
submenuWrapper.style.cssText = "top:" + menuItemPosTop + "; left:" + menuItemPosLeft;
})
})
#sidebar {
position: relative;
}
ul {
width: 160px;
max-height: 400px;
overflow-x: hidden;
overflow-y: auto;
list-style: none;
}
li {
position: static;
}
li .child {
position: absolute;
z-index: 10;
display: none;
}
li:hover > .child {
display: block;
}
ul {
margin: 1em;
color: white;
font-family: sans-serif;
font-size: 16px;
}
li {
padding: 1em;
}
li ul {
margin: 0;
}
li .child {
cursor: auto;
}
li .child li {
padding: 12px 20px;
}
li:nth-child(2n) {
background: #949494;
}
li:nth-child(2n+1) {
background: #bbbbbb;
}
li.sub_menu {
background: #505050;
cursor: pointer;
}
<div id="sidebar">
<ul>
<li>XXX XXX XXX XXX</li>
<li>XXX XXX XXX</li>
<li>XXX XXX</li>
<li>XXX</li>
<li class="sub_menu">YYYYYYYYYYY
<div class="child">
<ul>
<li>XXX XXX XXX</li>
<li>XXX XXX</li>
<li>XXX</li>
</ul>
</div>
</li>
<li>XXX XXX XXX XXX</li>
<li>XXX XXX XXX</li>
<li>XXX XXX</li>
<li>XXX</li>
<li>XXX XXX XXX XXX</li>
<li>XXX XXX XXX</li>
<li>XXX XXX</li>
<li>XXX</li>
</ul>
</div>
对于top位置,需要获取item的位置,减去当前滚动位置。然后您可以根据需要添加偏移量(在本例中为 20px)。
对于 left 位置,您可以获得宽度并可以使用百分比来确定它的显示位置(例如在这种情况下从左侧开始的 75%)。
参考:CSS-tricks.