slideToggle()jQuery期间的异常填充/边距

时间:2019-04-15 15:58:38

标签: javascript jquery html css

slideToggle()会在过渡期间更改填充或边距,而不是使其恢复正常吗?因为我试图切换两种形式,一种用于登录,一种用于静态html页面的注册,但是在过渡期间,在表单和其他内容(准确地说是文本)之间创建了诸如上边距之类的东西重新调整为应有的大小。

第一个屏幕具有静态页面,没有过渡,后者在过渡期间:https://imgur.com/a/R5pppq5 这是代码,我正在使用实时服务器插件在Atom上编程:

// Example starter JavaScript for disabling form submissions if there are invalid fields

var index_toggle = new Boolean(true);

$(document).ready(function() {
  $("#toggle_home").click(function() {
    $("#login").slideToggle("slow");
    $("#register").slideToggle("slow");
    $("#toggle_home_txt").fadeOut(function() {
      if (index_toggle) {
        $(this).html("↧ LOGIN").fadeIn();
      } else {
        $(this).html("↥ REGISTER").fadeIn();
      }
      index_toggle = !index_toggle;
    });


  });
});
#register {
  display: none;
}

body.index {
  display: -ms-flexbox;
  display: flex;
  -ms-flex-align: center;
  align-items: center;
  padding-top: 80px;
  padding-bottom: 40px;
  background-color: white;
  color: #6c757d;
}

div.index {
  padding-top: 40px;
  padding-bottom: 0px;
  border-radius: 3%;
  width: 500px;
}

button {
  border-radius: 20%;
  padding-bottom: 10%;
  padding-top: 0;
  background-color: #e9ecef;
  border-color: #6c757d;
  border-style: solid;
  color: #6c757d;
  transition: 0.3s ease;
}

button:focus {
  outline: none;
}

#send_butt {
  width: 40px;
  height: 40px;
}

button:hover {
  background-color: #6c757d;
  color: white;
}

button.toggle_home {
  top: 0px;
  padding-bottom: 2%;
  transform: translate(0, -100%);
}

img.index {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  position: absolute;
  left: 50%;
  transform: translate(-50%, -100%);
  background-color: #e9ecef;
  border-color: white;
  border-style: solid;
}

.form-signin {
  width: 450px;
  padding: 15px;
  margin: auto;
}
<link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<body class="text-center index">
  <div class="jumbotron index form-signin">
    <img src="images/user_index.png" class="index" />
    <p id="index_text" class="my-3">Please fill this form to create an account.</p>



    <form id="login" novalidate>
      <hr>

      <div class="form-row">
        <!-- Username input -->
        <div class="col-md-12 mb-3">
          <div class="input-group">
            <div class="input-group-prepend">
              <span class="input-group-text"> &rsaquo;</span>
            </div>
            <input type="text" class="form-control" id="LoginUsername" placeholder="Username" required>
          </div>
        </div>
      </div>

      <!-- Password input -->

      <div class="form-row">
        <input type="password" class="col-md-6 mb-3 form-control" id="LoginPassword" placeholder="Password" required>

        <div class="text-right col-md-6 mb-3 form-check">
          <input class="form-check-input" type="checkbox" id="LoginRemember">
          <label class="form-check-label" for="LoginRemember">Remember me?</label>
        </div>
      </div>
    </form>

    <div id="div_toggle">
      <hr>
      <div class="toggle_home" style="float:left;">
        <button id="toggle_home" class="toggle_home">
              <div id="toggle_home_txt">
                &#8613; REGISTER
              </div>
            </button>
      </div>
    </div>

    <form id="register" class="form-signin mt-5" novalidate>

      <div class="form-row">
        <div class="col mb-3">
          <input type="text" class="form-control" id="RegName" placeholder="First name" required>
        </div>
        <div class="col-md-6 mb-3">
          <input type="text" class="form-control" id="RegSurname" placeholder="Surname" required>
        </div>
      </div>
      <div class="form-row">
        <div class="col-md-12 mb-3">
          <div class="input-group">
            <div class="input-group-prepend">
              <span class="input-group-text"> &rsaquo;</span>
            </div>
            <input type="text" class="form-control" id="RegUsername" placeholder="Username" required>
          </div>
        </div>
      </div>
      <div class="form-row">
        <div class="col-md-6 mb-3">
          <input type="password" class="form-control" id="RegPassword" placeholder="Password" required>
        </div>
        <div class="col-md-6 mb-3">
          <input type="password" class="form-control" id="RegConfirmPassword" placeholder="Confirm Password" required>
        </div>
      </div>
      <hr/>
    </form>
    <div style="float:right;">
      <button id="send_butt" class="mb-2">&#8250;</button>
    </div>
  </div>
</body>

1 个答案:

答案 0 :(得分:0)

我相信差距的不断变化是margin collapse的结果。

  

父母和第一个/最后一个孩子
  如果没有边框,内边距,内联部分,创建的块格式上下文或 clearance 来将块的边距顶部与其第一个子块的边距顶部分开...那么这些边距坍方。折叠后的边距最终出现在父级之外。

