HTML+CSS+JavaScript网页登录界面制作(附源代码)

Html文件一般是写网页标签的,也就是编写网页的骨架,Html文件还可以指定其引用的Css、JavaScript文件

Css文件是设置样式的,就是大小、颜色、位置等 

JavaScript文件一般是处理交互或与后端通信的  

下面分两个部分深入介绍前端网页的工作原理

1、浏览器加载网页

2、浏览器运行网页

一个网页就HTML+CSS+JavaScript三种文件

1、浏览器是如何加载网页

在浏览器输入网址,通过网址的协议、域名、端口部分与服务器(Nginx等)建立连接,之后,服务器会根据路径部分寻找对应的网页资源并将其发送给浏览器

网址请求返回的一般是Html文件或者Html格式的内容(动态网站PHP返回Html格式的内容)

浏览器接收和处理Html文件的过程是流式的

也就是说,浏览器每接收到一部分内容就会处理一部分(Html的标签是一对一对的是为了方便流式处理)

当发现Html文件中需要下载其他资源时会开始下载其他资源,包括Css、JavaScript、图片文件等

值得注意的是,资源文件的下载都是异步的,不会等一个资源下载完再开始下一个资源的下载。

所以,为了避免JavaScript报错,其初始化的一些操作一般是放在onload事件之后的(确保此时资源文件都加载完毕)

2、浏览器是如何显示网页

浏览器显示网页大概有4步骤

构建Dom树、构建呈现树(render tree)、布局处理、绘制

构建Dom树就是解析Html文件,并把元素标签转换成Dom节点(一种数据结构)

呈现树是网页显示部分的数据结构

构建呈现树就是会解析Css文件和元素标签中的样式属性以完善呈现树

由于Css文件会影响呈现树的构建,所以一般放在Html文件的头部引用(<head></head>),这样就会不会出现网页一瞬间混乱(之后又好了)的情况

之后的布局处理会根据当前的浏览器窗体大小,计算出每一个元素的确切坐标

最后的绘制阶段,就是把网页描画出来。

当然,这个过程也不是一次性完成的,为了尽快显示网页,浏览器完成一部分内容解析后,即会把该部分显示出来

以上是Html文件、Css文件的处理,那JavaScript文件呢

JavaScript文件会被浏览器的JavaScript解析器处理

JavaScript有两个作用,一是处理交互、二是与后端通信

其中需要特别说明的是,

JavaScript处理交互时,往往会修改页面的元素(如按钮变色等)

此类操作都被称为DOM树操作(JavaScript是无法修改CSS内容的)

而DOM树操作说白了就是对HTML内容进行修改

或者说是修改了DOM树的数据

当DOM树数据被修改后,上面提到的网页显示过程就会重新执行一遍

由于JavaScript会影响DOM树的构建,所以一般放在Html文件的底部引用,这样有利于网页尽快显示出来

下面介绍一个html+css+js的登录页面设计,附源代码;

样式图

<!DOCTYPE html>
<html lang="en">
    <head>    
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>可爱的登录界面</title>
        <link rel="stylesheet" href="style.css">
        <script src="https://cdn.staticfile.org/vue/2.6.9/vue.js"></script>
    </head>
    <body>    
        <div id="app" class="container"><img src="./bg.jpg" alt="">        
            <div class="panel">            
                <div class="content login">                
                    <div class="switch">                    
                    <span :class='{"active":active === "login"}' @click="go('login')">登录</span>                    
                    <span>/</span>
                    <span :class='{"active":active === "register"}' @click="go('register')">注册</span>                
                </div>
                <div class="form" id="fromLogin"><!-- 如果按钮选择的是注册就展示这个里面的内容 -->                    
                    <template v-if="active === 'register'">                        
                        <div class="input">                            
                            <input :class="{hasValue : registerForm.email}" v-model="registerForm.email" type="text" name="email" id="email">                            
                            <label for="email">邮箱</label>                        
                        </div>                        
                        <div class="input">                            
                            <input :class="{hasValue : registerForm.Username}" v-model="registerForm.Username" type="text" name="Username" id="Username">                            
                            <label for="email">用户名</label>                        
                        </div>                        
                        <div class="input">                            
                            <input :class="{hasValue : registerForm.Password}" v-model="registerForm.Password" type="text" name="Password" id="Password">                            
                            <label for="email">密码</label>                        
                        </div>                        
                        <div class="input">                            
                            <input :class="{hasValue : registerForm.repeat}" v-model="registerForm.repeat" type="text" name="Passwordrepeat" id="Passwordrepeat">                            
                            <label for="email">重复密码</label>                        
                        </div>                    
                    </template>                    
                    <!-- 如果按钮选择的是登录就展示这个里面的内容 -->                                    
                     <template v-if="active === 'login'">                        
                        <div class="input">                            
                            <input :class="{hasValue : loginForm.Username}" v-model="loginForm.Username" type="text" name="Username" id="Username">                            
                            <label for="email">用户名</label>                        
                        </div>                        
                        <div class="input">                            
                            <input :class="{hasValue : loginForm.Password}" v-model="loginForm.Password" type="text" name="Password" id="Password">                            
                            <label for="email">密码</label>                        
                        </div>                    
                    </template>                    
                    <span>忘记密码?</span>                    
                    <button type="submit" @click="submit">登录</button>                
                </div>            
            </div>        
        </div>    
    </div>
