【问题标题】:Event on margin change保证金变动事件
【发布时间】:2012-09-03 17:23:07
【问题描述】:

我有一个带有动画上边距的元素。我需要检测它是否离边框不太近,如果是,将父 div 滚动到较低位置,以防止动画元素隐藏。这是一个例子:

http://jsfiddle.net/zYYBR/5/

单击“向下”按钮后,此绿色框不应位于红线下方。

【问题讨论】:

  • 当您说滚动父级时,您在示例中指的是什么元素?
  • 这个元素在右边滚动(#container)。
  • 不确定您要做什么。为什么还要有一个可滚动的 div?如果您只想让绿色框向下移动直到碰到红线然后停止,为什么不使用 position: relative 并更改顶部样式元素,当 top + width >= 该行的媒体框顶部时停止?
  • 我有带有链接和标记的可滚动导航,标记为活动导航。这些链接是指内容中部分的 ID。此外,当有人滚动内容时,标记会移动到当前可见部分的链接。当有人将内容滚动到最后时,标记将隐藏。所以我想在标记位于可见区域的底部(假设底部向上 40px)时使用链接滚动导航。 //编辑我不想每次按下“向下”时移动绿色框。但要相对于内部而不是容器移动。

标签: javascript jquery events scroll margin


【解决方案1】:

你是这个意思吗?

var new_margin;
var step = 75;
var limit = $("#max")[0].offsetTop;

$('#down').click(function() {
    var goStep = step;
    var elHeight = $("#animated")[0].offsetTop + $("#animated")[0].offsetHeight;    
    if((elHeight + step) > limit)
    {
        goStep = limit - elHeight;
    }
    new_margin = goStep +  parseInt($('#animated').css('margin-top'));
    $("#animated").animate({marginTop: new_margin}, 1000);   
});

http://jsfiddle.net/zYYBR/8/

编辑:或者类似的东西(当然你可以改进计算,因为目前滚动有很多错误):

var new_margin;
        var step = 75;
        $('#down').click(function () {
            scroll(1000);
        });

        var scrollTimer = null;
        $("#container").bind("scroll", function () {
            clearTimeout(scrollTimer);
            scrollTimer = setTimeout(function () { scroll(1); }, 10);
        });

        function scroll(speed) {
            var scrollStep, animationStep = step;
            var currentBoxBottom = $("#animated")[0].offsetTop + $("#animated")[0].offsetHeight;
            var nextCurrentBoxBottom = currentBoxBottom + step;
            var limit = $("#max")[0].offsetTop + $("#container")[0].scrollTop;
            if (nextCurrentBoxBottom > limit) {
                if (limit >= $("#container")[0].scrollTop) {
                    scrollStep = $("#container")[0].scrollTop + nextCurrentBoxBottom - limit;
                }
                else {
                    scrollStep = $("#container")[0].scrollTop - nextCurrentBoxBottom - limit;
                    animationStep = nextCurrentBoxBottom - limit;
                }

                $("#container")[0].scrollTop = scrollStep;
            }

            new_margin = animationStep + parseInt($('#animated').css('margin-top'));
            $("#animated").animate({ marginTop: new_margin }, speed);
        }

http://jsfiddle.net/zYYBR/13/

【讨论】:

  • 不。绿色框应该向下(相对于#inner)每次单击向下相同的距离。但是当#container 在红线下方时,它应该向下滚动。
【解决方案2】:

你的意思是这样的吗?

我的视觉结果与 Alex Dn 相同,但我为您所说的内容添加了一些额外的方向。如果这是您要查找的内容,我会进行更新:

var new_margin; 变量步= 75; var limit = $("#max")[0].offsetTop;

$('#down2').click(function() {
var anim = $("#animated");
var hrOff = $("#max").offset();
var thOff = anim.offset();
new_margin = Math.min(hrOff.top - thOff.top - anim.height(), 75);
console.log(new_margin, hrOff.top, thOff.top);
var st = 0;
if (new_margin < 75) {
    st = 75 - new_margin;
    //have container scroll by this much?
}

anim.animate({
    marginTop: "+=" + new_margin
}, 1000);
});​

http://jsfiddle.net/zYYBR/10/

【讨论】:

  • 不。滚动仍然没有移动(并且相对于#inner,框不会向下移动)。
  • @Alex Dn 和 ciembor 很抱歉 - 我之前在试验时不小心发布了 Alex 的代码。我已经用正确的代码更新了我的帖子,而 jsFiddle 从一开始就是正确的。再次抱歉
  • @ciembor,我知道窗口实际上并没有滚动-我只是在代码中添加了该注释并带有一点草稿以解决我的问题:这是您要查找的内容,即类似于我开始写什么让容器滚动额外的量?我可以帮你编写代码,但如果这不是你想要的,我不想浪费时间
  • 我想我已经找到了解决方案:stackoverflow.com/questions/1397251/…。我应该使用它来检测边距顶部的变化,然后滚动容器。
  • 我不会假装确切地知道你在寻找什么,但我对突变观察者非常熟悉,而且我从你的问题中了解到这不是你想要做的 -这是更多的工作,无论如何你都需要相同的脚本。但我可能是错的,我永远不会劝阻某人尝试新技术。如果您改变主意或需要任何进一步的帮助,请告诉我。祝你好运! :)
猜你喜欢
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 2010-12-14
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多