首页 > 解决方案 > 聚焦文本框时表单元素波动

问题描述

我正在尝试实现输入框的具体化样式,即当单击文本框时,标签会向上移动并通过动画减小其字体大小。

我能够实现它,但是发生的事情是,当我单击输入框时,标签向上移动,同时发生波动,例如表单元素向上移动 2px。

我该如何解决这个问题?这是我当前的代码:

$(document).ready(function(){
        $("input").focus(function(){
            $(this).parent().find("label").addClass('active_text_field');
        });

        $("input").focusout(function(){
            if ($(this).val() == '') {
                $(this).parent().find("label").removeClass('active_text_field');
            };
        }); 
})
.contact_form{  
    position: absolute;
    display: block;
    top:0;
    bottom: 0;
    left: 0;
    right: 0;
    margin: auto;
    width: 50%;
    height:500px;
}

.form-item label{
    display: block;
    font-size: 18px;
    font-family: roboto;
    position: relative;
    top: 30px;
    -moz-transition: all ease-in-out 200ms;
    -webkit-transition: all ease-in-out 200ms;
    transition: all ease-in-out 200ms;
}

.form-item input{
    width:100%;
    outline:none;
    height:36px;
    border:none;
    border-bottom: solid black 1px;
}

.active_text_field{
    transform: translateY(-30px);        
    -moz-transition: all ease-in-out 200ms;
    -webkit-transition: all ease-in-out 200ms;
    transition: all ease-in-out 200ms;
    font-size: 16px !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="contact_form">
    <form>
        <div class="form-item">
            <label for="firstName">
                First Name
            </label>
            <input type="text" name="firstName" class="text-field">
        </div>

        <div class="form-item">
            <label for="lastName">
                Last Name
            </label>
            <input type="text" name="lastName" class="text-field">
        </div>

        <div class="form-item">
            <label for="email">
                Email
            </label>
            <input type="text" name="email" class="text-field">
        </div>

        <div class="form-item">
            <label for="confirmEmail">
                Confirm Email
            </label>
            <input type="text" name="confirmEmail" class="text-field">
        </div>
    </form>
</div>

标签: javascriptjqueryhtmlcss

解决方案


您可以通过使标签相对于父容器绝对定位(父定位相对)来避免波动。您无需更改 html/js,只需简单更新 css 即可解决此问题。

为了更好地理解,我还创建了一个 JsFiddle,链接:[ https://jsfiddle.net/axesvL1q/1/][1]

.contact_form {
      position: relative;
      display: block;
      margin: auto;
      width: 50%;
      height: 500px;
    }

    .form-item label {
      display: block;
      font-size: 18px;
      font-family: roboto;
      position: absolute;
      left: 0;
      top: 0;
      -moz-transition: all ease-in-out 200ms;
      -webkit-transition: all ease-in-out 200ms;
      transition: all ease-in-out 200ms;
    }

    .form-item {
      position: relative;
      margin: 30px 0;
    }

    .form-item input {
      width: 100%;
      outline: none;
      height: 36px;
      border: none;
      border-bottom: solid black 1px;
    }

    .active_text_field {
      transform: translateY(-20px);
      -moz-transition: all ease-in-out 200ms;
      -webkit-transition: all ease-in-out 200ms;
      transition: all ease-in-out 200ms;
      font-size: 16px !important;
    }

推荐阅读