You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在textarea输入时,按空格键为已输入单词动态加样式实现标签效果?

标签输入功能实现方案

原生<textarea>不支持为局部文本设置自定义样式,因此采用「视觉容器+输入框」的模拟方案,实现按空格生成带样式标签的效果,和主流标签输入组件逻辑完全一致。

1. HTML 结构

<div class="tag-input-container" id="tagInput">
  <input type="text" class="tag-input" placeholder="输入单词按空格生成标签">
</div>

2. CSS 样式

/* 容器样式 */
.tag-input-container {
  border: 1px solid #d9d9d9;
  border-radius: 4px;
  padding: 6px;
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  align-items: center;
  min-height: 38px;
  cursor: text;
}

/* 标签样式,可按需修改背景、边框等参数 */
.tag-item {
  background-color: #e6f7ff;
  border: 1px solid #91d5ff;
  border-radius: 4px;
  padding: 2px 6px;
  display: flex;
  align-items: center;
  gap: 4px;
  font-size: 14px;
}

/* 标签删除按钮 */
.tag-close {
  cursor: pointer;
  color: #666;
  font-size: 12px;
}

/* 输入框样式 */
.tag-input {
  border: none;
  outline: none;
  flex: 1;
  min-width: 120px;
  padding: 4px;
  font-size: 14px;
}

3. JS 交互逻辑

const tagInputContainer = document.getElementById('tagInput');
const tagInput = tagInputContainer.querySelector('.tag-input');

// 监听键盘事件
tagInput.addEventListener('keydown', (e) => {
  // 按下空格键生成标签
  if (e.code === 'Space') {
    e.preventDefault();
    const inputValue = tagInput.value.trim();
    if (!inputValue) return;

    // 可选:禁止重复标签,不需要可删除本段逻辑
    const existingTags = Array.from(tagInputContainer.querySelectorAll('.tag-item'))
      .map(item => item.dataset.tag);
    if (existingTags.includes(inputValue)) {
      tagInput.value = '';
      return;
    }

    // 生成标签节点
    const tagItem = document.createElement('div');
    tagItem.className = 'tag-item';
    tagItem.dataset.tag = inputValue;
    tagItem.innerHTML = `${inputValue}<span class="tag-close">×</span>`;

    // 绑定标签删除事件
    tagItem.querySelector('.tag-close').addEventListener('click', () => {
      tagItem.remove();
    });

    // 插入标签到输入框前
    tagInputContainer.insertBefore(tagItem, tagInput);
    tagInput.value = '';
  }

  // 按下退格键且输入框为空时,删除最后一个标签
  if (e.code === 'Backspace' && !tagInput.value) {
    const lastTag = tagInputContainer.querySelector('.tag-item:last-child');
    lastTag?.remove();
  }
});

// 点击容器自动聚焦输入框
tagInputContainer.addEventListener('click', () => {
  tagInput.focus();
});

常用拓展功能

  • 获取所有已输入的标签:
const allTags = Array.from(document.querySelectorAll('.tag-item')).map(item => item.dataset.tag);
  • 限制标签最大数量:在生成标签前判断已存在的标签长度,超过阈值则终止生成逻辑即可。
  • 调整标签样式:直接修改.tag-item的CSS属性即可适配你的设计规范。

内容的提问来源于stack exchange,提问作者nesu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:06:01