【问题标题】:How can i make my fixed header scroll away when a specific div hits it, or when it is 100px from the top当一个特定的 div 命中它,或者它距离顶部 100px 时,如何让我的固定标题滚动
【发布时间】:2019-08-05 02:11:45
【问题描述】:

我可以看到很多与我想要实现的目标相反但注意我需要的方法。

我有一个 100 像素高的固定页眉。我希望它在指定的 div 击中标题或距屏幕顶部 100px 时与页面的其余部分一起滚动。

我在标题中添加了一个滚动类,这实际上只是使其位置绝对,导致标题跳转屏幕。然后我将它翻译回视图,这在所有屏幕尺寸上的效果都不一样。

我的下一个想法可能是保持它不变,但在标题中添加一个负变换,这取决于滚动位置。这将达到我想要的相同效果,但我不太确定如何实现。

如果您需要更多信息,我很乐意提供。

编辑:

以下是一些屏幕截图:

从页面顶部开始:

然后这就是我希望标题变得不固定并与页面的其余部分一起滚动的地方:

【问题讨论】:

  • 你能补充一个例子吗?
  • 我添加了一些屏幕截图

标签: javascript html css css-position css-transforms


【解决方案1】:

查看我的解决方案。希望这会有所帮助。

const headerEl = document.querySelector('header')
const targetEl = document.querySelector('#target')

const targetTopPos = targetEl.getBoundingClientRect().top

let isHeaderFixed = true

document.onscroll = () => {
  const targetTopOffset = targetEl.getBoundingClientRect().top
  
  if (isHeaderFixed && targetTopOffset < 100) {
    headerEl.style.position = 'absolute'
    headerEl.style.top = `${targetTopPos - 100}px`
    isHeaderFixed = !isHeaderFixed
  }
  
  if (!isHeaderFixed && targetTopOffset >= 100) {
    headerEl.style.position = 'fixed'
    headerEl.style.top = '0px'
    isHeaderFixed = !isHeaderFixed
  }
}
body {
  padding: 0;
  margin: 0;
  position: relative;
}

header {
  position: fixed;
  height: 100px;
  width: 100%;
  background: lightblue;
}

.content {
  line-height: 100px;
}

.target {
  width: 100%;
  background: red;
}
<header>
  Custom header
</header>
<div class="content">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam suscipit tellus urna, ut tristique felis lobortis sed. Phasellus maximus at magna mattis vulputate. Pellentesque tempor, urna vitae congue pellentesque, est mauris faucibus nulla, vitae molestie leo purus a leo. Curabitur ut mi ac sem finibus consectetur a blandit massa. Morbi ornare tincidunt ipsum, et accumsan erat fringilla a. Cras egestas, nibh vel condimentum ultrices, nunc ipsum tempus magna, eu ullamcorper tortor magna id lacus. Morbi euismod lacus a ligula rutrum, in aliquet lectus blandit. Nam placerat sollicitudin lectus eu ornare. Etiam placerat diam eget magna blandit rutrum. Nulla et luctus massa. Sed sit amet mauris in magna tincidunt consequat. Proin mattis sit amet arcu a gravida. Nullam tempor urna nec dolor convallis consectetur sit amet a elit. Cras ut odio nec lacus efficitur porta nec sit amet justo.
</div>
<div id="target" class="target">target</div>
<div class="content">
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam suscipit tellus urna, ut tristique felis lobortis sed. Phasellus maximus at magna mattis vulputate. Pellentesque tempor, urna vitae congue pellentesque, est mauris faucibus nulla, vitae molestie leo purus a leo. Curabitur ut mi ac sem finibus consectetur a blandit massa. Morbi ornare tincidunt ipsum, et accumsan erat fringilla a. Cras egestas, nibh vel condimentum ultrices, nunc ipsum tempus magna, eu ullamcorper tortor magna id lacus. Morbi euismod lacus a ligula rutrum, in aliquet lectus blandit. Nam placerat sollicitudin lectus eu ornare. Etiam placerat diam eget magna blandit rutrum. Nulla et luctus massa. Sed sit amet mauris in magna tincidunt consequat. Proin mattis sit amet arcu a gravida. Nullam tempor urna nec dolor convallis consectetur sit amet a elit. Cras ut odio nec lacus efficitur porta nec sit amet justo.
</div>

【讨论】:

  • 感谢您,它完全按照我在您的示例中的要求工作,但我无法让它在我的页面上工作。我会继续玩它,然后当我开始工作时会标记为正确
  • @CarlPiper 很高兴为您提供帮助。
  • 我太傻了,我把你的 js 包装在一个滚动事件监听器中,而你的已经有了。谢谢!
  • 一个简单的问题,我怎样才能让它重新计算窗口大小?我似乎无法让它重新计算每一件事。如果页面滚动过去,则在加载时仍会显示标题
  • @CarlPiper 您可以在窗口调整大小事件函数中更改 targetTopPos 变量
【解决方案2】:

我应该默认创建 .header {position: absolute} 并将这个类添加到 css 中(还没有添加到元素中):

.header.active {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
}

然后明白什么时候我们需要在头部携带这个事件。 JS 会有所帮助:

var targetElement = document.querySelector( YOUR TARGET ELEMENT ),
    header = document.querySelector('.header');

window.onscroll = function(event){
  if ( targetElement.offsetTop > window.pageYOffset ) {
    header.classList.add('active');
  } else {
    header.classList.remove('active');
  }
}

目标元素是当你想要到达它时,标题将被固定的元素。 如果你需要

【讨论】:

  • 嗨,这不是相反吗?我希望我的标题被修复,然后在它碰到某些 div 时滚动
  • 你为什么要这样做? :) 然后只需还原我的代码 - 默认情况下生成 .header {position: fixed; ....} 和 .header.active {位置:绝对}; - 应该工作;)
  • 是的,但正如我在我的问题中所说,它会跳转页面,因为绝对定位的行为不像固定定位。我会这样做,因为它会是一个很酷的效果?
  • 哦,现在我明白了。 :)
猜你喜欢
  • 1970-01-01
  • 2014-10-27
  • 2016-07-31
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多