【登录页星空和捂脸动画特效】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>

http://www.niftyadmin.cn/n/490478.html

相关文章

【数组差值获取】vue对比两个数组的数据差值,并把差值取出来显示

问题&#xff1a;什么是数组差值获取呢。 有时候会遇到一种情况&#xff0c;就是比如我们有一个A数组&#xff0c;还有一个B数组&#xff0c;我们需要比较两个数组&#xff0c;看A数组内的数据是否在B数组内存在&#xff0c;如何有就不管&#xff0c;如果没有就取出来。 代码 …

【csdn涨粉秘籍】亲身体验从一年才涨80粉到20天涨粉800多,规则内设置,一个步骤助你快速涨粉

前言&#xff1a; 我用了csdn一年不到的时间&#xff0c;主要作用是当做笔记在写了&#xff0c;因为自己平常工作中会遇到一些大坑&#xff0c;或者平常也在保持学习一些知识点&#xff0c;我会把知识点汇总成一个案例然后注释好发帖子&#xff0c;这样可以巩固自己学习&#x…

【文字和图片居中对齐】图片和文字垂直居中对齐,span使用margin和line-height不生效解决办法

图片展示 问题&#xff1a; 今天遇到的问题&#xff0c;我需要一行展示一堆的图片&#xff0c;中间穿插#号&#xff0c;那我就直接一个img标签一个span标签了&#xff0c;直接就排在了一起&#xff0c;非常简单。然后需求是井号要在图片的中间。我就直接加了个行高&#xff0c…

【websocket前后端交互】vue-springboot实现websocket前后端交互链接,websocket心跳重连,包含前后端代码,复制即可用【详细解释版本】

前言&#xff1a; 还是老规矩&#xff0c;一步步的教大家如何建立前后端的 websocket 链接&#xff0c;并能完成互相传送数据的简单功能。由于网上找了半天发现很多帖子都是东一句西一句的&#xff0c;要不就是写的没什么注释和解释&#xff0c;导致我这个前端人员看后端代码非…

【java请求目标中发现无效字符】报错:Invalid character found in the request target处理办法

Invalid character found in the request target 这个报错&#xff0c;翻译过来就是在请求目标中发现无效字符 原因&#xff1a; 因为现在新版本的tomcat内都有了限制一些字符的操作&#xff0c;比如花括号引号之类的。所以当前端传过来一个json数组给你转成了字符串之后&…

【两个数组比较值是否一致】简单方法实现vue对比两个数组的值是否一致

今天写到了一个试题的考试功能&#xff0c;我需要通过把用户填的答案数组和正确答案数组比较&#xff0c;看看用户选中的答案是否和正确答案完全一致&#xff0c;比如正确答案是1,2那用户选中的答案可以是2&#xff0c;1这样顺序乱的 但是不能是2&#xff0c;3也不能是2,1,3。这…

【uview安装】uniapp安装uview组件库步骤,出现找不到文件报错情况原因

使用的编辑器是Hbuilder X 直接在uview官方文档内按步骤用下载的方式安装 然后是步骤&#xff0c;按图来 先安装sass // 安装sass npm i sass -D// 安装sass-loader npm i sass-loader -D下载好后&#xff0c;这边就会有uview ui的文件了。 这里是重点&#xff0c;放的位置不…

【微信小程序更改appid失败】微信小程序修改appid一直失败报错tourist appid解决办法

原因 我用HbuilderX新建了一个uni-app小程序&#xff0c; 然后运行到微信开发者工具&#xff0c; 然后一直显示没登录可能无法调用API。 后面调用组件还一直报错没有call的。 我就百度了&#xff0c;发现是因为没有录入appid。 我就去小程序的设置-项目设置-基本设置内把默认的…