HTML&CSS:超实用的登录页面(建议收藏)

这段HTML和CSS代码实现了一个具有动态效果的登录表单,包含用户名和密码输入框、提交按钮和加载动画。


大家复制代码时,可能会因格式转换出现错乱,导致样式失效。建议先少量复制代码进行测试,若未能解决问题,私信回复源码两字,我会发送完整的压缩包给你。

演示效果

HTML&CSS

html 复制代码
<!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: 0 0.75rem 1.5rem rgba(0, 0, 0, 0.2), 0 0.25rem 0.25rem rgba(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-input input {
            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-input input~.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-input input~.underline {
            background-color: #bdc1c5;
            height: 1px;
            width: 100%;
            position: absolute;
            bottom: 0;
            left: 0;
        }

        .form-input input:hover~.underline,
        .form-input input:focus~.underline {
            background-color: #07beb8;
        }

        .form-input input:hover~.label,
        .form-input input:focus~.label {
            color: #07beb8;
        }

        .form-input input:focus~.underline {
            height: 2px;
        }

        .form-input input:focus~.label,
        .form-input input:valid~.label {
            top: 0;
            font-size: 0.85rem;
        }

        .form-input input:-webkit-autofill~.label {
            top: 0;
            font-size: 0.85rem;
        }

        /**
 * Buttons
 */
        .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;
        }

        /**
 * Utilities
 */
        .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 #submit span {
            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.pending span {
            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: 0px 0px 20px #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:定义加载动画的关键帧,包括缩放效果。

各位互联网搭子,要是这篇文章成功引起了你的注意,别犹豫,关注、点赞、评论、分享走一波,让我们把这份默契延续下去,一起在知识的海洋里乘风破浪!

相关推荐
AI_5678几秒前
Vue.js 深度开发指南:从数据绑定到状态管理的最佳实践
前端·javascript·vue.js
前端-文龙刚4 分钟前
浅记Vue3中 ref 和 reactive 是两种主要的响应式数据声明方式,它们有以下主要区别
前端·javascript·vue.js
我是小疯子666 分钟前
HTML骨架搭建术:网页世界的信号灯
前端·html
源心锁9 小时前
👋 手搓 gzip 实现的文件分块压缩上传
前端·javascript
phltxy9 小时前
从零入门JavaScript:基础语法全解析
开发语言·javascript
Kagol10 小时前
JavaScript 中的 sort 排序问题
前端·javascript
cos11 小时前
Fork 主题如何更新?基于 Ink 构建主题更新 CLI 工具
前端·javascript·git
摸鱼的春哥12 小时前
AI编排实战:用 n8n + DeepSeek + Groq 打造全自动视频洗稿流水线
前端·javascript·后端
Coder_Boy_13 小时前
基于SpringAI的在线考试系统设计总案-知识点管理模块详细设计
android·java·javascript
吴敬悦14 小时前
我被 border-image 坑了一天,总算解决了
css