输入框跟随文字内容适配宽实现示例


Posted in Javascript onAugust 14, 2022

实现源码

// 常见一个辅助元素
const fakeEle = document.createElement('div');
// 隐藏辅助元素
fakeEle.style.position = 'absolute';
fakeEle.style.left = '-9999px';
fakeEle.style.visibility = 'hidden';
fakeEle.style.whiteSpace = 'nowrap';
// 获取输入框元素的样式
const textboxEle = document.getElementById('textbox');
const styles = window.getComputedStyle(textboxEle);
// 将输入框的字体样式赋给辅助元素
fakeEle.style.font = styles.font;
// 将辅助元素添加到页面
document.body.appendChild(fakeEle);
const setWidth = function () {
    const string = textboxEle.value || textboxEle.getAttribute('placeholder') || '';
    fakeEle.innerHTML = string.replace(/\s/g, ` `);
    // 获取辅助元素的样式
    const fakeEleStyles = window.getComputedStyle(fakeEle);
    // 将辅助元素的宽度赋给输入框元素
    textboxEle.style.width = fakeEleStyles.width;
};
setWidth();
// 监听输入框元素内容变化,输入框宽度跟随文字内容数量适配
textboxEle.addEventListener('input', function (e) {
    setWidth();
});

大概思路

其实核心点就是,如何获取输入框元素内文字内容的宽度值?

直接通过输入框元素肯定是无法获取到其文字内容宽度的,我们需要跳出输入框的限制,将文字内容独立出来。

首先,我们肯定是能够拿到输入框的文字内容的,使用 input.value 即可获取文字内容。

OK,文字内容有了,如何计算文字内容的宽度呢?

文字内容宽度

实现方案其实有 2 种,一种是使用 Canvas 的能力,另一种是使用辅助的 div 元素。

可能大部分同学还不是很了解 Canvas,所以本文就使用 div 元素的方式进行讲解。

首先,先定义好最基础的 HTML 和 CSS,代码如下:

<input id="textbox" type="text" />
input {
  padding: 8px;
}

此时,我们会得到一个最基础的输入框元素,没有任何文字内容。当我们往输入框元素内输入内容时,输入框元素的宽度也不会跟随变化。

然后通过 JavaScript 创建一个辅助的 div 元素,我们先将它添加到 body 元素内。

需要注意的是,文字内容的宽度会各被字体样式、大小、行间距等等因素所影响。本文作为讲解,暂时不考虑这么多影响因素,但会通过影响因素之一 “字体” 相关做个相关示例,提供各位同学作为参考。

const fakeEle = document.createElement('div');
const textboxEle = document.getElementById('textbox');
// 获取输入框元素样式
const styles = window.getComputedStyle(textboxEle);
// 将输入框元素的 font 属性赋给辅助的 div 元素
fakeEle.style.font = styles.font;
document.body.appendChild(fakeEle);

监听输入框元素的 input 事件,将文字内容同步给 div 辅助元素。

然后再反向的,获取 div 辅助元素的宽度,赋值给输入框元素,这样是不是就实现了啦了?

const setWidth = function () {
  const string = textboxEle.value || '';
  fakeEle.innerHTML = string;
  // 获取辅助元素的样式
  const fakeEleStyles = window.getComputedStyle(fakeEle);
  // 将辅助元素的宽度赋给输入框元素
  textboxEle.style.width = fakeEleStyles.width;
};
textboxEle.addEventListener('input', function (e) {
  setWidth();
});

我们来看看效果。

输入框跟随文字内容适配宽实现示例

当我们在输入框元素内随便输入一个内容,会发现输入框就撑满了整个页面。

输入框跟随文字内容适配宽实现示例

这是因为 div 辅助元素是块级元素,宽度默认是 100% 所导致的。那如何要获取文字内容宽度的话,要将它设置为行内元素嘛?

答案是不需要的,只要给 div 辅助元素添加绝对定位,使其脱离正常文档流即可。

