【登录页星空和捂脸动画特效】vue 实现掘金登录页捂脸动画效果,css 实现登录页星空动画流星效果【通俗易懂】

前言:

这里是展示一下做的登录页的一个好看的样式,同时也写了个下掘金登录页很有意思的捂脸小动画怎么实现的,感觉放在一起还挺好看的。
虽然不知道有没有问题,但是还是声明一下:我就是写来学习学习这种设计,以后遇到了可以直接套用这个思路,这个捂脸的图应该是人家掘金的,所以大家学习用用就好了,商用什么的如果算是侵权的话跟我没关系哈。

效果图

在这里插入图片描述

视频展示效果(gif不会弄,只能上传个视频看看了)

vue登录页捂脸效果星空效果预览

图片资源

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码部分

<template>
  <div class="home">
    <div>
      <div class="loginBox">
        <!-- 表情图部分 -->
        <img :src="loginSrc" alt="表情图" class="loginImages" />
        <!-- 登录框部分 -->
        <el-card class="box_rgb">
          <div class="login_title">智 能 学 习 平 台</div>
          <el-form
            label-width="80px"
            :model="from"
            :rules="rules"
            ref="ruleForm"
            class="login_input"
          >
            <!-- 账号部分 -->
            <el-form-item label="账号" prop="username" class="login-text">
              <el-input
                v-model.trim="from.username"
                @focus="changeImages(2)"
                @blur="recoverImages"
              ></el-input>
            </el-form-item>
            <!-- 密码部分 -->
            <el-form-item label="密码" prop="password" class="login-text">
              <el-input
                v-model.trim="from.password"
                type="password"
                style="margin-top: 5px"
                @focus="changeImages(3)"
                @blur="recoverImages"
              ></el-input>
            </el-form-item>
            <!-- 登录按钮 -->
            <el-form-item>
              <el-button
                type="primary"
                style="width: 100%; margin-top: 10px; height: 40px"
                @click="login"
                >登录</el-button
              >
            </el-form-item>
          </el-form>
        </el-card>
      </div>
    </div>
    <!-- 星空效果部分 -->
    <div class="two">
      <div
        class="three"
        v-for="(item, index) in items"
        :key="index"
        ref="three"
      ></div>
    </div>
  </div>
</template>

<script>
import {
    
     Message } from "element-ui";
import {
    
     setToken } from "@/utils/auth";
export default {
    
    
  name: "home",
  data() {
    
    
    //验证账号正则
    var validatePass = (rule, value, callback) => {
    
    
      //三个参数:规则,值,回调
      //创建个正则用于判断
      const reg = /^\w{4,8}$/;
      //判断:账号验证是否通过
      if (reg.test(value)) {
    
    
        //放行
        callback();
      } else {
    
    
        //提示错误信息
        callback(new Error("必须是4到8位数字字母组合"));
      }
    };
    return {
    
    
      //星空效果div循环生成800个
      items: 800,
      distance: 800,
      //双向绑定
      from: {
    
    
        username: "",
        password: "",
      },
      //首页三个表情图切换
      loginSrc: require("@/assets/login1.jpg"),
      //验证条件
      rules: {
    
    
        //账号部分
        username: [
          //验证方法用validatePass,通过blur(失去焦点)事件判断验证,
          {
    
     validator: validatePass, trigger: "blur" },
          //required:true代表必填,message:提示信息,trigger:根据什么事件判断,同上
          {
    
     required: true, message: "账号不能为空", trigger: "blur" },
        ],
        //密码部分
        password: [
          {
    
     required: true, message: "密码不能为空", trigger: "blur" },
        ],
      },
    };
  },
  created() {
    
    
    //页面加载完全局监听键盘事件,然后调用函数
    document.addEventListener("keyup", this.watchEnter);
  },
  destroyed() {
    
    
    //页面跳转销毁全局监听事件
    document.removeEventListener("keyup", this.watchEnter);
  },
  mounted() {
    
    
    //星空效果
    //获取dom 800个div
    const starArr = this.$refs.three;
    //循环div
    starArr.forEach((item) => {
    
    
      //随机数
      const speed = 0.2 + Math.random() * 1;
      const thisDistance = this.distance + Math.random() * 360;
      //每一项的样式
      item.style.transformOrigin = `0 0 ${
      
      thisDistance}px`;
      item.style.transform = `translate3d(0, 0, -${
      
      thisDistance}px) rotateY(${
      
      
        Math.random() * 360
      }deg) rotateX(${
      
      Math.random() * -50}deg) scale(${
      
      speed})`;
    });
  },
  methods: {
    
    
    //登录验证
    login() {
    
    
      // //用$refs找到dom元素,验证是否通过。
      this.$refs.ruleForm.validate((boolean) => {
    
    
        //验证通过发请求
        if (boolean) {
    
    
          this.$axios
            .get("/user/select", {
    
    
              username: this.from.username,
              password: this.from.password,
            })
            .then((res) => {
    
    
              if (res == 200) {
    
    
                //把token和昵称存到本地,方便后续守卫验证令牌,可以从本地调用昵称显示在另一个页面。
                setToken("3arc9h0vhcr0f8iprpnscmfo8s");
                //跳转到主页
                this.$router.push("/");
              } else {
    
    
                Message({
    
    
                  type: "error",
                  message: "账号密码不正确,请从新输入",
                });
              }
            })
            .catch((error) => {
    
    
              console.log(error, "请求失败");
            });
        }
      });
    },
    //判断按键
    watchEnter(e) {
    
    
      //按键判断:e.which返回当前按键的键值,然后if判断键值是否等于13,13是回车键的键值。如果是调用登录方法发请求
      let keyNum = e.which;
      if (keyNum == 13) {
    
    
        this.login();
      }
    },
    //获取焦点时改变图片路径
    changeImages(index) {
    
    
      if (index == 2) {
    
    
        this.loginSrc = require("@/assets/login2.jpg");
      }
      if (index == 3) {
    
    
        this.loginSrc = require("@/assets/login3.jpg");
      }
    },
    //失去焦点时恢复第一章图片
    recoverImages() {
    
    
      this.loginSrc = require("@/assets/login1.jpg");
    },
  },
};
</script>


