vue登录3D效果

实现的效果

vue登录3D效果

登录动态效果很炫酷,话不多说直接上代码:

组件template

<template>
  <div class="entrance">
    <div class="header">
      <h2>BFF赤川什么什么系统入口</h2>
    </div>
    <div class="content">
      <div class="box" :class="{ hasClick: hasClick, hasClickOff: !hasClick&&goBack }">
        <p class="title">网点输入</p>
        <div class="input_c">
          <div class="shuru">
            <div class="icon">
              <img src="@/assets/cloud/name_icon.png" alt="" />
            </div>
            <div><input v-model="formData.name" type="text" placeholder="请输入网点名称" /></div>
          </div>
          <div class="shuru">
            <div class="icon">
              <img src="@/assets/cloud/mima_icon.png" alt="" />
            </div>
            <div><input v-model="formData.password" type="text" placeholder="请输入网点密码" /></div>
          </div>
        </div>
        <div class="foot">
          <p class="goin" @click="goIn()">进入</p>
        </div>
      </div>
      <div class="authen" :class="{ appear: hasClick, appearOff: !hasClick&&goBack }">
        <div class="circle">
          <div class="bg"></div>
        </div>
        <p class="zi">认证中...</p>
      </div>
    </div>
  </div>
</template>

 

 

脚本script 

<script>
export default {
  name: "entrance",
  data() {
    return {
      hasClick: false,
      goBack: false,
      formData:{
        name: "",
        password: ""
      }
    };
  },
  components: {},
  methods: {
    goIn() {
      this.hasClick = true;
      if(this.formData.name!="" && this.formData.password!=""){
        setTimeout(() => {
          // 请求后台进行验证...
          this.$router.push({
            name: "Home",
            params: {
              id: this.formData.name,
              name: this.formData.name,
            },
          });
        }, 1500);
      }else{
        setTimeout(() => {
          this.$confirm('请输网点名称和密码!', '提示', {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            showCancelButton: false,
            type: 'warning'
          }).then(() => {
            this.hasClick = false;
            this.goBack = true
          })
        }, 1500);
      }
    },
  },
};
</script>

 

样式style 