// ...
fakeEle.style.position = 'absolute';
// ...

输入框跟随文字内容适配宽实现示例

输入框跟随文字内容适配宽实现示例

此时,我们会发现已经基本实现了我们想要的效果。

是的,我们已经解决了最核心的问题,但仍然还存在一些问题,需要我们进行处理。

细节处理

比如,输入多个空格的时候,宽度计算就错误了。

输入框跟随文字内容适配宽实现示例

这就需要我们将空格进行一下处理,将它替换成 &nbsp 即可,代码如下:

// fakeEle.innerHTML = string;
fakeEle.innerHTML = string.replace(/\s/g, ` `);

还有,辅助元素不应该出现在界面上,所以我们要将他隐藏掉。

// ...
fakeEle.style.left = '-9999px';
fakeEle.style.visibility = 'hidden';
fakeEle.style.whiteSpace = 'nowrap';
// ...

还有一些其它小细节,有兴趣的话,自己尝试一下吧。

以上就是输入框跟随文字内容适配宽实现示例的详细内容,更多关于输入框文字内容宽度适配的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
传递参数的标准方法(jQuery.ajax)
Nov 19 Javascript
JavaScript 封装Ajax传递的数据代码
Jun 05 Javascript
Ajax+Json 级联菜单实现代码
Oct 27 Javascript
按Enter键触发事件的jquery方法实现代码
Feb 17 Javascript
javascript引用类型指针的工作方式
Apr 13 Javascript
jQuery实现折叠、展开的菜单组效果代码
Sep 16 Javascript
JavaScript操作选择对象的简单实例
May 16 Javascript
JQuery 的跨域方法推荐_可跨任何网站
May 18 Javascript
jquery mobile界面数据刷新的实现方法
May 28 Javascript
省市区三级联动jquery实现代码
Apr 15 Javascript
js+html实现周岁年龄计算器
Jun 25 Javascript
微信接入之获取用户头像的方法步骤
Sep 23 Javascript
JS开发前端团队展示控制器来为成员引流
Aug 14 #Javascript
JS实现页面炫酷的时钟特效示例
Rust中的Struct使用示例详解
Aug 14 #Javascript
使用Cargo工具高效创建Rust项目
Aug 14 #Javascript
JS实现刷新网页后之前浏览位置保持不变示例详解
Aug 14 #Javascript
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
Aug 05 #Vue.js
Vue深入理解插槽slot的使用
Aug 05 #Vue.js
You might like
php以fastCGI的方式运行时文件系统权限问题及解决方法
2015/05/11 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
jQuery 研究心得 取得属性的值
2007/11/30 Javascript
javascript 动态加载 css 方法总结
2009/07/11 Javascript
javascript设计模式之工厂模式示例讲解
2014/03/04 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
jquery常用方法及使用示例汇总
2014/11/08 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
JQuery自适应窗口大小导航菜单附源码下载
2015/09/01 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
jquery仿ps颜色拾取功能
2017/03/08 Javascript
纯js实现动态时间显示
2020/09/07 Javascript
two.js之实现动画效果示例
2017/11/06 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
2019/10/12 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
在Linux系统上部署Apache+Python+Django+MySQL环境
2015/12/24 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
2017/06/01 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
python3写的简单本地文件上传服务器实例
2018/06/04 Python
Python基础知识点 初识Python.md
2019/05/14 Python
Django集成搜索引擎Elasticserach的方法示例
2019/06/04 Python
检测tensorflow是否使用gpu进行计算的方式
2020/02/03 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
python中reload重载实例用法
2020/12/15 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
《金钱的魔力》教学反思
2014/02/24 职场文书
银行竞聘演讲稿范文
2014/04/23 职场文书
工作自我推荐信范文
2015/03/25 职场文书
高中历史教学反思
2016/02/19 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
JS数组方法some、every和find的使用详情
2021/10/05 Javascript