如何使用普通的HTML和CSS建立一个带有浮动标签和过渡的注册表格

450 阅读7分钟

在本教程中,我们将使用普通的HTML和CSS建立一个具有浮动标签和平滑过渡的现代注册表。

A视图

正如你在上图中看到的,当表单中的一个输入获得焦点时,它的标签就会浮到顶部,并且在输入周围出现一个半厚的边框。如果文本被输入到输入框中,而输入框失去了焦点,标签就会保持在顶部。否则,标签就会回落到输入框中。

许多现代窗体都有某种应用于它们的过渡。这些过渡不仅使表单更有活力,而且还有助于引导用户了解输入的状态(即它是否有焦点),以及每个输入应该处理什么样的数据。

在本教程中,你将了解到一些很酷的CSS特性,如过渡、选择器(如:placeholder_focus )以及其他许多你应该知道的CSS属性。

让我们开始学习吧!

HTML标记

我们将为我们的注册表单定义标记。但在此之前,我们必须设置我们的HTML模板,并从head 标签正确链接到我们的样式表。你可以通过Emmet插件,在你的IDE/代码编辑器中输入! ,然后输入tab,就可以轻松做到这一点。

你也可以复制这个模板并将其粘贴到你的index.html 文件中:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>

</body>
</html>

在body标签中,我们为我们的注册表格定义标记:

<div class="signupFrm">
    <form action="" class="form">
      <h1 class="title">Sign up</h1>

      <div class="inputContainer">
        <input type="text" class="input" placeholder="a">
        <label for="" class="label">Email</label>
      </div>

      <div class="inputContainer">
        <input type="text" class="input" placeholder="a">
        <label for="" class="label">Username</label>
      </div>

      <div class="inputContainer">
        <input type="text" class="input" placeholder="a">
        <label for="" class="label">Password</label>
      </div>

      <div class="inputContainer">
        <input type="text" class="input" placeholder="a">
        <label for="" class="label">Confirm Password</label>
      </div>

      <input type="submit" class="submitBtn" value="Sign up">
    </form>
  </div>

我们创建一个容器div ,以容纳表单元素。表单的每一个输入,以及它的文本标签,都被包裹在一个容器div内。标签的作用是告诉用户每个输入应该输入什么信息。

我们的页面将看起来像这样:

四个输入和四个标签的HTML表单

你可能会注意到,我们给所有输入的占位符值都是 "a"。在本教程的后面,当我们开始应用一些动态逻辑时,这将很有帮助。

如何设计表单的样式

我们的表单是非常基本的,所以让我们添加一些样式来使它看起来更漂亮。

首先,我们需要执行一些重设并设置背景色:

@import url('https://fonts.googleapis.com/css2?family=Lato&display=swap');

/* Get rid of all default margins/paddings. Set typeface */
body {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  background-color: white;
  font-family: "lato", sans-serif;
}

设置基本样式

下面是我们的页面的样子:

还没有任何样式设计

在为body ,我们将设置内容的显示模式为flex 。这将确保容器元素div 内的所有直接子元素都默认为并排显示。

在我们的例子中,容器内只有一个子元素signupFrm 。我们在这里使用display: flex 的唯一原因是使用align-itemsjustify-content 属性来帮助所有内容在垂直和水平方向上居中:

/* Puts the form in the center both horizontally and vertically. Sets its height to 100% of the viewport's height */

