Create Tag Input Box using HTML, CSS, and Javascript
Tags: html, css, javascript, incoder
Published: 2022-05-02 15:20:58

Hello friends, today in this blog you'll learn how to create a tag input box using HTML, CSS, and Javascript. In our previous blog, we saw [how to create an input with a character limit using HTML, CSS, and Javascript](https://incoderweb.blogspot.com/2022/05/input-character-limit-with-counter.html). Now it's time to create a tag input box. Earlier, I shared many projects related to [javascript](https://incoderweb.blogspot.com/search/label/Javascript), you can check if you want, and don't forget to check [HTML, CSS, and Javascript projects](https://incoderweb.blogspot.com/search/label/HTML%20CSS%20Javascript%20Mini%20Project).

A tags input is a user interface (UI) component that allows the user to add or insert multiple entries as tags into an input field. There is an input box as you can see in the image above, when you click on the input the border color changes. To add tags in the input, you just need to type something and hit ENTER button or SPACE button and the text will be converted into a tag.

##You may like these:

- [Responsive Personal Portfolio design](https://incoderweb.blogspot.com/2022/04/responsive-personal-portfolio-design.html)
- [Filterable Image Gallery with preview](https://incoderweb.blogspot.com/2022/03/filterable-image-gallery-with-preview.html)
- [Random Password Generator](https://incoderweb.blogspot.com/2022/04/random-password-generator.html)
- [Google Drive Link Converter](https://incoderweb.blogspot.com/2022/01/google-drive-link-converter.html)

If you want to remove the tag, so you can simply click on the close icon or you can simply press the BACKSPACE button the last tag will be removed. But if you want to remove all the tags so you can remove them by clicking the clear all button.

If you are unable to understand or felling difficulty understanding so you can check the preview of it [here](https://incoderweb.blogspot.com/2022/05/create-tag-input-box.html).

##HTML Code
```
<!-- --------------------- Created By InCoder --------------------- -->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title></title>
    <link rel="stylesheet" href="main.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css">
</head>

<body>
    <div class="container">
        <div class="wrapper">
            <div class="header">
                <i class="fa-solid fa-tags"></i>
                <h3>Tags</h3>
            </div>
            <div class="body">
                <p>Press enter or add comma after each tag.</p>
                <div class="input-form">
                    <ul>
                        <input type="text" placeholder="Add Tags">
                    </ul>
                </div>
            </div>
            <div class="footer">
                <button class="clearAll">Clear All</button>
            </div>
        </div>
    </div>

    <script src="script.js"></script>
</body>

</html>
```

##CSS Code
```
/* --------------------- Created By InCoder --------------------- */

@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap');

*{
    margin: 0;
    padding: 0;
    box-sizing: border-box;
    font-family: 'Poppins', sans-serif;
}

::selection{
    color: #fff;
    background-color: #fab759;
}

.container{
    display: flex;
    height: 100vh;
    align-items: center;
    justify-content: center;
    background: linear-gradient(216deg, #fab759, #ec9e3e);
}

.container .wrapper{
    width: 20rem;
    padding: 0 .2rem;
    background: #fff;
    border-radius: .5rem;
    color: rgb(0 0 0 / 90%);
}

.container .wrapper .header {
    display: flex;
    margin-top: .4rem;
    margin-left: .8rem;
    align-items: center;
    color: rgb(0 0 0 / 90%);
}

.container .wrapper .header i {
    margin-right: .2rem;
}

.container .wrapper .body p {
    font-size: .8rem;
    margin-left: .8rem;
}

.input-form ul {
    cursor: text;
    display: flex;
    flex-wrap: wrap;
    padding: 0 .4rem;
    align-items: center;
    margin: .4rem .4rem;
    border-radius: .4rem;
    transition: border .2s ease-in-out;
    border: 2px solid rgb(0 0 0 / 30%);
}

.input-form ul li {
    margin: .4rem .2rem;
    list-style: none;
    padding: .2rem .4rem;
    border-radius: .3rem;
    background: rgb(0 0 0 / 10%);
}

.input-form ul li i {
    cursor: pointer;
    border-radius: 50rem;
    padding: .2rem .3rem;
    color: rgb(0 0 0 / 50%);
}

.input-form ul li i:hover {
    background: rgb(0 0 0 / 10%);
}

.input-form ul.focus {
    border: 2px solid #ec9e3e;
}

.input-form ul input {
    flex: 1;
    height: 2rem;
    border: none;
    outline: none;
}

.clearAll{
    border: 0;
    float: right;
    color: #fff;
    cursor: pointer;
    font-size: .9rem;
    margin-top: .2rem;
    margin-right: 1rem;
    padding: .4rem 1rem;
    border-radius: .4rem;
    margin-bottom: .6rem;
    background: rgb(236 158 62 / 90%);
    transition: color .2s ease-in-out, background .2s ease-in-out;
}

.clearAll:hover {
    background: rgb(236 158 62 / 100%);
}

.clearAll:focus {
    outline-offset: 2px;
    background: rgb(236 158 62);
    outline: 2px solid rgb(236 158 62);
}
```

##Javascript Code
```
// --------------------- Created By InCoder ---------------------

let inputForm = document.querySelector('.input-form')
input = document.querySelector('.input-form input')
ul = document.querySelector('.input-form ul')

input.addEventListener('focus', () => {
    inputForm.querySelector('ul').classList.toggle('focus')
})

inputForm.addEventListener('click', () => {
    input.focus()
    inputForm.querySelector('ul').classList.add('focus')
})

document.addEventListener('click', (e) => {
    if (e.target != input) inputForm.querySelector('ul').classList.remove('focus')
})

let tags = []

const createNewTag = () => {
    ul.querySelectorAll("li").forEach(li => li.remove());
    tags.slice().reverse().forEach(tag => {
        let LI = `<li>${tag} <i class="fa-solid fa-times" onClick="removeTag(this, '${tag}')"></i></li>`
        ul.insertAdjacentHTML('afterbegin', LI)
    })
}

const addTag = (e) => {
    if (e.key == 'Enter' || e.keyCode == 32) {
        let tag = e.target.value.replace(/\s+/g, ' ')
        if (tag.length > 1 && !tags.includes(tag)) {
            tag.split(',').forEach(tag => {
                tags.push(tag)
                createNewTag()
            })
        }
        e.target.value = ''
    }

    if (e.target.value.length > 0) return
    if (e.key == 'Backspace') {
        tags = [...tags.slice(0, tags.length - 1)];
        ul.querySelectorAll("li").forEach(li => li.remove())
        createNewTag()
    }
}

const removeTag = (elem, tag) => {
    let index = tags.indexOf(tag);
    tags = [...tags.slice(0, index), ...tags.slice(index + 1)];
    elem.parentElement.remove();
}

input.addEventListener('keyup', (e) => addTag(e))

clearAll = document.querySelector('.clearAll')

clearAll.addEventListener('click', () => {
    tags = []
    createNewTag()
})
```