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 即可实现原生级别的动态自适应宽度输入框效果

相关推荐
killerbasd5 小时前
牧苏苏传 我不装了 4/7
前端·javascript·vue.js
橘子编程6 小时前
JavaScript与TypeScript终极指南
javascript·ubuntu·typescript
叫我一声阿雷吧7 小时前
JS 入门通关手册(45):浏览器渲染原理与重绘重排(性能优化核心,面试必考
javascript·前端面试·前端性能优化·浏览器渲染·浏览器渲染原理,重排重绘·reflow·repaint
大家的林语冰7 小时前
《前端周刊》尤大开源 Vite+ 全家桶,前端工业革命启动;尤大爆料 Void 云服务新产品,Vite 进军全栈开发;ECMA 源码映射规范......
前端·javascript·vue.js
jiayong237 小时前
第 8 课:开始引入组合式函数
前端·javascript·学习
天若有情6738 小时前
【C++原创开源】formort.h:一行头文件,实现比JS模板字符串更爽的链式拼接+响应式变量
开发语言·javascript·c++·git·github·开源项目·模版字符串
M ? A8 小时前
Vue 迁移 React 实战:VuReact 一键自动化转换方案
前端·vue.js·经验分享·react.js·开源·自动化·vureact
yuki_uix8 小时前
重排、重绘与合成——浏览器渲染性能的底层逻辑
前端·javascript·面试
Burt9 小时前
我的 2026 全栈选型:Vue3 + Elysia + Bun + AlovaJS
vue.js·全栈·bun
止观止9 小时前
拥抱 ESNext:从 TC39 提案到生产环境中的现代 JS
开发语言·javascript·ecmascript·esnext