在页面加载时,p.index_text<hr>form#login之间的边距折叠。 jQuery启动slideDown()时,它将overflow:hidden添加到滑动元素#form#login中。这会在<p><hr>之间产生“间隙”,并且页边距停止塌陷。从视觉上看,这两个元素之间的差距越来越大。

various methods可以防止边距崩溃。我选择了padding,因为另一种形式已经有:

#login {
  padding:15px;
}

工作示例:

// Example starter JavaScript for disabling form submissions if there are invalid fields

var index_toggle = new Boolean(true);

$(document).ready(function() {
  $("#toggle_home").click(function() {
    $("#login").slideToggle("slow");
    $("#register").slideToggle("slow");
    $("#toggle_home_txt").fadeOut(function() {
      if (index_toggle) {
        $(this).html("&#8615; LOGIN").fadeIn();
      } else {
        $(this).html("&#8613; REGISTER").fadeIn();
      }
      index_toggle = !index_toggle;
    });


  });
});
#register {
  display: none;
}

body.index {
  display: -ms-flexbox;
  display: flex;
  -ms-flex-align: center;
  align-items: center;
  padding-top: 80px;
  padding-bottom: 40px;
  background-color: white;
  color: #6c757d;
}

div.index {
  padding-top: 40px;
  padding-bottom: 0px;
  border-radius: 3%;
  width: 500px;
}

button {
  border-radius: 20%;
  background-color: #e9ecef;
  border-color: #6c757d;
  border-style: solid;
  color: #6c757d;
  transition: 0.3s ease;
}

button:focus {
  outline: none;
}

#send_butt {
  width: 40px;
  height: 40px;
}

button:hover {
  background-color: #6c757d;
  color: white;
}

img.index {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  position: absolute;
  left: 50%;
  transform: translate(-50%, -100%);
  background-color: #e9ecef;
  border-color: white;
  border-style: solid;
}

.form-signin {
  width: 450px;
  padding: 15px;
  margin: auto;
}

#login {
  padding:15px;
}

hr,
#register {
  margin: 0 !important;
}

#div_toggle {
  display: flex;
  align-items: center;
}
#div_toggle:after {
  content: "";
  flex: 1 0 auto;
  border-top: 1px solid #CCC;
}
<link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<body class="text-center index">
  <div class="jumbotron index form-signin">
    <img src="images/user_index.png" class="index" />
    <p id="index_text" class="my-3">Please fill this form to create an account.</p>



    <form id="login" novalidate>
      <hr>

      <div class="form-row">
        <!-- Username input -->
        <div class="col-md-12 mb-3">
          <div class="input-group">
            <div class="input-group-prepend">
              <span class="input-group-text"> &rsaquo;</span>
            </div>
            <input type="text" class="form-control" id="LoginUsername" placeholder="Username" required>
          </div>
        </div>
      </div>

      <!-- Password input -->

      <div class="form-row">
        <input type="password" class="col-md-6 mb-3 form-control" id="LoginPassword" placeholder="Password" required>

        <div class="text-right col-md-6 mb-3 form-check">
          <input class="form-check-input" type="checkbox" id="LoginRemember">
          <label class="form-check-label" for="LoginRemember">Remember me?</label>
        </div>
      </div>
    </form>

    <div id="div_toggle">
      <button id="toggle_home" class="toggle_home">
              <div id="toggle_home_txt">
                &#8613; REGISTER
              </div>
            </button>
    </div>

    <form id="register" class="form-signin mt-5" novalidate>

      <div class="form-row">
        <div class="col mb-3">
          <input type="text" class="form-control" id="RegName" placeholder="First name" required>
        </div>
        <div class="col-md-6 mb-3">
          <input type="text" class="form-control" id="RegSurname" placeholder="Surname" required>
        </div>
      </div>
      <div class="form-row">
        <div class="col-md-12 mb-3">
          <div class="input-group">
            <div class="input-group-prepend">
              <span class="input-group-text"> &rsaquo;</span>
            </div>
            <input type="text" class="form-control" id="RegUsername" placeholder="Username" required>
          </div>
        </div>
      </div>
      <div class="form-row">
        <div class="col-md-6 mb-3">
          <input type="password" class="form-control" id="RegPassword" placeholder="Password" required>
        </div>
        <div class="col-md-6 mb-3">
          <input type="password" class="form-control" id="RegConfirmPassword" placeholder="Confirm Password" required>
        </div>
      </div>
      <hr/>
    </form>
    <div style="float:right;">
      <button id="send_butt" class="mb-2">&#8250;</button>
    </div>
  </div>
</body>

动画似乎也跳到最后,但这可能是一个单独的问题。


编辑

进一步的跳跃似乎是由第二种形式的边距引起的,因此我将其删除。翻译的按钮似乎也引起了问题,因此我重新构建了它。上面的代码已进行相应的编辑。