用户滚动时更改margin-top

时间:2013-04-27 22:09:54

标签: javascript jquery css

我试图让div在用户向下滚动页面时向上滚动相同数量的像素。例如,在Google Chrome中使用鼠标滚轮时,它会以大约20px的间隔向下滚动。但是当您使用手柄向下滚动时,滚动量会有所不同。

到目前为止,这是我的代码:

var scrollCtr = 50;
$(window).scroll(function(){
   scrollCtr = scrollCtr - 20;
   $('div.nexus-files').css('margin-top', scrollCtr + 'px');
});

这有一些问题:

  1. 用户滚动变化
  2. 如果向下滚动则需要从margin-top中减去,如果向上滚动则需要添加到margin-top
  3. 这是一个例子: http://www.enflick.com/

    感谢您的帮助

3 个答案:

答案 0 :(得分:2)

你这样做是错误的,你要做的事情应该在position: fixed上使用div.nexus-files完成

div.nexus-files{position: fixed; top: 0;}

但无论如何 - 如果你仍然想知道你可以用滚动事件做什么 - 你最好到文档的scrollTop并将margin-top设置为相同的值

window.onscroll = function(event){
    var doc = document.documentElement, body = document.body;
    var top = (doc && doc.scrollTop  || body && body.scrollTop  || 0);
    document.getElementById('nexus-files_id').style.marginTop = top+'px';
}

我使用纯Javascript而不是jQuery,因为当浏览器需要在很短的时间内(在滚动期间)计算内容时,开销可能是至关重要的。 [通过存储对元素和文档的引用,可以做得更高效......但是你知道......)

我使用基于id的选择器来获取特定元素而不是基于类

我再说一遍 - 这不是你应该怎样做的事情

答案 1 :(得分:1)

为什么不使用实际滚动偏移作为参考或位置?

// or whatever offset you need
var scrollOffset = document.body.scrollTop + 20;

// jQuery
var scrollOffset = $("body").scrollTop() + 20;

答案 2 :(得分:0)

终于明白了

以下是我用来完成任务的代码。

大多数代码来自http://enflick.com,我修改它以适应我个人的情况。

jQuery(window).load(function(){
initParallax();
});

// parallax init
function initParallax(){
var win = jQuery(window);
var wrapper = jQuery('#wrapper');
var bg1 = wrapper.find('.nexus-files');
var koeff = 0.55;
if (bg1.length) {
    function refreshPosition(){
        var scrolled = win.scrollTop();
        var maxOffsetY1 = 450;
        var offsetY1 = scrolled * koeff;
        var offsetY2 = scrolled * koeff - (maxOffsetY1 * koeff - offsetY1);
        if (offsetY1 <= maxOffsetY1 * koeff - offsetY1) {
            bg1.css("margin-top", +-offsetY1+"px");
            //alert(+-offsetY1+"px");
        }
    }
    refreshPosition();
    win.bind('resize scroll', refreshPosition);
}
}