You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Logo从Jumbotron到Navbar的滚动触发平滑移动动画

解决Logo滚动时平滑移动到Navbar的动画问题

我来帮你搞定这个平滑移动的需求!你当前的实现里,直接用append转移DOM元素的操作是瞬间完成的,所以看不到移动的过渡效果,只有后续的尺寸缩放。要实现真正的“移动”动画,我们需要先让Logo脱离文档流,通过定位动画模拟移动过程,再完成DOM的转移。

核心思路

  1. 避免直接瞬间转移DOM节点,而是先将Logo设置为固定定位,脱离原有父元素的布局流
  2. 计算Logo从当前位置到目标容器(Navbar的.logo-top)的坐标差
  3. 用animate同时执行位置移动和尺寸缩放的动画
  4. 动画结束后,再将Logo真正转移到目标容器,恢复正常定位

具体实现步骤

1. 补充必要的CSS样式

给Logo添加定位相关的样式,确保动画过程中不会被其他元素遮挡:

/* Hero区域的Logo样式 */
.logo-hero #logo {
  position: relative;
  width: 20rem;
  /* 保留你原有的其他样式 */
}

/* Navbar区域的Logo样式 */
.logo-top #logo {
  width: 125px;
  /* 保留你原有的其他样式 */
}

/* 移动过程中的临时样式 */
.moving-logo {
  position: fixed !important;
  z-index: 9999; /* 确保Logo在最上层 */
}

2. 修改JavaScript代码

移除克隆Logo的逻辑,改用定位动画实现平滑移动:

var moved = false; 
var logo = $("#logo"); 
var logoTopContainer = $(".logo-top");
var logoHeroContainer = $(".logo-hero");

// 简化滚动位置的获取
$(window).scroll(function () { 
    var vertical_position = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;

    if (vertical_position > 120 && !moved) { 
        moveLogoUp(); 
        moved = true; 
    } else if (vertical_position < 120 && moved) { 
        moveLogoDown(); 
        moved = false; 
    } 
}); 

function moveLogoUp() {
    // 获取Logo当前在文档中的位置
    var logoOffset = logo.offset();
    // 获取目标容器(Navbar)在文档中的位置
    var targetOffset = logoTopContainer.offset();
    
    // 计算需要移动的距离(X轴和Y轴)
    var moveLeft = targetOffset.left - logoOffset.left;
    var moveTop = targetOffset.top - logoOffset.top;

    // 给Logo添加固定定位,脱离原布局
    logo.addClass("moving-logo");

    // 执行移动+缩放的组合动画
    logo.animate({
        left: moveLeft,
        top: moveTop,
        width: 125
    }, "slow", function() {
        // 动画结束后,将Logo转移到目标容器,清除临时样式
        logo.removeClass("moving-logo").css({left: "", top: ""});
        logoTopContainer.append(logo);
    });
}

function moveLogoDown() {
    // 获取Logo当前位置和Hero容器的位置
    var logoOffset = logo.offset();
    var targetOffset = logoHeroContainer.offset();
    
    var moveLeft = targetOffset.left - logoOffset.left;
    var moveTop = targetOffset.top - logoOffset.top;

    logo.addClass("moving-logo");

    // 执行返回的动画
    logo.animate({
        left: moveLeft,
        top: moveTop,
        width: "20rem"
    }, "slow", function() {
        logo.removeClass("moving-logo").css({left: "", top: ""});
        logoHeroContainer.append(logo);
        console.log("moveLogoDown done");
    });
}

关键细节说明

  • 用fixed定位让Logo脱离文档流,这样移动时不会影响其他元素的布局
  • 动画结束后必须清除left和top的行内样式,避免后续布局出现异常
  • 设置高z-index防止Logo在移动过程中被其他元素遮挡
  • 移除了原有的克隆Logo逻辑,现在直接操作原元素,逻辑更简洁

这样修改后,当页面滚动到指定高度时,Logo就会平滑地从Jumbotron移动到Navbar,同时伴随尺寸缩放的动画效果啦!

内容的提问来源于stack exchange,提问作者Dimon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:55:19