问题:
鉴于我所处的是针对移动设备优化的网站
然后我点击图标从固定位置标题打开导航菜单
然后我的滚动位置丢失,页面滚动回到顶部。
我在position: fixed
上使用body
,以防止在菜单打开时网站可滚动。
然而,当菜单打开时,页面会滚动'由于在身体上使用position: fixed
,因此返回到顶部。
这是一个显示问题的GIF(iPhone模拟器Safari)。请注意,我首先向下滚动页面,然后打开菜单,然后我发现我已经滚动到页面顶部:
过去,为了解决这个问题,我在用户打开菜单时保留了页面的滚动位置,并在打开菜单时将其滚动到那里。我认为这是一个没有高效或实用的黑客。
代码:
$('#menu-icon').on('click', () => {
$('nav').toggle()
$('body').toggleClass('overlay-visible')
})

header {
position: fixed;
background-color: white;
padding: 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.overlay-visible {
overflow: hidden;
position: fixed;
}
.container {
padding-top: 80px;
}
#menu-icon {
font-size: 30px;
}
nav {
display: none;
z-index: 10;
position: fixed;
top: 80px;
left: 0;
right: 0;
bottom: 0;
padding-bottom: 48px;
font-size: 15px;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
background-color: rgba(0, 0, 0, 0.5);
}
ul {
background-color: dodgerblue;
}
li {
padding: 20px;
}
img {
width: 100%;
}

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<title>Document</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/marx/2.0.7/marx.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<header>
<div>My page</div>
<div id="menu-icon">≡</div>
</header>
<nav>
<ul>
<li>Home</li>
<li>Settings</li>
<li>Profile</li>
<li>Pictures</li>
<li>Social</li>
</ul>
</nav>
<div class="container">
<img src="http://lorempixel.com/375/200/">
<img src="http://lorempixel.com/375/210/">
<img src="http://lorempixel.com/375/220/">
<img src="http://lorempixel.com/375/230/">
<img src="http://lorempixel.com/375/240/">
</div>
</body>
</html>
&#13;
TL; DR:如何向用户显示固定位置导航,而不会在页面打开时滚动页面,还能保持其滚动位置?
答案 0 :(得分:-1)
$('#menu-icon').on('click', () => {
$('nav').toggle()
/* $('body').toggleClass('overlay-visible') */
})
&#13;
header {
position: fixed;
background-color: white;
padding: 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.overlay-visible {
overflow: hidden;
position: fixed;
}
.container {
padding-top: 80px;
}
#menu-icon {
font-size: 30px;
}
nav {
display: none;
z-index: 10;
position: fixed;
top: 80px;
left: 0;
right: 0;
bottom: 0;
padding-bottom: 48px;
font-size: 15px;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
background-color: rgba(0, 0, 0, 0.5);
}
ul {
background-color: dodgerblue;
}
li {
padding: 20px;
}
img {
width: 100%;
}
&#13;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<title>Document</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/marx/2.0.7/marx.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<header>
<div>My page</div>
<div id="menu-icon">≡</div>
</header>
<nav>
<ul>
<li>Home</li>
<li>Settings</li>
<li>Profile</li>
<li>Pictures</li>
<li>Social</li>
</ul>
</nav>
<div class="container">
<img src="http://lorempixel.com/375/200/">
<img src="http://lorempixel.com/375/210/">
<img src="http://lorempixel.com/375/220/">
<img src="http://lorempixel.com/375/230/">
<img src="http://lorempixel.com/375/240/">
</div>
</body>
</html>
&#13;