调整文本框的宽度以自动适应其内容

假设 inputidtextbox,如下所示:

<input type="text" id="textbox" />

为了根据其内容动态调整其宽度,我们创建了一个伪元素,其内容与输入值相同。我们将输入的宽度设置为伪元素的宽度。

const fakeEle = document.createElement('div')

// 完全隐藏
fakeEle.style.position = 'absolute'
fakeEle.style.top = '0'
fakeEle.style.left = '-9999px'
fakeEle.style.overflow = 'hidden'
fakeEle.style.visibility = 'hidden'
fakeEle.style.whiteSpace = 'nowrap'
fakeEle.style.height = '0'

// 我们从文本框中复制一些影响宽度的样式
const textboxEle = document.getElementById('textbox')

// 获取样式
const styles = window.getComputedStyle(textboxEle)

// 从文本框中复制字体样式
fakeEle.style.fontFamily = styles.fontFamily
fakeEle.style.fontSize = styles.fontSize
fakeEle.style.fontStyle = styles.fontStyle
fakeEle.style.fontWeight = styles.fontWeight
fakeEle.style.letterSpacing = styles.letterSpacing
fakeEle.style.textTransform = styles.textTransform

fakeEle.style.borderLeftWidth = styles.borderLeftWidth
fakeEle.style.borderRightWidth = styles.borderRightWidth
fakeEle.style.paddingLeft = styles.paddingLeft
fakeEle.style.paddingRight = styles.paddingRight

// 将假元素附加到 body
document.body.appendChild(fakeEle)

下面的方法为伪元素设置 HTML,计算其宽度,并将结果设置为原始输入。

const setWidth = function () {
  const string = textboxEle.value || textboxEle.getAttribute('placeholder') || ''
  fakeEle.innerHTML = string.replace(/\s/g, '&' + 'nbsp;')

  const fakeEleStyles = window.getComputedStyle(fakeEle)
  textboxEle.style.width = fakeEleStyles.width
}

最后,当用户通过监听 input 事件更改输入值时,我们调用 setWidth 方法:

setWidth()

textboxEle.addEventListener('input', setWidth)

查看效果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值