我尝试创建一个网页,顶部有一个固定的导航栏,覆盖下面的内容。当在网址中加载带锚点的页面时,正常的行为是页面将锚点滚动到窗口的顶部。但是那个内容隐藏在导航栏下面。所以我尝试使用JavaScript scrollTo()来解决这个问题。我的解决方案适用于Firefox和Opera,但不适用于Chrome。请试试这个例子。有关如何在Chrome中解决此问题的任何想法?谢谢。
TEST.HTM:
<!DOCTYPE HTML>
<html>
<head>
<title>Test</title>
<meta charset='UTF-8'>
<style type='text/css'>
#navi { position:fixed; left:0; top:0; width:100%; height:100px; background-color:yellow; }
#spacer { background-color:cyan; height:100px; }
#spacer2 { height:1000px; }
.style1 { background-color:green; height:200px; }
</style>
<script type='text/javascript'>
/* <![CDATA[ */
function scrollAnchor() { // doesn't work in Chrome
var y = document.getElementById(window.location.hash.substr(1)).offsetTop - 110;
window.scrollTo(0, y);
//alert(y);
}
/* ]]> */
</script>
</head>
<body id='top' onload='scrollAnchor();'>
<div id='navi'>
<a href='./test2.htm'>Menu</a>
</div>
<div id='main'>
<div id='spacer'></div>
<h3 id='1'>Heading 1</h3><p class='style1'></p>
<h3 id='2'>Heading 2</h3><p class='style1'></p>
<h3 id='3'>Heading 3</h3><p class='style1'></p>
<h3 id='4'>Heading 4</h3><p class='style1'></p>
<h3 id='5'>Heading 5</h3><p class='style1'></p>
<h3 id='6'>Heading 6</h3><p class='style1'></p>
<div id='spacer2'></div>
</div>
</body>
</html>
test2.htm:
<!DOCTYPE HTML>
<html>
<head>
<title>Test</title>
<meta charset='UTF-8'>
</head>
<body>
<a href='test.htm#1'>Heading 1</a>
<a href='test.htm#2'>Heading 2</a>
<a href='test.htm#3'>Heading 3</a>
<a href='test.htm#4'>Heading 4</a>
<a href='test.htm#5'>Heading 5</a>
<a href='test.htm#6'>Heading 6</a>
</body>
</html>
答案 0 :(得分:20)
Chrome速度非常快,以至于您的scrollTo()操作会触发 Chrome的默认滚动到html锚点事件。
使用
给它一点延迟setTimeout(function() {window.scrollTo(0, y);},1)
或者只是避免使用实际元素ID 作为哈希名称
而不是使用
TEST.HTM#6
使用
TEST.HTM#link_6
那么你可以通过做
这样的事来获得真正的身份window.location.hash.split('_')[1]
希望它有所帮助。
答案 1 :(得分:0)
我建议避免使用JavaScript,而是创建专用的锚元素,然后将其至少在标头高度上偏移到标题上方。
在https://stackoverflow.com/a/13184714/5951116中已经对此进行了很好的描述。
您的代码将如下所示:
<div id='navi'>
<a href='./test2.htm'>Menu</a>
</div>
<div id='main'>
<div id='spacer'></div>
<div class='article-wrapper'>
<a class='anchor' id='1'></a>
<h3 id='1'>Heading 1</h3><p class='style1'></p>
</div>
<div class='article-wrapper'>
<a class='anchor' id='2'></a>
<h3 id='2'>Heading 2</h3><p class='style1'></p>
</div>
...
</div>
#navi {
height: 50px;
}
#main a.anchor {
display: block;
position: relative;
top: -50px;
visibility: hidden;
}
或使用CSS变量来消除尽可能紧密的耦合:
:root {
--header-height: 50px;
}
#navi {
height: var(--header-height);
}
#main a.anchor {
display: block;
position: relative;
top: -var(--header-height);
visibility: hidden;
}