点击切换类实现搜索栏下滑时CSS Transition不生效的问题咨询
点击切换类实现搜索栏下滑时CSS Transition不生效的问题咨询
嘿,我来帮你排查这个问题~ 你的搜索栏现在直接跳转而不是平滑滑动,主要有两个核心原因:
问题出在哪?
1. position属性变化破坏了过渡效果
你给.searchbar__input添加的show类里,把元素的position从默认的static改成了relative,但CSS的transition是不支持position属性变化的——一旦这个属性改变,浏览器就会直接触发元素的位置跳转,忽略过渡动画。2. 过渡和位置控制的对象不匹配
你把过渡属性加在了searchbar__input上,但实际上整个搜索栏的定位是由父元素.searchbar(position:absolute)控制的,修改子元素的位置并不能利用父元素的定位逻辑,也很难触发平滑过渡。
怎么解决?
我们只需要调整几个关键点,就能实现平滑下滑的效果:
1. 修改JS代码,切换父元素的类
把目标元素从searchbar__input改成searchbar,这样我们直接控制整个搜索栏的位置:
const sbtn = document.querySelector('.nav__search-btn'), sbar = document.querySelector('.searchbar'); // 选中父元素.searchbar sbtn.addEventListener('click', () => { sbar.classList.toggle('show'); });
2. 调整CSS,只修改可过渡的属性
去掉show类里的position:relative,只保留top值的变化,同时确保.searchbar的position始终为absolute(这样top的变化就能被过渡捕捉):
* { box-sizing: border-box; padding: 0; margin: 0; position: relative; } .nav { display: flex; justify-content: space-between; background: lightgray; height: 50px; align-items: center; } .right { display: flex; justify-content: space-between; align-items: center; text-align: center; gap: 20px; height: 100%; } .btn { background: green; padding: 10px; } .searchbar { position: absolute; top: 0px; left: 10%; width: 80%; transition: top 1s ease; /* 保持这个过渡属性 */ } .searchbar__input { width: 100%; height: 30px; /* 移除这里不必要的transition */ } .show { top: 50px; /* 只修改top值,position保持absolute不变 */ }
3. HTML结构保持不变
你的HTML结构是没问题的,不需要修改~
为什么这样改就生效了?
现在我们只修改.searchbar的top属性,它的position始终是absolute,没有发生任何不支持过渡的属性变化,浏览器就能正常识别top的数值变化,从而触发平滑的过渡动画,搜索栏也就会慢慢滑下来啦!
备注:内容来源于stack exchange,提问作者Maik Lowrey
相关产品推荐
相关产品推荐

