这段HTML和CSS代码实现了一个具有动态效果的登录表单,包含用户名和密码输入框、提交按钮和加载动画。
大家复制代码时,可能会因格式转换出现错乱,导致样式失效。建议先少量复制代码进行测试,若未能解决问题,私信回复源码两字,我会发送完整的压缩包给你。
演示效果
HTML&CSS
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>公众号关注:前端Hardy</title>
<style>
@import url("https://fonts.googleapis.com/css?family=Source+Sans+Pro:200,200i,300,300i,400,400i,600,600i,700,700i,900,900i|Monoton");
@import url("https://fonts.googleapis.com/icon?family=Material+Icons");
* {
box-sizing: border-box;
}
html {
font-size: 14px;
}
body {
background: linear-gradient(to bottom, #68d8d6, #ffffff);
color: #454749;
display: flex;
align-items: center;
justify-content: center;
font-family: "Source Sans Pro", sans-serif;
min-height: 100vh;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: Monoton, sans-serif;
margin-bottom: 0.5rem;
}
/**
* Tiles
*/
.tile {
background-color: #ffffff;
border-radius: 0.1rem;
box-shadow: 00.75rem1.5remrgba(0, 0, 0, 0.2), 00.25rem0.25remrgba(0, 0, 0, 0.2);
position: relative;
width: 100%;
min-width: 320px;
max-width: 24rem;
overflow: hidden;
}
.tile.tile-header {
background-image: url("https://res.cloudinary.com/dgmilxzy7/image/upload/c_scale,w_500,o_75,b_rgb:07beb8/v1506735375/CodePen/ViddenPixel.jpg");
background-position: center;
background-size: cover;
height: 12rem;
}
.tile.tile-body {
padding: 2rem;
}
/**
* Forms
*/
.form-input {
display: block;
position: relative;
margin-bottom: 1rem;
}
.form-input>.material-icons {
position: absolute;
font-size: 1.5rem;
top: 1.2rem;
}
.form-input>.material-icons~input,
.form-input>.material-icons~.label,
.form-input>.material-icons~.underline {
margin-left: 2.25rem;
width: calc(100% - 2.25rem);
}
.form-inputinput {
border: none;
box-shadow: none;
padding-top: 1.5rem;
padding-right: 0;
padding-bottom: 0.5rem;
padding-left: 0;
outline-style: none;
width: 100%;
}
.form-inputinput~.label {
color: #868e96;
font-size: 1rem;
margin: 0;
pointer-events: none;
position: absolute;
top: 1.5rem;
left: 0;
transition: top 0.2s, font 0.2s;
z-index: 1;
}
.form-inputinput~.underline {
background-color: #bdc1c5;
height: 1px;
width: 100%;
position: absolute;
bottom: 0;
left: 0;
}
.form-inputinput:hover~.underline,
.form-inputinput:focus~.underline {
background-color: #07beb8;
}
.form-inputinput:hover~.label,
.form-inputinput:focus~.label {
color: #07beb8;
}
.form-inputinput:focus~.underline {
height: 2px;
}
.form-inputinput:focus~.label,
.form-inputinput:valid~.label {
top: 0;
font-size: 0.85rem;
}
.form-inputinput:-webkit-autofill~.label {
top: 0;
font-size: 0.85rem;
}
.btn {
border-radius: 0.2rem;
display: inline-block;
padding-top: 0.5rem;
padding-right: 1rem;
padding-bottom: 0.5rem;
padding-left: 1rem;
}
.btn,
[role=button],
[type=button] {
-ms-touch-action: manipulation;
touch-action: manipulation;
cursor: pointer;
}
.btn-irenic {
background-color: #07beb8;
color: white;
}
.btn-irenic:hover,
.btn-irenic:focus,
.btn-irenic:active {
background-color: #06a5a0;
}
.btn-serene {
background-color: #3dccc7;
color: white;
}
.btn-serene:hover,
.btn-serene:focus,
.btn-serene:active {
background-color: #32beb9;
}
.btn-tranquil {
background-color: #68d8d6;
color: white;
}
.btn-tranquil:hover,
.btn-tranquil:focus,
.btn-tranquil:active {
background-color: #54d3d0;
}
.btn-calm {
background-color: #9ceaef;
color: white;
}
.btn-calm:hover,
.btn-calm:focus,
.btn-calm:active {
background-color: #86e5eb;
}
.btn-cool {
background-color: #c4fff9;
color: white;
}
.btn-cool:hover,
.btn-cool:focus,
.btn-cool:active {
background-color: #abfff6;
}
.btn-ice {
background-color: #ffffff;
color: white;
}
.btn-ice:hover,
.btn-ice:focus,
.btn-ice:active {
background-color: #f2f2f2;
}
.btn-base {
background-color: #454749;
color: white;
}
.btn-base:hover,
.btn-base:focus,
.btn-base:active {
background-color: #393a3c;
}
.clearfix:after {
content: "";
display: table;
clear: both;
}
.float-right {
float: right;
}
.submit-container {
position: relative;
}
.submit-container#submit {
position: relative;
z-index: 2;
outline: none;
opacity: 1;
transition: transform 0.1s ease-in, opacity 0.1s ease-in, border-radius 0.1s ease-in;
right: -1px;
}
.submit-container#submitspan {
opacity: 1;
transition: opacity 0.1s ease-in;
}
.submit-container#submit.pending {
transform: scale(0.55, 1.5);
background-color: #07beb8;
border-radius: 50%;
opacity: 1;
}
.submit-container#submit.pendingspan {
opacity: 0;
}
.submit-container#submit.pending~.login-pending {
opacity: 1;
transform: scale(1, 1);
z-index: 3;
}
.submit-container#submit.granted~.login-pending {
opacity: 1;
transform: translate(-9rem, -11rem) scale(18, 18);
z-index: 3;
}
.submit-container#submit.granted~.login-pending.spinner {
opacity: 0;
}
.submit-container#submit.granted~.login-pending.login-granted-content {
opacity: 1;
}
.submit-container.login-pending {
height: 3rem;
width: 3rem;
background-color: #07beb8;
position: absolute;
border-radius: 50%;
right: 1rem;
bottom: -0.5rem;
opacity: 0;
overflow: hidden;
transform: translate(0, 0) scale(0.5, 0.5);
transition: transform 0.2s ease-in, scale 0.2s ease-in;
z-index: 1;
}
.submit-container.login-pending.login-granted-content {
background-image: url(https://res.cloudinary.com/dgmilxzy7/image/upload/c_scale,w_700,o_25,b_rgb:07beb8/v1506735375/CodePen/ViddenPixel.jpg);
background-position: center;
background-size: cover;
color: #ffffff;
display: flex;
justify-content: center;
align-items: center;
height: 100%;
width: 100%;
opacity: 0;
position: absolute;
top: 0;
left: 0;
transition: opacity 0.2s ease-in 0.2s;
text-shadow: 0px0px20px#ffffff;
}
.submit-container.login-pending.login-granted-content.material-icons {
font-size: 5px;
position: relative;
left: 1.25px;
}
.spinner {
width: 3rem;
height: 3rem;
position: relative;
margin: 0 auto;
}
.spinner.dot1,
.spinner.dot2 {
width: 100%;
height: 100%;
border-radius: 50%;
background-color: #68d8d6;
opacity: 0.6;
position: absolute;
top: 0;
left: 0;
-webkit-animation: dot-bounce 2s infinite ease-in-out;
animation: dot-bounce 2s infinite ease-in-out;
}
.spinner.dot2 {
-webkit-animation-delay: -1s;
animation-delay: -1s;
}
@-webkit-keyframes dot-bounce {
0%,
100% {
-webkit-transform: scale(0);
}
50% {
-webkit-transform: scale(1);
}
}
@keyframes dot-bounce {
0%,
100% {
transform: scale(0);
-webkit-transform: scale(0);
}
50% {
transform: scale(1);
-webkit-transform: scale(1);
}
}
</style>
</head>
<body>
<div class="tile">
<div class="tile-header">
<h2
style="color: white; opacity: .75; font-size: 4rem; display: flex; justify-content: center; align-items: center; height: 100%;padding: 0;margin: 0;">
SIGN IN</h2>
</div>
<div class="tile-body">
<form id="form">
<label class="form-input">
<i class="material-icons">person</i>
<input type="text" autofocus="true" required />
<span class="label">Username</span>
<span class="underline"></span>
</label>
<label class="form-input">
<i class="material-icons">lock</i>
<input type="password" required />
<span class="label">Password</span>
<div class="underline"></div>
</label>
<div class="submit-container clearfix" style="margin-top: 2rem;">
<div id="submit" role="button" type="button" class="btn btn-irenic float-right" tabindex="0">
<span>SIGN IN</span>
</div>
<div class="login-pending">
<div class=spinner>
<span class="dot1"></span>
<span class="dot2"></span>
</div>
<div class="login-granted-content">
<i class="material-icons">done</i>
</div>
</div>
</div>
</form>
</div>
</div>
<script>
var $btn = document.getElementById("submit");
var $form = document.getElementById("form")
function signIn() {
if ($form.checkValidity()) {
$btn.classList.add('pending');
window.setTimeout(function () { $btn.classList.add('granted'); }, 1500);
}
}
$btn.addEventListener("click", signIn);
</script>
</body>
</html>
HTML 结构
tile:定义整个登录表单的容器,包含头部和表单主体。 tile-header:定义表单的头部,包含登录标题。 tile-body:定义表单的主体部分,包含输入框和提交按钮。 form:定义表单,包含用户名和密码输入框。 form-input:定义输入框的样式,包含图标、输入框、标签和下划线。 submit-container clearfix:定义提交按钮的容器,包含提交按钮和加载动画。 submit:定义提交按钮,包含按钮文本。 login-pending:定义加载动画的容器,包含加载动画和成功图标。
CSS 样式
.btn-irenic:hover:定义按钮在鼠标悬停时的背景颜色变化。 .btn-irenic:focus:定义按钮在获取焦点时的背景颜色变化。 .btn-irenic:active:定义按钮在被激活时的背景颜色变化。 .form-input input:focus~.label:定义输入框在获取焦点时标签的样式变化,包括颜色、位置和字体大小。 .form-input input:valid~.label:定义输入框在内容有效时标签的样式变化,包括位置和字体大小。 .form-input input:-webkit-autofill~.label:定义输入框在自动填充时标签的样式变化,包括位置和字体大小。 .submit-container #submit.pending:定义提交按钮在加载状态时的样式变化,包括缩放、背景颜色、圆角和透明度。 .submit-container #submit.pending span:定义提交按钮在加载状态时文本的透明度变化。 .submit-container #submit.granted~.login-pending:定义提交按钮在成功状态时加载动画的样式变化,包括透明度和缩放。 .submit-container .login-pending:定义加载动画的样式,包括高度、宽度、背景颜色、位置、圆角、透明度和变换效果。 .submit-container .login-pending .login-granted-content:定义加载动画成功内容的样式,包括背景图片、文字颜色、显示方式、对齐方式、透明度和文字阴影。 .spinner .dot1, .spinner .dot2:定义加载动画圆点的样式,包括宽度、高度、圆角、背景颜色、透明度和动画效果。 .spinner .dot2:定义第二个加载动画圆点的动画延迟。 @keyframes dot-bounce:定义加载动画的关键帧,包括缩放效果。

优网科技秉承"专业团队、品质服务" 的经营理念,诚信务实的服务了近万家客户,成为众多世界500强、集团和上市公司的长期合作伙伴!
优网科技成立于2001年,擅长网站建设、网站与各类业务系统深度整合,致力于提供完善的企业互联网解决方案。优网科技提供PC端网站建设(品牌展示型、官方门户型、营销商务型、电子商务型、信息门户型、微信小程序定制开发、移动端应用(手机站、APP开发)、微信定制开发(微信官网、微信商城、企业微信)等一系列互联网应用服务。