我有以下结构化代码。我的页面中有粘性标头以及几个部分。我的页面超链接很少。
如您在代码段中所见,在第1部分到第2部分中有一个链接文本。
我从w3school添加了一些jquery以便平滑滚动。
问题
单击超链接时,滚动到第2部分,并将第2部分的起点指向主体顶部。由于我的标头是粘性的,因此它隐藏了第2节的某些内容。
现在我想要的是什么: 滚动到第2部分时,我希望该部分在粘性标题之后开始,而不是在正文顶部开始。
// Add smooth scrolling to all links
$("a").on('click', function(event) {
// Make sure this.hash has a value before overriding default behavior
if (this.hash !== "") {
// Prevent default anchor click behavior
event.preventDefault();
// Store hash
var hash = this.hash;
// Using jQuery's animate() method to add smooth page scroll
// The optional number (800) specifies the number of milliseconds it takes to scroll to the specified area
$('html, body').animate({
scrollTop: $(hash).offset().top
}, 800, function() {
// Add hash (#) to URL when done scrolling (default click behavior)
window.location.hash = hash;
});
} // End if
});
header {
background: red;
width: 100%;
height: 50px;
position: fixed;
top: 0;
left: 0;
right: 0;
}
#sec-1,
#sec-2 {
width: 100%;
height: 100vh;
}
#sec-1 {
margin-top: 50px;
background: green;
}
#sec-2 {
background: blue;
}
#sec-2>p {
background: #fff;
margin: auto;
width: 60%;
height: 100px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<header></header>
<section id="sec-1">
<a href="#sec-2">Scroll to section 2</a>
</section>
<section id="sec-2">
<p>This is section 2</p>
</section>
答案 0 :(得分:4)
您的问题是javascript中的最后一行。
/ Add hash (#) to URL when done scrolling (default click behavior)
window.location.hash = hash;
这实际上迫使您的URL跳到原始哈希位置。您实际上并没有添加#
,而是强迫窗口跳到javascript变量hash
(在本例中为section-2
)中定义的原始窗口。
// Add smooth scrolling to all links
$("a").on('click', function(event) {
// Make sure this.hash has a value before overriding default behavior
if (this.hash !== "") {
// Prevent default anchor click behavior
event.preventDefault();
// Store hash
var hash = this.hash;
// Using jQuery's animate() method to add smooth page scroll
// The optional number (800) specifies the number of milliseconds it takes to scroll to the specified area
$('html, body').animate({
scrollTop: $(hash).offset().top -70
}, 800, function() {
});
} // End if
});
滚动条现在按预期工作。
答案 1 :(得分:1)
您需要从滚动条中删除标题的高度;
$('html, body').animate({
scrollTop: $(hash).offset().top - $('header').height()
}, 800, function() {
// Add hash (#) to URL when done scrolling (default click behavior)
window.location.hash = hash;
});
答案 2 :(得分:1)
首先,您需要从动画块中的scrollTop
偏移量减去标题的高度。
其次,当您使用window.location.hash
时,它会引起实际的麻烦,当触发window.location.hash
时,页面将再次滚动查找超链接(与传统的超链接行为一样)。波纹管代码可以按预期工作,希望可以解决您的问题。
// Add smooth scrolling to all links
$("a").on('click', function(event) {
// Make sure this.hash has a value before overriding default behavior
if (this.hash !== "") {
// Prevent default anchor click behavior
event.preventDefault();
// Store hash
var hash = this.hash;
// Using jQuery's animate() method to add smooth page scroll
// The optional number (800) specifies the number of milliseconds it takes to scroll to the specified area
$('html, body').animate({
scrollTop: parseInt($(hash).offset().top - parseInt($('header').height()))
}, 800, function() {
// Add hash (#) to URL when done scrolling (default click behavior)
// window.location.hash = hash;
});
} // End if
});
header {
background: red;
width: 100%;
height: 50px;
position: fixed;
top: 0;
left: 0;
right: 0;
}
#sec-1,
#sec-2 {
width: 100%;
height: 100vh;
}
#sec-1 {
margin-top: 50px;
background: green;
}
#sec-2 {
background: blue;
}
#sec-2>p {
background: #fff;
margin: auto;
width: 60%;
height: 100px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<header></header>
<section id="sec-1">
<a href="#sec-2">Scroll to section 2</a>
</section>
<section id="sec-2">
<p>This is section 2</p>
</section>