繁体   English   中英

聚焦时将 class 添加到输入,未聚焦时将其移除

[英]Add class to an input when its focused, and remove it when isnt focused

我正在尝试将 class ".contact__form-input--focused" 添加到从表单聚焦的输入中。

我正在尝试为每个输入添加一个事件侦听器,然后如果它具有 class 已经从类列表中删除该 class 。

 //INPUT ANIMATION const input = document.querySelectorAll("contact__form-input"); function addClass(input) { input.classList.add("contact__form-input--focused"); } function removeClass(input) { input.classList.remove("contact__form-input--focused"); } for (let i = 0; i < input.length; i++) { if (item[i].classList.contains("contact__form-input--focused")) { item.addEventListener("focus", addClass(input[i])); } else { item.addEventListener("blur", removeClass(input[i])); } }
 .contact__form { display: flex; flex-direction: column; }.contact__form-input { border: none; border-bottom: .1rem solid rgba(0, 0, 0, .12); font-size: var(--medium-font-size); margin: 0; padding: 4px 0; width: 100%; background: 0 0; text-align: left; color: inherit; }.contact__form-input--focused { /*some animations here*/ }
 <form class="contact__form" method="POST"> <label class="contact__form-label"> <span>Name</span> <input class="contact__form-input" name="Name" type="text" autocomplete="name" required> </label> <label class="contact__form-label"> <span>Phone number</span> <input class="contact__form-input" name="Phone number" type="tel" autocomplete="tel" required> </label> <label class="contact__form-label"> <span>Message</span> <input class="contact__form-input" type="text" required> </label> <button class="contact__form-button">Send</button> </form>

您不需要if语句。 只需将两个事件侦听器添加到所有输入。

addEventListener()的第二个参数必须是 function。 您是在立即调用 function,而不是在事件发生时。

 //INPUT ANIMATION const input = document.querySelectorAll(".contact__form-input"); function addClass(input) { input.classList.add("contact__form-input--focused"); } function removeClass(input) { input.classList.remove("contact__form-input--focused"); } for (let i = 0; i < input.length; i++) { let item = input[i]; item.addEventListener("focus", () => addClass(item)); item.addEventListener("blur", () => removeClass(item)); }
 .contact__form { display: flex; flex-direction: column; }.contact__form-input { border: none; border-bottom: .1rem solid rgba(0, 0, 0, .12); font-size: var(--medium-font-size); margin: 0; padding: 4px 0; width: 100%; background: 0 0; text-align: left; color: inherit; }.contact__form-input--focused { background-color: yellow; }
 <form class="contact__form" method="POST"> <label class="contact__form-label"> <span>Name</span> <input class="contact__form-input" name="Name" type="text" autocomplete="name" required> </label> <label class="contact__form-label"> <span>Phone number</span> <input class="contact__form-input" name="Phone number" type="tel" autocomplete="tel" required> </label> <label class="contact__form-label"> <span>Message</span> <input class="contact__form-input" type="text" required> </label> <button class="contact__form-button">Send</button> </form>

1)您没有得到 HTML 元素,因为contact__form-input是 class 并且您必须告诉querySelectorAll您正在寻找 class 为contact__form-input所有元素. 在类名之前

const inputs = document.querySelectorAll( ".contact__form-input" );

2)您应该在focusblur上添加eventListener为:

inputs.forEach(input => {
  input.addEventListener("focus", () => addClass(input))
  input.addEventListener("blur", () => removeClass(input))
})

NOTE: For demo purpose I've added thick red border

 //INPUT ANIMATION const inputs = document.querySelectorAll(".contact__form-input"); function addClass(input) { input.classList.add("contact__form-input--focused"); } function removeClass(input) { input.classList.remove("contact__form-input--focused"); } console.log(inputs) inputs.forEach(input => { input.addEventListener("focus", () => addClass(input)) input.addEventListener("blur", () => removeClass(input)) })
 .contact__form { display: flex; flex-direction: column; }.contact__form-input { border: none; border-bottom: .1rem solid rgba(0, 0, 0, .12); font-size: var(--medium-font-size); margin: 0; padding: 4px 0; width: 100%; background: 0 0; text-align: left; color: inherit; }.contact__form-input--focused { /*some animations here*/ border: 5px solid red; }
 <form class="contact__form" method="POST"> <label class="contact__form-label"> <span>Name</span> <input class="contact__form-input" name="Name" type="text" autocomplete="name" required> </label> <label class="contact__form-label"> <span>Phone number</span> <input class="contact__form-input" name="Phone number" type="tel" autocomplete="tel" required> </label> <label class="contact__form-label"> <span>Message</span> <input class="contact__form-input" type="text" required> </label> <button class="contact__form-button">Send</button> </form>

如果您像这样使用 JS 而不仅仅是:focused的伪类,您可以通过

const inputs = document.querySelectorAll("contact__form-input");
inputs.forEach(input => {
    input.addEventListener("focus", function(){
        this.classList.add("contact__form-input--focused");
    });
    input.addEventListener("blur", function(){
        this.classList.remove("contact__form-input--focused");
    });
});

或者如果你想切换课程

const inputs = document.querySelectorAll("contact__form-input");
function switchInputClasses(){
    this.classList.toggle("contact__form-input");
    this.classList.toggle("contact__form-input--focused");
}
inputs.forEach(input => {
    input.addEventListener("focus", switchInputClasses);
    input.addEventListener("blur", switchInputClasses);
});
<style type="text/css">
    .contact__form {
        display: flex;
        flex-direction: column;
    }
    .contact__form-input {
        border: none;
        border-bottom: .1rem solid rgba(0, 0, 0, .12);
        font-size: var(--medium-font-size);
        margin: 0;
        padding: 4px 0;
        width: 100%;
        background: 0 0;
        text-align: left;
        color: inherit;
    }

    .contact__form-input--focused {
        /*some animations here*/
    }
</style>

<form class="contact__form" method="POST">
    <label class="contact__form-label">
        <span>Name</span>
        <input class="contact__form-input" name="Name" type="text" autocomplete="name">
    </label>
    <label class="contact__form-label">
        <span>Phone number</span>
        <input class="contact__form-input" name="Phone" type="tel" autocomplete="tel" required>
    </label>
    <label class="contact__form-label">
        <span>Message</span>
        <input class="contact__form-input" name="Text" type="Text" required>
    </label>
    <button class="contact__form-button">Send</button>
</form>

<script>
    const inputName = document.querySelector("input[name=Name]");
    const inputPhone = document.querySelector("input[name=Phone]");
    const inputText = document.querySelector("input[name=Text]");
    inputName.addEventListener("focus", function() {
        if(inputName.classList.contains("contact__form-input--focused"))
            inputName.classList.remove("contact__form-input--focused");
        else
            inputName.classList.add("contact__form-input--focused");
    });
    inputPhone.addEventListener("focus", function() {
        if(inputPhone.classList.contains("contact__form-input--focused"))
            inputPhone.classList.remove("contact__form-input--focused");
        else
            inputPhone.classList.add("contact__form-input--focused");
    });
    inputText.addEventListener("focus", function() {
        if(inputText.classList.contains("contact__form-input--focused"))
            inputText.classList.remove("contact__form-input--focused");
        else
            inputText.classList.add("contact__form-input--focused");
    });
</script>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM