有没有一种方法可以在 jQuery 中对元素进行动画处理,并为高度变化的每个像素触发一个函数?

发布于 2024-12-20 20:20:52 字数 2212 浏览 1 评论 0原文

我有一个相对基本的场景,其中有一个 nav HTML 元素,可以根据几个不同的触发器展开(更改元素的高度)内容在导航中向下滑动。

nav 元素是 position:fixed 并对子元素 .slideDown() 触发做出反应。

我有第二个元素,一个浮动 position:absolute 层,其 top css 值取决于 nav 元素结束的位置。

所以nav的底部=#layer的顶部。

我现在遇到的困难是,当 nav 高度时,将 top 位置附加到 nav 容器的 bottom变化。

有什么可以让我这样做吗?

我可以控制和挂钩动画和事件触发,因此我可以轻松地将函数附加到 slideDown/Up 动画的动画上,以更改 nav 高度,我只是无法弄清楚了解如何为每个更改的像素触发一个函数。

任何想法将不胜感激。

感谢您的阅读。

更新

根据建议,我重写了 slideDown 以使用 animate 函数,这样我就可以像这样传递 step 函数:

$('.sometrigger').click(function() {
    $("nav > ul").animate({
        'height':'show'
    }, {
        duration : 900,
        easing   : 'linear',
        step     : function(e) {
            console.log('step', $(this).height() );
        },
        complete : function() {
            $('nav').removeClass('closed').addClass('open');
        }
    });
});

这是每个步骤的控制台日志输出:

step 72
step 96
step 1
step 2
step 3
step 4
step 5
step 7
step 6
step 8
step 7
step 9
step 8
step 11
step 9
step 12
step 11
step 14
step 12
step 15
step 13
step 17
step 14
step 18
step 15
step 20
step 16
step 21
step 17
step 23
step 18
step 24
step 20
step 26
step 21
step 27
step 22
step 29
step 23
step 30
step 24
step 32
step 25
step 33
step 26
step 35
step 27
step 37
step 29
step 38
step 30
step 39
step 31
step 41
step 32
step 42
step 33
step 44
step 34
step 45
step 35
step 47
step 36
step 48
step 37
step 50
step 39
step 51
step 40
step 53
step 41
step 54
step 42
step 56
step 43
step 57
step 44
step 59
step 45
step 60
step 46
step 62
step 47
step 63
step 48
step 65
step 49
step 66
step 51
step 68
step 52
step 69
step 53
step 71
step 54
step 72
step 55
step 74
step 56
step 75
step 57
step 77
step 58
step 78
step 60
step 80
step 61
step 81
step 62
step 82
step 63
step 84
step 64
step 85
step 65
step 87
step 66
step 88
step 67
step 90
step 68
step 91
step 70
step 93
step 71
step 94

I've got a relatively basic scenario where I've got a nav HTML element that can be expanded (changes the height of the element) based on a couple different triggers and content being slid down inside the nav.

The nav element is position:fixed and reacts to a childs .slideDown() firing.

I have a second element, a floating position:absolute layer, which top css value is dependent on wherever the nav element ends.

So bottom of nav = top of #layer.

The difficulty I am now having is attaching the top position to the bottom of the nav container when the nav height changes.

Is there anything that would allow me to do this?

I have control and hooks over animations and events firing so I could easily attach a function to the animation of the slideDown/Up animation that change the nav height, I just cannot figure out how I can fire a function for each pixel changed.

Any ideas would be much appreciated.

Thanks for reading.

Update

Following advice I rewrote the slideDown to be using the animate function so I could pass a step function like so:

$('.sometrigger').click(function() {
    $("nav > ul").animate({
        'height':'show'
    }, {
        duration : 900,
        easing   : 'linear',
        step     : function(e) {
            console.log('step', $(this).height() );
        },
        complete : function() {
            $('nav').removeClass('closed').addClass('open');
        }
    });
});

Here is the console log output for each step:

step 72
step 96
step 1
step 2
step 3
step 4
step 5
step 7
step 6
step 8
step 7
step 9
step 8
step 11
step 9
step 12
step 11
step 14
step 12
step 15
step 13
step 17
step 14
step 18
step 15
step 20
step 16
step 21
step 17
step 23
step 18
step 24
step 20
step 26
step 21
step 27
step 22
step 29
step 23
step 30
step 24
step 32
step 25
step 33
step 26
step 35
step 27
step 37
step 29
step 38
step 30
step 39
step 31
step 41
step 32
step 42
step 33
step 44
step 34
step 45
step 35
step 47
step 36
step 48
step 37
step 50
step 39
step 51
step 40
step 53
step 41
step 54
step 42
step 56
step 43
step 57
step 44
step 59
step 45
step 60
step 46
step 62
step 47
step 63
step 48
step 65
step 49
step 66
step 51
step 68
step 52
step 69
step 53
step 71
step 54
step 72
step 55
step 74
step 56
step 75
step 57
step 77
step 58
step 78
step 60
step 80
step 61
step 81
step 62
step 82
step 63
step 84
step 64
step 85
step 65
step 87
step 66
step 88
step 67
step 90
step 68
step 91
step 70
step 93
step 71
step 94

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

别想她 2024-12-27 20:20:52

如果您查看 jQuery animate 文档,您会看到一种调用形式,允许您向其传递一个步骤函数,该函数将为动画的每个步骤调用。

来自 jQuery 文档

.animate(属性,选项)

属性:动画将移向的 CSS 属性图。
选项:传递给方法的其他选项的映射。

支持的按键:

duration:确定动画运行时间的字符串或数字。
easing:一个字符串,指示用于过渡的缓动函数。
complete:动画完成后调用的函数。
step:在动画的每个步骤之后调用的函数。
queue:一个布尔值,指示是否将动画放入效果队列中。如果为 false,动画将立即开始。从 jQuery 1.7 开始,队列选项还可以接受字符串,在这种情况下,动画将添加到该字符串表示的队列中。
specialEasing:由properties参数定义的一个或多个CSS属性及其相应的缓动函数的映射(在1.4中添加)。

根据您设置的时间和动画的速度,无法保证步进函数会为每个像素触发,但它会为动画的每个步骤触发(其中一些可能是多个像素,而不是一个像素) )。

以下是步骤函数的工作示例: http://jsfiddle.net/jfriend00/8bKz3/

If you look at the jQuery animate documentation, you will see that there's a calling form that allows you to pass it a step function that will be called for each step of the animation.

From the jQuery documentation:

.animate( properties, options )

properties: A map of CSS properties that the animation will move toward.
options: A map of additional options to pass to the method.

Supported keys:

duration: A string or number determining how long the animation will run.
easing: A string indicating which easing function to use for the transition.
complete: A function to call once the animation is complete.
step: A function to be called after each step of the animation.
queue: A Boolean indicating whether to place the animation in the effects queue. If false, the animation will begin immediately. As of jQuery 1.7, the queue option can also accept a string, in which case the animation is added to the queue represented by that string.
specialEasing: A map of one or more of the CSS properties defined by the properties argument and their corresponding easing functions (added 1.4).

Depending upon the time you set and the speed of your animation, there is no guarantee that the step function will fire for every single pixel, but it will fire for every step of the animation (some of which might be multiple pixels, rather than one).

Here's a working example of the step function: http://jsfiddle.net/jfriend00/8bKz3/.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文