<style lang="scss" scoped>
* {
    
    
  box-sizing: border-box;
}
/* input登录 */
.login_input {
    
    
  margin-left: 40px;
  margin-top: 130px;
  width: 370px;
}
/* 背景色透明 */
.box_rgb {
    
    
  height: 400px;
  width: 550px;
  border-radius: 30px;
  background-image: linear-gradient(#263238, #2d94a7);

  transform: translateX(50%);
  margin-top: -200px;
  box-shadow: 0px 0px 15px 5px #c4fcf0;
}
// login页表情图
.loginImages {
    
    
  position: absolute;
  top: -315px;
  left: 84%;
  width: 180px;
  z-index: 2;
}
.loginBox {
    
    
  position: absolute;
  right: 50%;
  top: 50%;
}
/* 标题 */
.login_title {
    
    
  width: 300px;
  text-align: center;
  position: absolute;
  right: 50%;
  top: 50px;
  transform: translateX(50%);
  font-size: 34px;
  font-weight: bold;
  color: #fff6ff;
}

//星空效果样式部分
.home {
    
    
  position: relative;
  width: 100%;
  height: 100%;
  //星空图的背景渐变色
  background: radial-gradient(
    260% 67% at bottom center,
    #32cbc6 10%,
    #63baaa 40%,
    #00838f 65%,
    #263238 130%
  );

  overflow: hidden;
}
.two {
    
    
  position: absolute;
  left: 50%;
  transform-style: preserve-3d;
  transition: perspective(500deg);
  perspective-origin: 50% 100%;
  -webkit-perspective-origin: 50% 100%;
  -moz-perspective-origin: 50% 100%;
  animation: xinkon 90s linear infinite;
  bottom: -100px;

  .three {
    
    
    width: 2px;
    height: 2px;
    background: #fff9c4;
    position: absolute;
    top: 0;
    left: 0;
    backface-visibility: hidden;
    -webkit-backface-visibility: hidden;
    -moz-backface-visibility: hidden;
    -ms-backface-visibility: hidden;
  }
}
@keyframes xinkon {
    
    
  0% {
    
    
    transform: perspective(400px) rotateZ(20deg) rotateX(-40deg) rotateY(0);
  }
  100% {
    
    
    transform: perspective(400px) rotateZ(20deg) rotateX(-40deg)
      rotateY(-360deg);
  }
}
</style>
<style>
.login-text .el-form-item__label {
    
    
  color: #fff;
  font-size: 16px;
}
</style>

猜你喜欢

转载自blog.csdn.net/seeeeeeeeeee/article/details/124248783