如何实现Logo从Jumbotron到Navbar的滚动触发平滑移动动画
我来帮你搞定这个平滑移动的需求!你当前的实现里,直接用append转移DOM元素的操作是瞬间完成的,所以看不到移动的过渡效果,只有后续的尺寸缩放。要实现真正的“移动”动画,我们需要先让Logo脱离文档流,通过定位动画模拟移动过程,再完成DOM的转移。
核心思路
- 避免直接瞬间转移DOM节点,而是先将Logo设置为固定定位,脱离原有父元素的布局流
- 计算Logo从当前位置到目标容器(Navbar的
.logo-top)的坐标差 - 用
animate同时执行位置移动和尺寸缩放的动画 - 动画结束后,再将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
相关产品推荐
相关产品推荐

