el-collapse-transition抖动、卡顿问题解决

使用Vue2结合el-collapse-transition,期望实现一个点击按钮动态展开搜索框的功能,但是在点击时的动画效果卡顿,非常影响观感。

queryParams:保存所有的查询参数,是一个对象

handleQuery:每次点击相应的查询框会触发查询方法

点击展开折叠时由advanced来控制展开折叠

出现问题的源代码

<div class="search_box">
<el-form
    ref="queryForm"
    :inline="true"
    :model="queryParams"
    label-position="right"
    label-width="85px"
    size="small"
>
  <el-row :gutter="20">
    <el-col :span="8">
      <el-form-item label="型号xxx" prop="no">
        <el-input
            v-model="queryParams.no"
            clearable
            placeholder="请输入"
            @keyup.enter.native="handleQuery"
        />
      </el-form-item>
    </el-col>
    <el-col :span="8">
      <el-form-item label="全称xxx" prop="name">
        <el-input
            v-model="queryParams.name"
            clearable
            placeholder="请输入"
            @keyup.enter.native="handleQuery"
        />
      </el-form-item>
    </el-col>
    <el-collapse-transition>
      <div v-show="advanced">
        <el-col :span="8">
          <el-form-item label="简称" prop="sName">
            <el-input
                v-model="queryParams.sName"
                clearable
                placeholder="请输入"
                @keyup.enter.native="handleQuery"
            />
          </el-form-item>
        </el-col>
      </div>
    </el-collapse-transition>
    <div class="search_select">
      <el-button size="medium" @click="resetQuery"
      >重置
      </el-button>
      <el-button
          size="medium"
          type="primary"
          @click="handleQuery"
      >查询
      </el-button>
      <a style="margin-left: 8px;font-size: 14px;color: #409EFF;" @click="changeAdvanced">
        {{ advanced ? '收起' : '展开' }}
        <i :class="advanced ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"/>
      </a>
    </div>
  </el-row>
</el-form>
</div>

问题出现在

<el-collapse-transition>
   <div v-show="advanced">

找了很多帖子说的需要在el-collapse-transition下的v-show控制显示隐藏的下方加上div,如

<el-collapse-transition>
   <div v-show="advanced">
      <div>

但是无效,还是会出现抖动、卡顿的现象,包括说加样式、加动画等等,试了几次最后发现在el-collapse-transition内再加上一个div可以有效解决抖动、卡顿问题,成功代码如下

HTML:

<div class="search_box">
<el-form
    ref="queryForm"
    :inline="true"
    :model="queryParams"
    label-position="right"
    label-width="85px"
    size="small"
>
  <el-row :gutter="20">
    <el-col :span="8">
      <el-form-item label="型号xxx" prop="no">
        <el-input
            v-model="queryParams.no"
            clearable
            placeholder="请输入"
            @keyup.enter.native="handleQuery"
        />
      </el-form-item>
    </el-col>
    <el-col :span="8">
      <el-form-item label="全称xxx" prop="name">
        <el-input
            v-model="queryParams.name"
            clearable
            placeholder="请输入"
            @keyup.enter.native="handleQuery"
        />
      </el-form-item>
    </el-col>
    <el-collapse-transition>
      <div>
        <div v-show="advanced">
          <el-col :span="8">
            <el-form-item label="简称" prop="sName">
              <el-input
                  v-model="queryParams.sName"
                  clearable
                  placeholder="请输入"
                  @keyup.enter.native="handleQuery"
              />
            </el-form-item>
          </el-col>
        </div>
      </div>
    </el-collapse-transition>
    <div class="search_select">
      <el-button size="medium" @click="resetQuery"
      >重置
      </el-button>
      <el-button
          size="medium"
          type="primary"
          @click="handleQuery"
      >查询
      </el-button>
      <a style="margin-left: 8px;font-size: 14px;color: #409EFF;" @click="changeAdvanced">
        {{ advanced ? '收起' : '展开' }}
        <i :class="advanced ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"/>
      </a>
    </div>
  </el-row>
</el-form>
</div>

CSS样式(个人认为该部分影响不大)

<style scoped>

.search_box {
    padding: 8px 0;
    background-color: #FFFFFF;
    border-radius: 6px;

    .search_select {
      display: flex;
      flex-direction: row;
      flex-wrap: nowrap;
      align-items: center;
      float: right;
      padding-right: 10px;
      margin: 8px 0;
    }
  }

</style>
<style>

.search_box {
    .el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
      float: right;
    }

    .el-row {
      margin: 0 !important;
    }


    .el-form {
    }

    .el-form-item {
      margin: 8px 0 !important;
      width: 90%;
    }


    .el-form-item__content {
      width: 68%;

    }

    .el-select {
      width: 100%;
    }

    .el-input {
      width: 100%;
    }

    .el-input--small .el-input__inner {
      height: 36px;
    }

    .el-icon-arrow-down {
      font-size: 16px;
    }

    .el-icon-arrow-up {
      font-size: 16px;
    }

  }

</style>

### 配置 `el-collapse-transition` 实现左右方向的折叠动画效果 为了使 `el-collapse-transition` 支持左右方向的折叠动画效果,需要自定义 CSS 动画并将其应用到相应的元素上。默认情况下,Element UI 的 `el-collapse-transition` 主要针对上下方向的高度变化设计。 #### 自定义CSS动画 创建一个新的 CSS 类来处理宽度的变化而不是高度: ```css .horizontal-collapse-transition { transition: all .3s ease; } .horizontal-collapse-enter, .horizontal-collapse-leave-to /* .fade-leave-active below version 2.1.8 */ { width: 0; } ``` 此代码片段定义了一个新的过渡类 `.horizontal-collapse-transition` 来控制宽度属性随时间逐渐改变[^1]。 #### 修改HTML结构 确保 HTML 结构能够支持水平扩展/收缩行为: ```html <template> <div class="wrapper"> <!-- 使用 v-if 控制显示隐藏 --> <button @click="isExpanded = !isExpanded">Toggle</button> <transition name="horizontal-collapse"> <div v-show="isExpanded" class="content"> Content goes here... </div> </transition> </div> </template> ``` 这段模板展示了如何利用 Vue.js 中的 `<transition>` 标签配合上述自定义的 CSS 类名实现左右滑动效果[^2]。 #### JavaScript逻辑 管理组件的状态切换: ```javascript export default { data() { return { isExpanded: false, }; }, }; ``` 这里简单地维护了一个布尔变量用于跟踪当前是否处于展开状态[^3]。 通过这种方式可以有效地让 `el-collapse-transition` 组件具备左右方向上的伸缩能力。需要注意的是,在实际项目中可能还需要调整其他样式以适应具体需求,并解决可能出现的问题如布局闪烁等现象[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值