返回顶部
首页 > 资讯 > 前端开发 > JavaScript >基于原生CSS+JS实现一个标签输入框
  • 294
分享到

基于原生CSS+JS实现一个标签输入框

2024-04-02 19:04:59 294人浏览 泡泡鱼
摘要

目录一、自适应输入框布局二、输入框占位提示三、标签的输入与删除四、选择框架还是原生最近在项目中需要做一个标签输入框,还挺实用的,演示效果如下: 主要交互要求是这样的: 点击输入框可

最近在项目中需要做一个标签输入框,还挺实用的,演示效果如下:

主要交互要求是这样的:

  • 点击输入框可以输入内容。
  • 按回车可以生成标签。
  • 按退格键可以删除标签。
  • 点击标签上的关闭按钮可以删除标签。

习惯了各种 React 框架或者UI库,大家有多久没接触没有原生开发了呢?有时候页面比较简单,没必要引入一个完整的框架,原生实现就完全满足了,一起看看吧!

一、自适应输入框布局

不管什么组件,布局都是最重要的。这个布局分为标签和输入框两个部分,假设 html 如下:

<div class="tags-content">
  <tag>CSS<a class="tag-close"></a></tag> 
  <input class="tags-input" placeholder="添加标签">
</div>

简单修饰一下:

.tags-content{
   display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    gap: 6px;
    width: 400px;
    box-sizing: border-box;
    padding: 8px 12px;
    border: 1px solid #D9D9D9;
    border-radius: 4px;
    font-size: 16px;
    line-height: 24px;
    color: #333;
    outline-color: #4F46E5;
    overflow: auto;
    cursor: text;
}
tag{
    display: flex;
    align-items: center;
    padding: 4px 0 4px 8px;
    font-size: 16px;
    line-height: 24px;
    background: #F5F5F5;
    color: rgba(0, 0, 0, 0.85);
    cursor: default;
}
tag-close{
    width: 18px;
    height: 18px;
    cursor: pointer;
    background: url("data:image/svg+xml,%3Csvg width='10' height='10' viewBox='0 0 10 10' fill='none' xmlns='Http://www.w3.org/2000/svg'%3E%3Cpath d='M5.578 5l2.93-3.493a.089.089 0 0 0-.068-.146h-.891a.182.182 0 0 0-.137.064l-2.417 2.88-2.416-2.88a.178.178 0 0 0-.137-.064h-.89a.089.089 0 0 0-.069.146L4.413 5l-2.93 3.493a.089.089 0 0 0 .068.146h.89a.182.182 0 0 0 .138-.064l2.416-2.88 2.417 2.88c.033.04.083.064.137.064h.89a.089.089 0 0 0 .069-.146l-2.93-3.493z' fill='%23000' fill-opacity='.45'/%3E%3C/svg%3E") center no-repeat;
}
.tags-input{
    flex: auto;
    border: 0;
    outline: 0;
    padding: 4px 0;
    line-height: 24px;
    font-size: 16px;
}
.tags-content:focus-within,
.tags-content:active{
    outline: auto #4F46E5;
}

注意几点实现技巧:

  • 标签的间隔可以用 gap 实现。
  • 为了让输入框的区域铺满剩余空间,这里用到了flex: auto。
  • 为了让父级处于聚焦状态,这里用到了:focus-within。

效果如下:

但是这里的输入框用 input 还是有些问题的,如下所示:

由于 input 输入内容无法跟随宽度自适应,所以有时候会出现文字被截断的情况:

理想情况下,当输入内容较多时,应该整体换行。如何实现呢?可以用普通的 div 来实现。

<div class="tags-content">
  <tag>CSS<a class="tag-close"></a></tag> 
  <div class="tags-input" placeholder="添加标签"></div>
</div>

可以通过添加contenteditable或者以下 CSS 来实现:

.tags-input{
  -WEBkit-user-modify: read-write-plaintext-only;
}

这个属性表示只允许输入纯文本,有兴趣的可以参考张鑫旭的这篇文章:小tip: 如何让contenteditable元素只能输入纯文本[1]。

这样可以自适应内容宽度了。

二、输入框占位提示

由于输入框已经从 input 换成了普通的 div 标签,并没有 placeholder 特性。不过,我们仍然可以通过其他 CSS 特性来实现占位效果,当输入框没有内容时,就可以匹配到 :empty选择器,然后通过伪元素::before动态生成 placeholder 内容,具体实现如下:

.tags-input:empty::before{
    content: attr(placeholder);
    color: #828282;
}

效果如下:

这样就几乎和 input 的占位效果一致了。

另外还有一种情况,如果需要仅在没有任何标签的情况下才显示占位,如何实现呢?可以想想,在没有任何标签的情况下,HTML 就变成了这样:

