根据div id滚动位置滑入和滑出元素

时间:2018-04-12 10:43:45

标签: javascript animation scroll slide

我想在div到达浏览器顶部时隐藏并显示一个元素。 我读了几个线程并写了这段代码

function hidebtn() {
  var scrollTop = $(window).scrollTop(),
    elementOffset = $('.triger').offset().top,
    distance = (elementOffset - scrollTop);

  var x = document.getElementById("u94");

  if (distance < 1) {
    $(x).animate({'top': '-100px'}, 300);
  } else {
    $(x).animate({'top': '0px'}, 300);
  }
}

window.onscroll = hidebtn

出于同样的原因,它不起作用,或者如果更具体,它会有很大的延迟。

如果我将条件代码更改为

if (distance < 1 ) {
    x.style.display = "none";
} else {
    x.style.display = "block";
}

它工作正常但我真的很喜欢使用滑动动画

您可以在JSFIddle

中看到它

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

当用户滚动时,多次调用

onscroll。您可以设置一点暂停来删除多余的呼叫:

var scrollTimer = null;

function hidebtn() {

    if (scrollTimer) {
        clearTimeout(scrollTimer);  // clear previous timer
    }

    // set timer while we wait for a pause in scroll events
    scrollTimer = setTimeout(function() {
        scrollTimer = null;  // timer done here
        console.log("ok");

        var scrollTop = $(window).scrollTop(),
          elementOffset = $('.triger').offset().top,
          distance = (elementOffset - scrollTop);

        var x = document.getElementById("u94");

        if (distance < 1) {
          $(x).animate({'top': '-100px'}, 300);
        } else{
          $(x).animate({'top': '0px'}, 300);
        }
    }, 100); // delay time
}

window.onscroll = hidebtn

这是一个有效的fiddle

答案 1 :(得分:0)

动画功能被多次触发,会导致一些难以调试的问题。更好的解决方案是使用css和一些额外的检查。这样,只有在需要时才会触发隐藏/显示。

的CSS

.hide {
  position: relative;
  transform: translateY(-100%);
  transition: all 0.3s ease-in-out;
}   

JS

function hidebtn() {
  var scrollTop = $(window).scrollTop(),
    elementOffset = $('.triger').offset().top,
    distance = (elementOffset - scrollTop);

  var x = $("#u94");
    var isHidden = x.hasClass('hide');

  if (distance <= 0 && !isHidden) {
    x.addClass('hide');
    console.log("hide");
  } else if (distance > 0 && isHidden) {
    x.removeClass("hide")
  }
}

window.onscroll = hidebtn

小提琴:https://jsfiddle.net/andreiTn/yag47gyn/