input宽度随输入内容自适应(以el-input为例)

效果:

 ​​​​​​

思路:

1.input用绝对定位,使其宽度与父容器保持一致

2.利用一个隐藏的div对齐input的内容,以此来撑开父容器宽度

(对齐内容除了输入文本外,还需包含padding,border、margin、font-size、font-family等所有会影响元素宽度的样式)

实现:

 template代码:会使用到下面两个事件,不懂的朋友可以去看看文档。

compositionupdate - Web API 接口参考 | MDN

compositionend - Web API 接口参考 | MDN

<template>
  <div>
    <div class="nav-bar flex-row flex-center">
      <div class="nav-back">
        <el-icon :size="24"><arrow-left /></el-icon>
      </div>
      <div class="nav-title-wrap">
        <!-- 采用绝对定位的input -->
        <div class="nav-title">
          <el-input v-model="title" placeholder="" @compositionupdate="titleCompositionUpdate" @compositionend="titleCompositionEnd"></el-input>
        </div>
        <!-- 一个对齐input内容的不可见div -->
        <div class="nav-title-hidden">{{ title }}{{ titleUpdate }}</div>
      </div>
      <div class="flex-1"></div>
      <el-button type="primary">保 存</el-button>
    </div>
  </div>
</template>

 script代码:主要处理输入法在中文模式下,输入拼音时会回显到输入框中,会影响到input宽度,所以需要捕获其输入备选状态下的内容

(用的Typescript语言,不懂的前端朋友只要看核心逻辑就好了)

<script setup lang="ts">
import { ArrowLeft, ArrowDown } from '@element-plus/icons-vue'
import { reactive, ref } from 'vue'
const title = ref('') // 已输入的标题内容
const titleUpdate = ref('') // 输入法中文模式下正在输入的拼音内容

function titleCompositionUpdate(e: any) {
  console.log(e)
  titleUpdate.value = e.data
}

function titleCompositionEnd(e: any) {
  titleUpdate.value = ''
}
</script>


<style lang="less" scoped>
.flex-row {
  position: relative;
  display: flex;
  flex-direction: row;
}
.flex-1 {
  position: relative;
  flex: 1;
  min-width: 0;
}
.flex-center {
  align-items: center;
}
.nav-bar {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 56px;
  background-color: #fff;
  z-index: 99;
  box-shadow: 0 0 0 1px var(--el-input-border-color,var(--el-border-color));
  padding-right: 16px;
  .nav-back {
    width: 56px;
    min-width: 56px;
    border-right: 1px solid var(--el-border-color);
    text-align: center;
    height: 24px;
  }
  .nav-title-wrap {
    width: auto;
    min-width: 120px;
    margin: 0 12px;
    position: relative;
    height: 36px;

    .nav-title {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      z-index: 1;
      /deep/ .el-input {
        font-size: 16px;
      }
    }

    .nav-title-hidden {
      height: 0;
      overflow: hidden;
      white-space: nowrap;
      // 对齐input所有会影响宽度的样式
      padding: 0 11px;
      font-size: 16px;
      font-family: var(--el-font-family);
    }
  } 

}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Homilier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值