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

CSS宽度过渡异常:搜索框展开时父元素先占满宽度如何修复?

问题:搜索框宽度过渡动画不同步,粉色区域瞬间撑开而非平滑扩展

尝试实现粉色搜索框宽度平滑过渡,推动旁边蓝色搜索图标左移,但当前效果是:粉色区域先瞬间占满父元素宽度,再执行自身动画,体验割裂;而父元素的margin(左侧绿色区域)动画是平滑的。期望绿色和粉色区域同步平滑扩展,共同推动蓝色图标左移。

问题根源

输入框设置width: 100%时,父元素.header__searchBox初始无固定宽度,100%会基于父元素的自动宽度瞬间撑开容器,导致输入框动画滞后于父元素的margin动画,出现“先撑开再动画”的割裂感。

解决方案

调整.header__searchBox的宽度过渡逻辑,让父元素的宽度和输入框的宽度变化同步:

  • 给.header__searchBox设置初始宽度0,并添加width属性的过渡
  • 搜索状态下给.header__searchBox设置固定宽度(而非依赖输入框撑开)
  • 输入框始终保持width: 100%,只过渡padding属性

修改后的代码

JavaScript(无需修改)

let searching = true;

setInterval(() => {
  searching = !searching;
  document.querySelector('.header__searchBox').classList[searching ? 'remove' : 'add']('searching');
}, 1500);

CSS(关键修改部分标注)

* {
  box-sizing: border-box;
}

.grid {
  display: grid;
  grid-template-areas: empty animated;
  grid-template-rows: 1fr;
  grid-template-columns: repeat(2, 1fr);
}

.header__searchContainer {
  grid-area: animated;
  display: flex;
  justify-content: space-between;
  align-items: center;
  background-color: lightgreen;
  width: max-content;
}

.header__icon__search {
  display: flex;
  justify-self: center;
  justify-content: center;
  align-items: center;
  width: 1.75rem;
  height: 1.75rem;
  background-color: lightblue;
}

.header__searchBox {
  transition: all 0.75s;
  margin-left: 0;
  background-color: pink;
  width: 0; /* 初始宽度设为0 */
  overflow: hidden; /* 隐藏超出内容 */
}

.header__searchBox.searching {
  margin-left: 1.5rem;
  width: 12rem; /* 搜索状态下设置固定宽度 */
}

.header__searchBox input {
  --verticalPad: 0.25rem;
  border-radius: 0.5rem;
  border: none;
  width: 100%; /* 始终占满父元素宽度 */
  padding: var(--verticalPad) 0;
  transition: all 0.75s;
}

.header__searchBox.searching input {
  padding: var(--verticalPad) 0.25rem; /* 只过渡padding */
}

HTML(无需修改)

<div class="grid">
  <div class="header__searchContainer">
    <div class="header__icon header__icon__search"></div>
    <div class="header__searchBox"><input type="search" placeholder="search"></div>
  </div>
</div>

效果说明

修改后,.header__searchBox的宽度从0平滑过渡到12rem,同时margin-left从0过渡到1.5rem,两者同步动画,绿色区域(父容器)和粉色区域(搜索框容器)会共同平滑扩展,推动蓝色图标同步左移,解决了动画割裂的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:10:12