el.scrollIntoViewIfNeeded()滚动得太远了

时间:2016-03-08 16:30:28

标签: javascript html css scroll

el.scrollIntoViewIfNeeded()如果不在可见浏览器区域内,则滚动到el。一般情况下它工作正常但我在使用固定标题时遇到问题。

我做了一个示例代码段:(该方法在Firefox中不起作用,因此演示也没有)https://jsfiddle.net/ahugp8bq/1/

在开始时,所有三个彩色div都显示在固定标题下方。但是如果你点击"第二个"然后"首先",#first的开头将在标题后面,我不想要。

问题似乎是向上滚动时#otherContainerpadding-top)的位置几乎被忽略了。

1 个答案:

答案 0 :(得分:0)

实际上,如果你使用一致且受支持的var header = document.getElementById('container') var clicks = document.querySelectorAll('#container li'); var content = document.querySelectorAll('#otherContainer > div'); // Turn the clicks HTML NodeList into an array so we can easily foreach Array.prototype.slice.call(clicks).forEach(function(element, index){ element.addEventListener('click', function(e){ e.preventDefault(); // Set the scroll to the top of the element (top + scroll) minus the headers height document.body.scrollTop = content[index].getBoundingClientRect().top + document.body.scrollTop - header.clientHeight; }); });方式,这很简单 - 你现在要做的就是减少它的标题,所以只需得到它并计算它的高度。

#container {
  position: fixed;
  background: yellow;
  width: 100%;
  height: 50px;
}

ul li {
  display: inline;
  cursor: pointer;
}

#otherContainer {
  padding-top: 60px
}

#first, #second, #third {
  height: 500px
}

#first {
  background: red
}

#second {
  background: green
}

#third {
  background: blue
}
<div id="container">
    <ul>
      <li id="jumpToFirst">first</li>
      <li id="jumpToSecond">second</li>
      <li id="jumpToThird">third</li>
    </ul>
</div>
<div id="otherContainer">
  <div id="first"></div>
  <div id="second"></div>
  <div id="third"></div>
</div>
s