我的目标是制作一个固定的侧边栏但仅限于某个div。你可能知道,CSS中的position: Sticky
属性在position:relative
和postition:fixed
之间切换。这个问题(据我所知)是, position:relative
不能用于使元素 float 在其他元素上,因此它会在网站中留下空白空间。
我的代码:
HTML:
<!--Top text-->
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis eget </p>
<div class="container">
<!--Sidebar-->
<div id="mySidenav" class="sidenav">
<a href="javascript:void(0)" onclick="closeNav()" class="close" id="closefilter"></a>
<div id="filterheader">Filter</div>
<div id="filtercontent">
<div id="subfilterheader">Platforms</div>
<ul style="list-style: none;" id="filterlist">
<li>
<div class="checkbox">
<label><input id="filtersteam" type="checkbox" onchange="changeFilter('steam')" />Steam</label>
</div>
</li>
<li>
<div class="checkbox">
<label><input id="filterepic" type="checkbox" onchange="changeFilter('epic')" />Epic</label>
</div>
</li>
<li>
<div class="checkbox">
<label><input id="filterorigin" type="checkbox" rel="origin" onchange="changeFilter('origin')" />Origin</label>
</div>
</li>
<li>
<div class="checkbox">
<label><input id="filtergog" type="checkbox" rel="gog" onchange="changeFilter('gog')" />GOG</label>
</div>
</li>
</ul>
</div>
</div>
<!--Middle text-->
<span style="font-size:30px;cursor:pointer" onclick="openNav()">☰ open</span>
<div class="main-content">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis eget </p>
</div>
</div>
<!--Bottom text-->
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis eget </p>
CSS:
.container{
position: relative;
}
.sidenav {
height: 100vh;
width: 0;
z-index: 1000;
width: 250px;
position: sticky;
top: 0;
left: 0;
background-color: #111;
overflow-x: hidden;
transition: 0.5s;
}
.sidenav a {
padding: 8px 8px 8px 32px;
text-decoration: none;
font-size: 25px;
color: #818181;
display: block;
transition: 0.3s;
}
.sidenav a:hover {
color: #f1f1f1;
}
.sidenav #filterheader {
top: 0;
right: 25px;
font-size: 36px;
margin-left: 30px;
margin-top: 32px;
text-align: left;
color: white;
}
#subfilterheader{
color: white;
font-size: 21px;
margin-top: 30px;
margin-left: 40px;
}
#filterlist{
margin-left: 15px;
color: white;
}
.close {
position: absolute;
right: 0px;
width: 32px;
height: 32px;
opacity: 0.3;
}
.close:hover {
opacity: 1;
}
.close:before, .close:after {
position: absolute;
left: 15px;
content: ' ';
height: 33px;
width: 2px;
background-color: #ffffff;
}
.close:before {
transform: rotate(45deg);
}
.close:after {
transform: rotate(-45deg);
}
@media screen and (max-height: 450px) {
.sidenav a {font-size: 18px;}
}
JS:(侧边栏的打开和关闭)
function openNav() {
document.getElementById("mySidenav").style.width = "250px";
}
function closeNav() {
document.getElementById("mySidenav").style.width = "0";
}
JS fiddle :https://jsfiddle.net/ru2q7ydj/
正如您在这里所看到的,侧边栏正在按其应有的方式工作 - 它是固定的,同时仅限于 div container
。然而,由于侧边栏的 relative
属性,页面中存在空白区域。如果我们将粘性属性更改为绝对 - https://jsfiddle.net/ru2q7ydj/1/空间消失了(当然粘性功能也消失了)
有没有办法在保留这些功能的同时摆脱该空间?
最佳答案
这是一个解决方案,我在容器上添加了 display: grid
并将打开按钮移到了 div.main-content 内。
function openNav() {
document.getElementById("mySidenav").style.width = "250px";
}
function closeNav() {
document.getElementById("mySidenav").style.width = "0";
}
.container {
position: relative;
/* new lines */
display: grid;
grid-template-columns: 0 1fr;
}
.sidenav {
height: 100vh;
width: 0;
z-index: 1000;
margin-right: 0;
position: sticky;
top: 0;
left: 0;
background-color: #111;
overflow-x: hidden;
transition: 0.5s;
}
.sidenav a {
padding: 8px 8px 8px 32px;
text-decoration: none;
font-size: 25px;
color: #818181;
display: block;
transition: 0.3s;
}
.sidenav a:hover {
color: #f1f1f1;
}
.sidenav #filterheader {
top: 0;
right: 25px;
font-size: 36px;
margin-left: 30px;
margin-top: 32px;
text-align: left;
color: white;
}
#subfilterheader {
color: white;
font-size: 21px;
margin-top: 30px;
margin-left: 40px;
}
#filterlist {
margin-left: 15px;
color: white;
}
.close {
position: absolute;
right: 0px;
width: 32px;
height: 32px;
opacity: 0.3;
}
.close:hover {
opacity: 1;
}
.close:before,
.close:after {
position: absolute;
left: 15px;
content: ' ';
height: 33px;
width: 2px;
background-color: #ffffff;
}
.close:before {
transform: rotate(45deg);
}
.close:after {
transform: rotate(-45deg);
}
@media screen and (max-height: 450px) {
.sidenav a {
font-size: 18px;
}
}
<!--Top text-->
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis eget </p>
<div class="container">
<!--Sidebar-->
<div id="mySidenav" class="sidenav">
<a href="javascript:void(0)" onclick="closeNav()" class="close" id="closefilter"></a>
<div id="filterheader">Filter</div>
<div id="filtercontent">
<div id="subfilterheader">Platforms</div>
<ul style="list-style: none;" id="filterlist">
<li>
<div class="checkbox">
<label><input id="filtersteam" type="checkbox" onchange="changeFilter('steam')" />Steam</label>
</div>
</li>
<li>
<div class="checkbox">
<label><input id="filterepic" type="checkbox" onchange="changeFilter('epic')" />Epic</label>
</div>
</li>
<li>
<div class="checkbox">
<label><input id="filterorigin" type="checkbox" rel="origin" onchange="changeFilter('origin')" />Origin</label>
</div>
</li>
<li>
<div class="checkbox">
<label><input id="filtergog" type="checkbox" rel="gog" onchange="changeFilter('gog')" />GOG</label>
</div>
</li>
</ul>
</div>
</div>
<!--Middle text-->
<!-- <span style="font-size:30px;cursor:pointer" onclick="openNav()">☰ open</span> -->
<div class="main-content">
<!-- new line --> <p>
<!-- new line --> <span style="font-size:30px; cursor:pointer;" onclick="openNav()">☰ open</span>
<!-- new line --> </p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetdipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis eget </p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetdipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis egetLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis eget </p>
</div>
</div>
<!--Bottom text-->
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed adipiscing diam donec adipiscing tristique risus. Nullam eget felis eget </p>
关于javascript - 位置粘性不占用空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61442138/