</body>
</html>

JavaScript代码

<script>    
var vue = new Vue({        
    el: '#app',        
    data: {            
        active :'login',            
        registerForm:{                
            email : '',               
             Username : '',                
             Password : '',                
             repeat : ''            
            },            
            loginForm :{                
                Username : '',                
                Password : ''            
            }        
        },        
        methods: {            
            go(type){                
                this.active = type;            
            },            
            submit(){                
                if(type === 'login'){                    
                    console.log('login',this.loginForm)                
                }                
                if(type === 'register'){                    
                    console.log('register',this.registerForm)                
                }            
            }       
         }    
        })
        </script>

Css代码

@font-face{    
    font-family: miaowu;    
    src: url(./方正-喵呜.TTF);
}
*{    
    margin: 0;    
    padding: 0;
}
body{    
    /* 100%的窗口高度 */    
    height: 100vh;    
    /* 弹性布局 水平 + 垂直居中 */    
    display: flex;    
    justify-content: center;    
    align-items: center;    
    /* 引入字体 */    
    font-family: miaowu;    
    /* 渐变背景 */    
    background: linear-gradient(45deg,rgb(181,154,254),rgb(245,189,253)) fixed;
}
.container{    
    /* 相对定位 */    
    position: relative;    
    width: 70rem;
}
.container img{    
    width: 70rem;
}
.switch span{    
    color: #ccc;    
    font-size: 1.4rem;    
    /* 鼠标放上变小手 */    
    cursor: pointer;
}
.switch span.active{    
    color: rgb(181,154,254);
}
.panel{    
    width: 30%;    
    margin: 10rem 0 0;    
    position: absolute;    
    right: 0;    
    top: 0;    
    display: flex;    
    justify-content: center;
}
.form{    
    width: 12rem;    
    margin: 3rem 0 0;
}
.form .input{    
    position: relative;    
    opacity: 1;    
    height: 2rem;    
    width: 100%;    
    margin: 2rem 0;    
    transition: 0.4s;
}
.form input{    
    outline: none;    
    width: 100%;    
    border: none;    
    border-bottom: .1rem solid rgb(181,154,254);    
    position: relative;    
    line-height: 35px;    
    background-color: transparent;    
    z-index: 1;
}
.form label{    
    position: absolute;    
    left: 0;    
    top: 20%;    
    font-size: 1.2rem;    
    color: rgb(129,101,207);    
    transition: 0.3s;
}
.hasValue ~ label,input:focus ~ label{    
    top: -50%;    
    font-size: 0.9rem;
}
.form span{    
    display: block;    
    color: rgb(110,89,167);    
    font-size: 0.8rem;    
    cursor: pointer;
}
.form button{    
    border: none;    
    outline: none;    
    margin: 2.5rem 0 0;    
    width: 100%;    
    height: 3rem;    
    border-radius: 3rem;   
    background:linear-gradient(45deg,rgb(181,154,254),rgb(245,189,253)) ;    
    box-shadow: 0 0 8px rgb(181,154,254);    
    cursor: pointer;    
    color: white;    
    font-family: miaowu;}
#live2dcanvas{    
    border: 0 !important;
}