.signupFrm {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

设计表单容器的样式

vh 属性,代表视口高度,确保表单占据浏览器窗口100%的高度,而不管屏幕大小或方向如何。这将使它更具有响应性。

我们的窗体现在已经居中对齐了

现在我们将对表单进行一些样式设计:

.form {
  background-color: white;
  width: 400px;
  border-radius: 8px;
  padding: 20px 40px;
  box-shadow: 0 10px 25px rgba(92, 99, 105, .2);
}

.title {
  font-size: 50px;
  margin-bottom: 50px;
}

在针对表单的第一个样式中,我们将背景设置为白色,给它一个400px的宽度,在表单周围添加一些曲线,最后我们在盒子周围设置一个阴影。我们还设置了标题的字体大小和元素下面的一些空间。

结果应该是这样的:

表单现在是在一个卡片里面,有一个盒子的阴影

接下来,我们将为包含表单输入和表单标签的div:

.inputContainer {
  position: relative;
  height: 45px;
  width: 90%;
  margin-bottom: 17px;
}

我们把输入的容器div 的位置属性设置为相对。这将使我们能够以我们想要的方式定位子节点inputlabel 。我们还设置了宽度,使其占整个容器宽度的90%。

这就是我们的表单在网络浏览器中的呈现方式:

看起来更好

现在我们需要对我们的输入进行样式设计。

我们首先将position 设置为absolute 。这将使我们能够将每个人移到相对定位的容器父体的左上角部分。

我们还需要隐藏我们的任意占位符文本(前面提到的 "a "字符),这样它们就不会与每个标签内的文本重叠了。当我们实现过渡时,将需要这些占位符文本:

/* Style the inputs */

.input {
  position: absolute;
  top: 0px;
  left: 0px;
  height: 100%;
  width: 100%;
  border: 1px solid #DADCE0;
  border-radius: 7px;
  font-size: 16px;
  padding: 0 20px;
  outline: none;
  background: none;
  z-index: 1;
}

/* Hide the placeholder texts (a) */

::placeholder {
  color: transparent;
}

应用这些样式后,我们的表单现在应该是这样的:

占位符 "a "已不再可见

接下来,我们为文本标签设置样式:

/* Styling text labels */

.label {
  position: absolute;
  top: 15px;
  left: 15px;
  padding: 0 4px;
  background-color: white;
  color: #DADCE0;
  font-size: 16px;
  transition: 0.5s;
  z-index: 0;
}

标签显示文本,告诉人们哪些信息应该在输入框内。我们首先把它的位置设置为绝对值。而通过设置topleft 属性,我们可以将文本相对于其容器向上移动。

接下来我们设置一个0.5秒的过渡。这是文本在悬停时向上移动所需的时间。

最后,我们还设置了一个0的Z-index。这个低的Z-index可以确保标签被定位在其他 "位置较高 "的元素后面,如果它们有重叠的话。

下面是在页面上呈现的内容:

结果

现在我们要把重点放在按钮上。

我们将用CSStransform 属性添加一些平滑的动画,它可以将按钮向上移动一点,并在它被悬停时改变颜色:

.submitBtn {
  display: block;
  margin-left: auto;
  padding: 15px 30px;
  border: none;
  background-color: purple;
  color: white;
  border-radius: 6px;
  cursor: pointer;
  font-size: 16px;
  margin-top: 30px;
}

.submitBtn:hover {
  background-color: #9867C5;
  transform: translateY(-2px);
}

下面是结果:

按钮放大并在被悬停时改变颜色

接下来,我们需要执行一些状态变化。

当一个输入获得焦点时,我们要把它的标签定位到容器的顶部(-7px)以外,从左边3个像素开始,把字体大小减少到14,并把颜色改为紫色:

.input:focus + .label {
  top: -7px;
  left: 3px;
  z-index: 10;
  font-size: 14px;
  font-weight: 600;
  color: purple;
}

下面是结果:

当输入获得焦点时,标签会上升

我们还需要在输入获得焦点时在其周围添加一个紫色边框:

.input:focus {
  border: 2px solid purple;
}

添加紫色边框

最后,我们要做一件非常重要的事情。

目前,当你在表单中输入一些文本,并将焦点(鼠标)移开时,标签文本和输入的文本会发生碰撞:

标签和输入值之间的碰撞

通过下面的CSS,我们将指定,当我们在输入框中输入一个值并改变焦点时,我们希望标签保持浮动。另外,我们还指定要让标签文本失去其紫色的颜色:

.input:not(:placeholder-shown)+ .label {
  top: -7px;
  left: 3px;
  z-index: 10;
  font-size: 14px;
  font-weight: 600;
}

就这样,这就是我们的注册页面的最终外观:

最后的外观

总结

我希望你能从本教程中学到一些关于CSS的新知识。CSS转换为你的网站带来了活力,在本指南中,我们用它使我们的表格更加生动。

你可以从这个GitHub资源库中获得本教程的所有代码。

我最近创建了一个通讯,在那里我提供了关于学习Web开发的实用技巧和资源。订阅我的时事通讯 ,就可以在你的收件箱中获得提示。

谢谢你的关注。