<div class="tags-content">
  <div class="tags-input" placeholder="添加标签"></div>
</div>

这种情况,就仅剩输入框唯一元素了,唯一元素可以通过:only-child来匹配,所以实现如下:

.tags-input:only-child:empty::before{
    content: attr(placeholder);
    color: #828282;
}

这样添加一个伪类就解决了。

两种需求都符合认知,看设计如何决定了。

三、标签的输入与删除

要实现标签的输入与删除就需要 js 出马了,只需要监听键盘的“回车”和“退格”两个键值。需要注意的是,默认情况下,普通 contenteditable元素在回车时,会出现换行,如下:

因此,在监听键盘事件时需要阻止默认事件,然后动态创建标签元素,通过 before添加到输入框前面,具体实现如下:

// TagInput是输入框
TagInput.addEventListener('keydown', function(ev) {
  if (ev.key === 'Enter') {
    ev.preventDefault()
    if (this.innerText) { // 输入框内容通过 innerText 获取
      const tag = document.createElement('TAG');
      tag.innerHTML = this.innerText + '<a class="kalos-tag-close"></a>';
      this.before(tag);
      this.innerText = '';
    }
  }
})

这样就能正常创建标签了。

然后是标签的删除。

这里有两种途径,首先看键盘的删除,具体逻辑是当输入框内容为空时删除标签,很简单,删除的标签就是输入框的前面一个元素,通过previousElementSibling获取,具体实现如下:

TagInput.addEventListener('keydown', function(ev) {
  if (ev.key === 'Backspace' && !this.innerText) {
    this.previousElementSibling?.remove(); // 需要判断前一个元素是否存在
  }
})

然后是点击删除图标的删除。由于标签是动态生成的,所以这里需要用事件委托的方式来添加删除事件。

// TaGContent是父级容器
TagContent.addEventListener('click', function(ev) {
  if (ev.target.className === 'tag-close') {
    ev.target.parentnode.remove();
  }
  TagInput.focus(); //点击任意地方输入框都需要聚焦
})

这样就实现了文章开头的所示效果:

四、选择框架还是原生

总结一下!

整体实现并不算复杂,不少交互逻辑 CSS 也可以轻松实现,JS 也就 10 来行代码,这里总结一下实现要点:

  • 普通 div 元素输入纯文本可以使用 -webkit-user-modify: read-write-plaintext-only
  • 普通 div 元素输入可以自适应内容宽度
  • 普通 div 元素输入框的 placeholder 占位可以通过 :empty 结合伪元素实现
  • 回车事件需要阻止默认事件,不然会换行
  • 在一个元素的前面新增元素可以用 before 方法
  • 删除一个元素的前面一个元素,可以用 previousElementSibling.remove 方法
  • 给动态生成的元素绑定事件可以用事件委托的方式

在各种框架大行其道的氛围下,有些原生的属性和方法可能都不太关注了,这也不失为是一种损失。当然,我本身也是各种框架都会用,特别是大型、复杂的交互页面,一般比较小的交互,比如文章这个例子,在 ant design 中有相关的组件,也使用过,因为整体 UI 全是这种风格,设计也是按照这个设计的。后来需要单独开发一个 chrome 插件,也用到了这样一个交互,但是仅仅用了这样一个组件,引入整个框架就过于累赘了,所以还是选择直接原生实现,简单方便。

以上就是基于原生CSS+JS实现一个标签输入框的详细内容,更多关于JS标签输入框的资料请关注编程网其它相关文章!

--结束END--

本文标题: 基于原生CSS+JS实现一个标签输入框

