使用 div 自定义 input 和 textarea

1. 为什么要自定义呢?

原生的 input 和 textarea 在某些特定场景下存在功能或兼容性限制,因此使用 div 元素自定义实现,突破原生输入框在样式、功能、兼容性上的限制。

1、解决火狐浏览器换行问题

某些版本的火狐浏览器中,原生 textarea 存在回车不换行而显示为空格的问题。这种行为在开发文本编辑器或多行输入框时造成不便。

2、提供更灵活的样式和内容格式

原生 input 和 textarea 元素样式定制有限,比如:无法直接改变 textarea 的行高或在内容中插入动态元素,如:标签或图标。原生输入框的内容只能是纯文本,难以直接支持复杂的文本格式,如:加粗、斜体或自定义样式。

3、跨平台或多浏览器兼容

不同的浏览器和设备对原生输入框的支持程度有所不同,尤其是一些老旧浏览器或特定版本的浏览器可能会对 input 和 textarea 产生不同的渲染结果。

2. 实现方法

contenteditable = "true" 是一个 HTML 属性,能够将 div 或其他元素变成一个可编辑的区域。用户可以输入文本,而浏览器会处理光标、输入等基本交互行为。通过监听相应的事件,可以让这个可编辑的 div 元素实现更复杂的行为和功能。

2.1 实现带 placeholder 的输入框

div 本身并没有内建的 placeholder 属性,但可以使用 CSS 和 JavaScript 来模拟该功能。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8&#
### 解决 Textarea `blur` 事件不生效的方法 在某些情况下,特别是在特定设备或浏览器上,`textarea` 的 `blur` 事件可能不会按预期工作。针对这一问题,可以采用多种方法来确保 `blur` 事件能够正常触发。 #### 方法一:使用 JavaScript 手动控制焦点 可以通过监听整个文档的点击事件,在点击发生时手动判断并移除指定输入框的焦点。这种方法适用于处理页面内任意位置点击导致的失焦情况[^3]。 ```javascript document.addEventListener('click', function(event){ var target = event.target; let selector = document.querySelector('#yourTextAreaId'); // 替换为实际的选择器 if (!selector.contains(target)) { selector.blur(); } }); ``` #### 方法二:利用只读属性配合样式调整 对于移动设备特别是苹果手机上的特殊情况,设置输入框为只读状态 (`readonly`) 并结合 CSS 控制光标的可见性是一种有效的策略。当不再需要编辑时切换到只读模式,并改变鼠标指针形状以提示用户当前字段不可交互。 ```css input.readonly, textarea.readonly{ cursor: not-allowed !important; } ``` ```html <textarea id="example" class="${isReadOnly ? 'readonly' : ''}"></textarea> ``` #### 方法三:借助框架特性优化操作流程 如果是在 Vue 或 UniApp 环境下开发,则可以直接利用其提供的 API 对组件行为进行更精细地管理。比如通过给自定义组件绑定 `ref` 属性,之后就可以方便地调用该实例下的任何公开函数来进行诸如关闭键盘之类的动作[^4]。 ```vue <template> <div> <!-- 定义 --> <chatInput ref="msgInput"></chatInput> <!-- 其它代码 --> <button @click="handleBlur">点击失焦</button> </div> </template> <script> export default { methods: { handleBlur(){ this.$refs.msgInput.blurFunction(); // 假设有一个 blurFunction 方法用于使 input 失去焦点 } } }; </script> ``` 以上三种方式可以根据具体的应用场景个人偏好灵活选用,从而有效解决不同平台环境下可能出现的 `textarea` `blur` 事件失效的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值