<style lang='scss' scoped>
.entrance {
  width: 100%;
  height: 100%;
  background: url("../assets/cloud/bg1.jpg") center no-repeat;
  background-size: 100% 100%;
  overflow: hidden;
  .header {
    width: 100%;
    height: 12%;
    margin-top: 3%;
    background: url("../assets/cloud/title_bg.png") center no-repeat;
    background-size: 100% 100%;
    h2 {
      font-size: r(32);
      color: #d8ecff;
      text-align: center;
      line-height: r(95);
    }
  }
  .content {
    width: calc(100% - 30px);
    height: r(600);
    padding: 15px;
    display: flex;
    justify-content: center;
    align-items: center;
    perspective: 800;
    -webkit-perspective: 800;
    position: relative;
    .box {
      width: r(360);
      height: r(400);
      background: linear-gradient(
        230deg,
        rgba(53, 57, 74, 0) 0%,
        rgb(0, 0, 0) 100%
      );
      box-shadow: -15px 15px 15px rgb(6 17 47 / 70%);
      transition: all 1s;
      &.hasClick {
        animation: animal1 1s linear 1 forwards;
        pointer-events: none;
      }
      &.hasClickOff{
        animation: animal11 1s linear 1 forwards;
        pointer-events: auto;
      }
      .title {
        color: #f4f4fc;
        font-size: r(20);
        line-height: r(60);
        text-align: center;
        margin-top: r(30);
      }
      .input_c {
        margin-top: r(20);
        .shuru {
          width: r(360);
          height: r(75);
          display: flex;
          justify-content: center;
          align-items: center;
          color: #f4f4fc;
          .icon img {
            width: r(26);
            height: r(26);
          }
          input {
            width: r(240);
            height: r(35);
            margin-top: -2px;
            background: rgba(57, 61, 82, 0);
            left: 0;
            padding: 2px 5px;
            border-top: 2px solid rgba(57, 61, 82, 0);
            border-bottom: 2px solid rgba(57, 61, 82, 0);
            border-right: none;
            border-left: none;
            outline: none;
            font-family: "Microsoft Yahei", sans-serif;
            box-shadow: none;
            color: #61bfff !important;
          }
          input::-webkit-input-placeholder {
            //兼容WebKit browsers(Chrome的内核)
            color: #c5c5c9;
          }
          input::-moz-placeholder {
            //Mozilla Firefox 4 to 18
            color: #c5c5c9;
          }
          input::-moz-placeholder {
            //Mozilla Firefox 19+
            color: #c5c5c9;
          }
          input::-ms-input-placeholder {
            //Internet Explorer 10+
            color: #c5c5c9;
          }
        }
      }
      .foot {
        width: 100%;
        height: r(50);
        display: flex;
        justify-content: center;
        align-items: center;
        margin-top: r(10);
        .goin {
          width: r(200);
          height: r(40);
          margin-top: r(50);
          line-height: r(40);
          border-radius: r(25);
          background: transparent;
          border: 2px solid #4fa1d9;
          color: #4fa1d9;
          text-align: center;
          font-size: r(20);
          cursor: pointer;
          &:hover {
            background: #4fa1d9;
            color: #fff;
          }
        }
      }
    }
    .authen{
      width: 240px;
      height: 120px;
      position: absolute;
      z-index: inherit;
      top: 55%;
      left: 50%;
      margin-left: -100px;
      background: linear-gradient(
        230deg,
        rgba(53, 57, 74, 0) 0%,
        rgb(0, 0, 0) 100%
      );
      box-shadow: -15px 15px 15px rgb(6 17 47 / 70%);
      transition: all 1s;
      transform: scale(0);
      &.appear{
        animation: animal2 1s linear 1 forwards;
      }
      &.appearOff{
        animation: animal22 1s linear 1 forwards;
      }
      .circle{
        width: 100%;
        height: 60px;
        display: flex;
        justify-content: center;
        align-items: center;
        margin-top: 10px;
        .bg{
          width: 50px;
          height: 50px;
          background: url("../assets/cloud/circle.png") center no-repeat;
          background-size: 100% 100%;
          animation: animal 1s infinite linear;
        }
      }
      .zi{
        font-size: r(20);
        color: #fff;
        text-align: center;
        line-height: 40px;
      }
    }
  }
}
@keyframes animal {
  0% {
    transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    -webkit-transform: rotate(0deg);
  }
  100% {
    transform: rotate(-360deg);
    -ms-transform: rotate(-360deg);
    -webkit-transform: rotate(-360deg);
  }
}
@keyframes animal1 {
  0% {
    transform: rotateX(0deg);
  }
  50% {
    transform: rotateX(70deg);
    transform-origin: center  bottom;
  }
  100% {
    transform: rotateX(70deg) translateX(-200px) scale(0.8);
    transform-origin: center  bottom;
  }
}
@keyframes animal11 {
  0% {
    transform: rotateX(70deg) translateX(-200px) scale(0.8);
    transform-origin: center  bottom;
  }
  50% {
    transform: rotateX(0deg);
    transform-origin: center  bottom;
  }
  100% {
    transform: rotateX(0deg) translateX(0) scale(1);
    transform-origin: center  bottom;
  }
}
@keyframes animal2 {
  0% {
    transform: scale(0);
  }
  50% {
    transform: scale(1);
  }
  100% {
    transform: scale(1) translateX(100px);
  }
}
@keyframes animal22 {
  0% {
    transform: scale(1) translateX(100px);
  }
  50% {
    transform: scale(1) translateX(0);
  }
  100% {
    transform: scale(0) translateX(0);
  }
}
</style>

 

 

上一篇:css2d-3d转换


下一篇:Unity 3D游戏开发学习教程