el-input 输入框宽度自适应宽度

利用一个隐藏的 <span>(称为 mirror)渲染当前输入内容:

  1. span 使用与 <el-input> 相同的字体样式;

  2. 每次输入时,根据 span.offsetWidth 动态计算内容宽度;

  3. 将该宽度赋给 <el-input>style.width

  4. 给输入框增加少许 padding 余量,保证视觉舒适。

    <template> <el-form :model="form" label-width="auto" class="auto-form"> <el-form-item label="Activity name">
    {{ form.name || placeholder }}
    复制代码
         <!-- 自适应宽度的 el-input -->
         <el-input
           v-model="form.name"
           :style="{ width: inputWidth + 'px' }"
           :placeholder="placeholder"
           class="auto-el-input"
           @input="updateWidth"
         />
       </div>
     </el-form-item>
    
     <el-form-item>
       <el-button type="primary" @click="onSubmit">Create</el-button>
       <el-button @click="onCancel">Cancel</el-button>
     </el-form-item>
    </el-form> </template> <script lang="ts" setup> import { ref, reactive, onMounted, nextTick } from 'vue'

    // 表单数据
    const form = reactive({
    name: ''
    })

    // 占位文字(用于在空值时计算最小宽度)
    const placeholder = '请输入活动名称'

    // 输入框宽度(默认最小 100px)
    const inputWidth = ref(100)
    const mirror = ref<HTMLElement | null>(null)

    // 动态更新输入框宽度
    const updateWidth = () => {
    if (mirror.value) {
    // 同步文字
    mirror.value.textContent = form.name || placeholder
    // 计算宽度 + 内边距
    inputWidth.value = mirror.value.offsetWidth + 24
    }
    }

    onMounted(async () => {
    await nextTick()
    updateWidth()
    })

    const onSubmit = () => {
    console.log('提交数据:', form)
    }

    const onCancel = () => {
    form.name = ''
    updateWidth()
    }
    </script>

    <style scoped> .auto-form { max-width: 500px; margin: 40px auto; }

    .input-auto-wrapper {
    display: inline-block;
    position: relative;
    }

    .mirror {
    position: absolute;
    visibility: hidden;
    white-space: pre;
    font: inherit; /* 与 el-input 保持一致 */
    padding: 0 12px;
    }

    .auto-el-input {
    transition: width 0.2s ease;
    }
    </style>

限制最大宽度

复制代码
inputWidth.value = Math.min(mirror.value.offsetWidth + 24, 400)

此方案无需修改 Element Plus 源码,通过一个简单的隐藏 span 即可实现原生级别的动态自适应宽度输入框效果

相关推荐
We་ct8 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·javascript·算法·leetcode·typescript
@yanyu66613 小时前
登录注册功能-明文
vue.js·springboot
cn_mengbei16 小时前
用React Native开发OpenHarmony应用:Reanimated共享元素过渡
javascript·react native·react.js
kyriewen16 小时前
前端测试:别为了100%覆盖率而写测试,那是自欺欺人
前端·javascript·单元测试
Data_Journal17 小时前
如何使用cURL更改User Agent
大数据·服务器·前端·javascript·数据库
掌心向暖RPA自动化17 小时前
如何获取网页某个元素在屏幕可见部分的中心坐标影刀RPA懒加载坐标定位技巧
java·javascript·自动化·rpa·影刀rpa
竹林81817 小时前
wagmi v2 多链钱包切换:一个 Uniswap 仿盘项目让我踩了三天坑
前端·javascript
你也向往长安城吗17 小时前
最快的 JavaScript navmesh pathfinding3d 算法。
javascript
滕青山17 小时前
在线PDF拆分工具核心JS实现
前端·javascript·vue.js
兔子零102419 小时前
Ofox AI值得用吗?
前端·javascript·后端