Web前端开发技术:Web前端开发技术

一、实验目的:

掌握Vue提供的transition组件。
掌握animate.css动画库。

二、实验要求:

了解transition组件和animate.css动画库的基本使用
编写程序完成以下实验内容并上交实验报告

三、实验内容:

(一)实验基础

1、transition组件和animate.css动画库
(1) 通过标签以及该标签与其它动画库的搭配使用实现过渡和动画。使用把需要被动画控制的元素包裹起来,标签可结合6 个CSS类(3个进入过渡的类和3个离开过渡的类)实现过渡,animate.css动画库也可结合这6 个CSS类的自定义类名实现动画效果。
2、本次实验主要通过transition组件和animate.css动画库的使用掌握过渡和动画的编写方法。

(二)实验题

1、编写一个登录页面,使用Tab栏实现“账号登录”和“二维码登录”这两种方式的切换,并通过transition组件结合animate.css实现切换时的动画效果。
2、实现单击一个按钮后,切换盒子的展开和收起状态。

四、设计思路:

1. 分别用模板设计3个页面:登录、注册、二维码登录,使用变量控制3个模板显示,显示使用transition组件做动画。
2.使用transition将div展开和收起

五、实验过程中遇到的问题及解决手段:

使用模板显示页面的时候需要子组件访问父组件传参,尝试使用this.$emit,让父组件监听,发现过于繁琐,直接使用this.$parent.compontentName=‘form_login’;访问父组件的变量进行Template切换。

六、程序源代码:




<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    .fade-enter-active, .fade-leave-active {
      transition: opacity .5s ease;
    }
    .fade-enter, .fade-leave-to {
      opacity: 0;
    }
  </style>
  <style scoped>

    .wrapper {
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      max-width: 5rem;
      line-height: 0.35rem;
      white-space: wrap;
      padding: 0.25rem;
      border-radius: 6px;
      color: #fff;
      font-size: 0.18rem;
      background: rgba(0,0,0, 0.8)
    }
    .login-page {
      width: 360px;
      padding: 8% 0 0;
      margin: auto;
    }
    .form {
      position: relative;
      z-index: 1;
      background: #FFFFFF;
      max-width: 360px;
      margin: 0 auto 100px;
      padding: 45px;
      text-align: center;
      box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24);
    }
    .form input {
      font-family: "Roboto", sans-serif;
      outline: 0;
      background: #f2f2f2;
      width: 100%;
      border: 0;
      margin: 0 0 15px;
      padding: 15px;
      box-sizing: border-box;
      font-size: 14px;
    }
    .form button {
      font-family: "Microsoft YaHei","Roboto", sans-serif;
      text-transform: uppercase;
      outline: 0;
      background: #4CAF50;
      width: 100%;
      border: 0;
      padding: 15px;
      color: #FFFFFF;
      font-size: 14px;
      -webkit-transition: all 0.3 ease;
      transition: all 0.3 ease;
      cursor: pointer;
    }
    .form button:hover,.form button:active,.form button:focus {
      background: #43A047;
    }
    .form .message {
      margin: 15px 0 0;
      color: #b3b3b3;
      font-size: 12px;
    }
    .form .message a {
      color: #4CAF50;
      text-decoration: none;
    }

    /*.form .register-form {
      display: none;
    }*/
    .container {
      position: relative;
      z-index: 1;
      max-width: 300px;
      margin: 0 auto;
    }
    .container:before, .container:after {
      content: "";
      display: block;
      clear: both;
    }
    .container .info {
      margin: 50px auto;
      text-align: center;
    }
    .container .info h1 {
      margin: 0 0 15px;
      padding: 0;
      font-size: 36px;
      font-weight: 300;
      color: #1a1a1a;
    }
    .container .info span {
      color: #4d4d4d;
      font-size: 12px;
    }
    .container .info span a {
      color: #000000;
      text-decoration: none;
    }
    .container .info span .fa {
      color: #EF3B3A;
    }
    body {
      background: #76b852; /* fallback for old browsers */
      background: -webkit-linear-gradient(right, #76b852, #8DC26F);
      background: -moz-linear-gradient(right, #76b852, #8DC26F);
      background: -o-linear-gradient(right, #76b852, #8DC26F);
      background: linear-gradient(to left, #76b852, #8DC26F);
      font-family: "Roboto", sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
    }
    .shake_effect{
      -webkit-animation-name: shake;
      animation-name: shake;
      -webkit-animation-duration: 1s;
      animation-duration: 1s;
    }
    @-webkit-keyframes shake {
      from, to {
        -webkit-transform: translate3d(0, 0, 0);
        transform: translate3d(0, 0, 0);
      }

      10%, 30%, 50%, 70%, 90% {
        -webkit-transform: translate3d(-10px, 0, 0);
        transform: translate3d(-10px, 0, 0);
      }

      20%, 40%, 60%, 80% {
        -webkit-transform: translate3d(10px, 0, 0);
        transform: translate3d(10px, 0, 0);
      }
    }

    @keyframes shake {
      from, to {
        -webkit-transform: translate3d(0, 0, 0);
        transform: translate3d(0, 0, 0);
      }

      10%, 30%, 50%, 70%, 90% {
        -webkit-transform: translate3d(-10px, 0, 0);
        transform: translate3d(-10px, 0, 0);
      }

      20%, 40%, 60%, 80% {
        -webkit-transform: translate3d(10px, 0, 0);
        transform: translate3d(10px, 0, 0);
      }
    }
    p.center{
      color: #fff;font-family: "Microsoft YaHei";
    }
    #unshow{
      z-index: 2;
      background: #b3b3b3;
    }
  </style>
  <script src="vue.js"></script>
</head>
<body>
  <!-- 定义登录组件 -->
  <template id="form_login">
    <form class="login-form">
      <span>我是登录组件</span>
      <input type="text" placeholder="用户名" id="user_name"/>
      <input type="password" placeholder="密码" id="password"/>
      <button id="login" >登录</button>
      <button class="unshow" id="unshow" @click="switch_code_login()">二维码登录</button>
      <p class="message">没有账户?创建一个 <a href="#" @click="switch_create()">立刻创建</a></p>
    </form>
  </template>
  <!-- 定义注册组件 -->
  <template id="form_register">
    <form class="register-form">
      <span>我是注册组件</span>
      <input type="text" placeholder="用户名" id="r_user_name"/>
      <input type="password" placeholder="密码" id="r_password" />
      <input type="text" placeholder="电子邮件" id="r_email"/>
      <button id="create">创建账户</button>
      <p class="message">已经有了一个账户? <a href="#" @click="switch_login()">立刻登录</a></p>
    </form>
  </template>
  <!-- 二维码登录 -->
  <template id="form_login_code">
    <form class="register-form">
      <span>我是二维码登录组件</span>
      <img src="img.jpg" style="width:100%;height:auto;">
      <p class="message"> <a href="#" @click="switch_login()">返回账号密码登录</a></p>
    </form>
  </template>
  <div id="app">
    <a href="javascript:;" @click="compontentName='form_login'">登录</a>
    <a href="javascript:;" @click="compontentName='form_register'">注册</a>
    <a href="javascript:;" @click="compontentName='form_login_code'">二维码登录</a>
    <div id="wrapper" class="login-page">
      <div id="login_form" class="form" >
        <transition name="fade" mode="out-in">
          <component @fatherMethod="test" :is="compontentName"></component>
        </transition>
      </div>
    </div>
  </div>
  <script>
    Vue.component('form_login', {template: '#form_login',methods:{
        switch_code_login(){
          this.$parent.compontentName='form_login_code';
        },
        switch_create(){
          this.$parent.compontentName='form_register';
        },
    }})
    Vue.component('form_register', {template: '#form_register',methods:{switch_login(){
          this.$parent.compontentName='form_login';
        }}})
    Vue.component('form_login_code', {template: '#form_login_code',methods:{switch_login(){
      this.$parent.compontentName='form_login';
    }}})
    var vm = new Vue({
      el: '#app',
      data: { compontentName: 'form_login' },
      method:{
      }
    })
  </script>
</body>
</html>

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


<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    /* 图形的初始状态 */
    .chart {
      width: 200px;
      height: 200px;
      background-color: orange;
    }
    /* 进入和离开的过程 */
    .box-enter-active, .box-leave-active {
      transition: height 2s;  /* width的变化,动画时间是3秒 */
    }
    /* 进入初始状态 和 离开的结束状态*/
    .box-enter, .box-leave-to {
      height: 0px;
    }
    /* 进入的结束状态 和 离开的初始状态 */
    .box-enter-to, .box-leave {
      height: 200px;
    }
  </style>
  <script src="vue.js"></script>
</head>
<body>
  <div id="app">
    <button @click="toggle">{{show ? '收起' : '展开'}}盒子</button>
    <transition name="box">
      <div class="chart" v-if="show">BOX</div>
    </transition>
  </div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        show: true,
      },
      methods: {
        toggle () {
          this.show = !this.show   // 每次都取反
        }
      }
    })
 </script>
</body>
</html>
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nickdlk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值