首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript向下滚动到某个部分

Javascript向下滚动到某个部分
EN

Stack Overflow用户
提问于 2019-12-05 22:53:43
回答 2查看 654关注 0票数 0

我正在制作我的作品集网站。当用户滚动到指定部分时,我想添加一个css类。(我想使用Javascript事件)

例如,首先使用css隐藏一个元素,然后当用户向下滚动到该部分时,使用vanilla Javascript显示该元素。

代码语言:javascript
运行
复制
<div id="info"> info... </div> 
#info { display :none;}

正在加载Javascript代码?...

EN

回答 2

Stack Overflow用户

发布于 2019-12-05 23:05:07

这是一个大问题,你可以使用Intersection Observer,但并不是所有的浏览器都支持它,另一种方法是在窗口上使用滚动事件。

代码语言:javascript
运行
复制
function debounce(func, wait = 20, immediate = true) {
    let timeout
    return function() {
      let context = this,
        args = arguments
      let later = function() {
        timeout = null
        if (!immediate) func.apply(context, args)
      }
      let callNow = immediate && !timeout
      clearTimeout(timeout)
      timeout = setTimeout(later, wait)
      if (callNow) func.apply(context, args)
    }
  }

  const images = document.querySelectorAll('img')

  function checkSlide(e) {
    images.forEach(img => {
      const slideInAt = window.scrollY + window.innerHeight - img.height / 2
      const imageBottom = img.offsetTop + img.height
      const isHalfShown = slideInAt > img.offsetTop
      const isNotScrolledPast = window.scrollY < imageBottom
      if (isHalfShown && isNotScrolledPast) {
        img.classList.add('active')
      } else {
        img.classList.remove('active')
      }
    })
  }

  window.addEventListener('scroll', debounce(checkSlide))

这是我跟随Wes Bos的javascript30课程编写的代码,我强烈推荐它是免费的

摘要:

函数去反跳是为了停止调用事件的次数过多,超过需要的次数。

const图像是我的dom上的所有图像,我正在检查图像,但你可以检查你想检查的任何div。

checkSlide函数检查我是否已经到达并且没有传递每个图像,你可以在这里检查你想要的每个div。

票数 0
EN

Stack Overflow用户

发布于 2019-12-05 23:28:39

您可以跟踪窗口的滚动位置和目标元素的顶部位置。然后,当元素达到某个点(例如,窗口高度的一半)时,可以为其提供一个类来修改一些css属性,如opacitydisplay

代码语言:javascript
运行
复制
let targets = document.querySelectorAll('.target');

window.addEventListener("scroll", function(){
  let doc = document.documentElement;
  let top = (window.pageYOffset || doc.scrollTop)  - (doc.clientTop || 0);

  let windowHeight = window.innerHeight;

  for (i = 0; i < targets.length; ++i) {
    let target = targets[i];
    if(target.offsetTop < (top + (windowHeight/2))) {
      target.classList.add("visible");
    }
    else {
      target.classList.remove("visible");
    }
  }
});

看看这个demo

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59197754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档