【HTML】使用 div 自定义实现 input、textarea 输入框(适合定制化场景)

文章介绍了如何使用HTML的contenteditable属性创建自定义的Input和Textarea组件,包括处理placeholder和禁止回车换行功能。还展示了在React中实现一个多行文本输入框,能区分原有文案和生成后推理文案的颜色,并提供了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

API参考文档:

一、实现 Input 组件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			div {
				padding: 5px;
				overflow: auto;
				border: 1px solid #d9d9d9;
				outline: 0;
			}

			/* 输入框为空时显示 placeholder */
			div:empty:before {
				content: attr(placeholder);
				color: #bfbfbf;
			}

			/* 输入框获取焦点时移除 placeholder */
			div:focus:before {
				content: none;
			}
		</style>
	</head>
	<body>
		<!-- contenteditable="true" 属性,使 div 元素变成用户可编辑  -->
		<div contenteditable="true" placeholder="请输入内容" onkeydown="myFunction()"></div>
	</body>
	<script type="text/javascript">
		// 禁止回车换行
		function myFunction() {
			if (window.event && window.event.keyCode == 13) {
				window.event.returnValue = false;
			}
		}
	</script>
</html>

在这里插入图片描述

  • 不禁止回车换行就会变成这个样子:

在这里插入图片描述

二、实现 Textarea 组件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			div {
				resize: both;
				padding: 5px;
				overflow: auto;
				border: 1px solid #d9d9d9;
				height: 100px;
				outline: 0;
			}

			/* 输入框为空时显示 placeholder */
			div:empty:before {
				content: attr(placeholder);
				color: #bfbfbf;
			}

			/* 输入框获取焦点时移除 placeholder */
			div:focus:before {
				content: none;
			}
		</style>
	</head>
	<body>
		<!-- contenteditable="true" 属性,使 div 元素变成用户可编辑  -->
		<div contenteditable="true" placeholder="请输入内容"></div>
	</body>
	<script type="text/javascript">
	</script>
</html>

在这里插入图片描述
在这里插入图片描述

三、React 实践案例

react 使 多行文本输入框 里面的原有文案,与生成后的推理文案,用颜色区分开来

  • 效果图:

在这里插入图片描述

  • 代码实现:

import { Button } from 'antd';
import {  useState } from 'react';

export default function ({ dataset }) {
  const [textArea, setTextArea] = useState('');
  const [textAreaDiv, setTextAreaDiv] = useState('');
  const [loading, setLoading] = useState(false);


  const fetchInfer = async () => {
    const title = document.getElementById('contentEditableSpanTitle')?.innerHTML ?? '';
    const data = document.getElementById('contentEditableSpanData')?.innerHTML ?? '';
    const params = { inputs: `${title}${data}` };
    console.log('params = ', title, '---', data);
    setLoading(true);
    try {
      const data = await api(params);
      setTextAreaDiv(data.replace(title, ''));
    } catch (error) {}
    setLoading(false);
  };

  return (
    <div>
      <div
        style={{
          resize: 'both',
          overflow: 'auto',
          padding: '5px',
          border: '1px solid #d9d9d9',
          minHeight: '100px',
        }}
      >
        <span id="contentEditableSpanTitle" contentEditable="true" style={{ border: 0, outline: 0 }}>
          {textArea}
          <span id="contentEditableSpanData" contentEditable="true" style={{ border: 0, outline: 0, color: '#2563eb' }}>
          	{textAreaDiv}
          </span>
        </span>
      </div>
      <Button onClick={fetchInfer} loading={loading} style={{ margin: '10px 0' }}>
        Compute
      </Button>
    </div>
  );
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一颗不甘坠落的流星

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

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

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

打赏作者

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

抵扣说明:

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

余额充值