【发布时间】:2021-05-16 09:56:13
【问题描述】:
单击汉堡图标时,我正在尝试使用 Bootstrap 展开和折叠导航栏。问题是我正在使用 React,而且我很确定 Bootstrap 的 DOM 操作与 React 的 DOM 操作有冲突。因此,我试图将所有操作从 Bootstrap 中移开,并完全依赖它们的样式并使用 React 来更新类。这对我来说是正确的方法。现在我意识到像 React Bootstrap 这样的东西存在,但我已经在我的项目中集成了 vanilla Bootstrap,看起来 React Bootstrap 仍然在版本 4 上,而我正在使用 5。
据我所知,Bootstrap 正在操纵这个 div 上的类:<div id="navbarSupportedContent" style="" class="navbar-collapse collapse">。因此,当菜单展开或折叠时,他们似乎正在添加类 collapsing 并删除类 collapse。然后,一旦完全显示,类变为 navbar-collapse collapse show 和折叠:navbar-collapse collapse。
Bootstrap 将过渡时间设置为 0.35 秒。所以这是我的 React 代码:
const handleNavCollapse = () => {
if (isNavCollapsed) {
setNavbarClasses('navbar-collapse collapsing');
//setTimeout( <-- I learned this way does not work correctly
setTimeout(() =>
setNavbarClasses('navbar-collapse collapse show'),
350
);
} else {
setNavbarClasses('navbar-collapse collapse');
}
setIsNavCollapsed(!isNavCollapsed);
};
另外,如果这可以帮助某人找出答案,这里是 Bootstrap 与 collapsing 类一起应用的 CSS:
.collapsing {
height: 0;
overflow: hidden;
transition: height 0.35s ease;
}
它可以在单击汉堡图标时正确显示和隐藏导航栏菜单。但是没有过渡。当我像在 Bootstrap 站点上一样在检查器中查看 DOM 时,我没有看到添加了 collapsing 类。我只看到它添加show 并删除show。也许我没有正确设置 setTimeout。
更新: 所以我从这个 SO 答案中发现:https://stackoverflow.com/a/42650143/571723 实际上我做错了 setTimeout。我切换到箭头功能。现在我看到 collapsing 类被立即添加,然后在 350 毫秒超时后切换到 show。问题是仍然没有过渡动画,它只是在 350 毫秒后显示菜单。
更新 2: 我正在进一步调查 Bootstrap 是如何做到这一点的。当 Bootstrap 在他们的网站上为导航栏设置动画时,我设法截取了控制台的屏幕截图。
所以你可以看到高度设置为一个特定的数字并且变化非常快(实际上这个数字没有改变,它被设置为 206px 并保持在那里直到它完全打开)。您还可以看到 height: 0 被覆盖。这些事情在我的网站检查器中没有发生。
【问题讨论】:
标签: javascript css reactjs twitter-bootstrap