本文链接: https://lsjlt.com/news/145291.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 基于原生CSS+JS实现一个标签输入框
    目录一、自适应输入框布局二、输入框占位提示三、标签的输入与删除四、选择框架还是原生最近在项目中需要做一个标签输入框,还挺实用的,演示效果如下: 主要交互要求是这样的: 点击输入框可...
    99+
    2024-04-02
  • 基于原生CSS+JS怎么实现一个标签输入框
    这篇“基于原生CSS+JS怎么实现一个标签输入框”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于原生CSS+JS怎么实现一...
    99+
    2023-06-29
  • vue实现input框禁止输入标签
    目录vue input框禁止输入标签vue input框的禁用和可输入vue input框禁止输入标签 <input type="search" placeholder="请输...
    99+
    2024-04-02
  • vue怎么实现input框禁止输入标签
    这篇“vue怎么实现input框禁止输入标签”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue怎么实现input框禁止输入...
    99+
    2023-06-29
  • vue输入框怎么实现输完后光标自动跳到下一个输入框中
    本篇内容主要讲解“vue输入框怎么实现输完后光标自动跳到下一个输入框中”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue输入框怎么实现输完后光标自动跳到下一个输入框中”吧!实现思路首先我们需要...
    99+
    2023-07-05
  • 原生JS如何实现不断变化的标签
    这篇文章主要介绍原生JS如何实现不断变化的标签,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!下图为代码效果 HTML:<!DOCTYPE html> ...
    99+
    2024-04-02
  • JavaScript实现一个输入框组件
    本文实例为大家分享了手动实现一个输入框组件的具体代码,供大家参考,具体内容如下 背景 taro h5中想要实现一个样式如下的输入框: 问题: taro组件和taro-ui组件中都没...
    99+
    2024-04-02
  • 基于原生JS怎么实现分页效果
    这篇文章主要介绍“基于原生JS怎么实现分页效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于原生JS怎么实现分页效果”文章能帮助大家解决问题。实现之后的效果首先需要初始化该对象的一些基本属性,显...
    99+
    2023-06-30
  • 如何利用原生JS实时监听input框输入值
    目录原生JS实时监听input框输入值原生JS input[type=range] 监听值变化总结原生JS实时监听input框输入值 原生JS中可以使用oninput,onprope...
    99+
    2023-01-11
    原生JS实时监听 监听input框输入值 JS监听input框输入值
  • vue输入框中输完后光标自动跳到下一个输入框中的实现方法
    目录前言实现思路完整源码实现效果总结前言 最近接到这么一个需求,做一个安全码的输入框,限制为6位数,但是每一个写入的值都是一个输入框,共计6个输入框,当前输入框写入值后,光标自动跳到...
    99+
    2023-03-07
    按下回车键跳到下个输入框 vue输入框跳到下个
  • 基于JS实现一个小型编译器
    目录前言ParseTransformTraversal(遍历)Visitors(访问)Code generate代码实现词法分析器(tokenizer)语法分析器(parser)遍历...
    99+
    2024-04-02
  • jQuery如何实现IE输入框完成placeholder标签功能
    这篇文章主要介绍了jQuery如何实现IE输入框完成placeholder标签功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如果在输入框...
    99+
    2024-04-02
  • CSS改变输入框光标颜色的原生属性caret-color怎么用
    这篇文章主要介绍了CSS改变输入框光标颜色的原生属性caret-color怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、CSS改变...
    99+
    2024-04-02
  • 基于JS实现一个简单的投票demo
    目录演示说明源码body设置js实现投票的动画css设定演示 说明 今天没有什么好的内容分享,跟大家讲一个标签吧增长姿势。 line-height CSS 属性用于设置多行元素的空...
    99+
    2024-04-02
  • Element基于el-input数字范围输入框的实现
    数字范围组件 在做筛选时可能会出现数字范围的筛选,例如:价格、面积,但是elementUI本身没有自带的数字范围组件,于是进行了简单的封装,不足可自行进行优化 满足功能: 最小值与...
    99+
    2023-05-18
    Element el-input输入框 Element 数字输入框
  • 基于原生JS实现分页效果的示例代码
    这个只是一个分页的demo,主要是思路整理(很久之前项目用的东西) 分页实现的效果 主要是 左侧上一页 右侧是下一页 中间显示主要是超过5个显示 省略号 然后是可配置选项 实现之后的...
    99+
    2024-04-02
  • 基于JS怎么实现一个小型编译器
    这篇文章主要讲解了“基于JS怎么实现一个小型编译器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于JS怎么实现一个小型编译器”吧!前言the-super-tiny-compiler&nbs...
    99+
    2023-06-30
  • 原生js实现一个放大镜效果超详细
    目录前言:一、放大镜效果二、实现步骤1. 首先分析放大镜结构2. 整体样式---css部分3. JS操作dom实现放大镜总结前言: 学习js之初,写过js放大镜,但是当时模模糊糊,似...
    99+
    2024-04-02
  • 基于JS实现Android,iOS一个手势动画效果
    废话不多说了,先给大家展示下效果图: 这是iOS下的效果,android下完全一致。通过do_GestureView组件和do_Animation组件,deviceone能很...
    99+
    2022-06-06
    js 手势 动画 IOS Android
  • 如何使用HTML和CSS实现一个导航标签布局
    导航标签布局在网页设计中非常常见,它可以让用户快速找到所需要的页面,并提高网站的导航友好度。下面将详细介绍如何使用HTML和CSS实现一个导航标签布局,并附上具体的代码示例。编写HTML结构首先,需要定义导航标签的HTML结构。可以使用无序...
    99+
    2023-10-21
    CSS html 导航标签
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作