动画及拓展

- css样式

transition: transition-property transition-duration transition-timing-function transition-delay;

  • transition-property:设置元素中参与过渡的属性名称 如 width background 必填
  • transition-duration:设置元素\过渡的持续时间; 如1s 必填
  • transition-timing-function:设置元素过渡的动画类型;
  • transition-delay:设置过渡效果延迟的时间,默认为 0;
    transition-timing-function动画类型如下

以始终相同的速度完成整个过渡过程

描述
linear以始终相同的速度完成整个过渡过程
ease以慢速开始,然后变快,然后慢速结束的顺序来完成过渡过程
ease-in以慢速开始过渡的过程
ease-out以慢速结束过渡的过程
ease-in-out以慢速开始,并以慢速结束的过渡效果
例子如下:
.transition-property {
			width: 300px;
			height: 300px;
			border: 3px solid black;
			transition-property: width background;
			transition-duration: 3s;
			transition-timing-function: ease;
			transition-delay: 2s;
		}

		.transition-property:hover {
			width: 600px;
			background-color: red;
		}

请添加图片描述
请添加图片描述

animation动画

创建 CSS 动画,要了解 @keyframes 规则。@keyframes 规则用来定义动画各个阶段的属性值

  • animationName:表示动画的名称; from:定义动画的开头,相当于 0%;
  • percentage:定义动画的各个阶段,为百分比值,可以添加多个; to:定义动画的结尾,相当于 100%;
  • properties:不同的样式属性名称,例如 color、left、width 等等。
 @keyframes ball {
            0% { top: 0px; left: 0px;}
            25% { top: 0px; left: 350px;}
            50% { top: 200px; left: 350px;}
            75% { top: 200px; left: 0px;}
            100% { top: 0px; left: 0px;} 
        }
        div {
            width: 100px;
            height: 100px;
            border-radius: 50%;
            border: 3px solid black;
            position: relative;
            animation-name: ball;
			/* animation-duration:20s; */
        }

注意:要想让动画成功播放,要定义 animation-duration 属性,否则会因为 animation-duration 属性的默认值为 0,导致动画并不会播放
红圈自下往上 黑圈自上而下 移动例子:

 @keyframes ball{
        	0%{
				opacity: 0;
				transform: translateY(300px);
			}
        	100%{
				opacity: 1;		
			}
        }
		@keyframes ballTwo{
			0%{
				opacity: 0;
				transform: translateY(-150px);
			}
			100%{
				opacity: 1;		
			}
		}
        .one {
            width: 100px;
            height: 100px;
            border-radius: 50%;
            border: 3px solid black;
            position: relative;
            animation-name: ball;
			animation-duration:2s;
			position: relative;
			top: 300px;
        }
		.two {
		    width: 100px;
		    height: 100px;
		    border-radius: 50%;
		    border: 3px solid red;
		    position: relative;
		    animation-name: ballTwo;
			animation-duration:2s;
			animation-delay:2s;
			position: relative;
			top: 300px;
		}

vue —animation

在这里插入图片描述
在进入/离开的过渡中,会有 6 状态;
v-enter-from 、v-enter-active 、v-enter-to 、v-leave-from 、v-leave-active 、v-leave-to【 vue版本3】
v-enter 、v-enter-active 、v-enter-to 、v-leave 、v-leave-active 、v-leave-to 【 vue版本2】

  • 由 v-if 所触发的切换
  • 由 v-show 所触发的切换

为过渡效果命名

可以给 组件传一个 name prop 来声明一个过渡效果名

<Transition name="fade">
  ...
</Transition>

对于一个有名字的过渡效果,对它起作用的过渡 class 会以其名字为前缀:
如下图:

.fade-enter-active,
.fade-leave-active {
  transition: opacity 0.5s ease;
}

.fade-enter-from,
.fade-leave-to {
  opacity: 0;
}

如果我们可能想要先执行离开动画,然后在其完成之后再执行元素的进入动画,可以使用mode
如果你想在某个节点初次渲染时应用一个过渡效果,你可以添加 appear

<Transition mode="out-in" appear>
  ...
</Transition>

例子如下:

<template>
  <div>
    <button @click="handleAnis">Toggle</button>
    <Transition name="fade" mode="out-in">
      <img v-if="show" key="a" src="https://xa.hw.luckygames.team/casino/images/app/keno80.jpg" />
      <img v-else key="b" src="https://www.hw.luckygames.team/casino/images/app/football.jpg" />
    </Transition>
  </div>
</template>

<script>
export default {
  data() {
    return {
      show: true, //是否直接显示默认头像
      roleName: "SEER",
    };
  },

  methods: {
    handleAnis() {
      this.show = !this.show;
    },
  },
};
</script>

<style lang="less" scoped>
.fade-enter-active,
.fade-leave-active {
  transition: all 1.3s;
}
.fade-enter,
.fade-leave-to {
  opacity: 0;
  transform: translateY(600px);
}
</style>

tween.js
只需告诉它要更改哪些属性,tween完成运行时它们应具有哪些最终值,以及这应该花费多长时间。
例子:

var position = {x: 100, y: 0}

要将值更改为x 100 -> 200

var tween = new TWEEN.Tween(position)
tween.to({x: 200}, 1000)

实际上,这还不会做任何事情.需要启动它

tween.start()

为了尽可能流畅地运行,应该在用于动画制作的同一主循环中调用该函数 //推荐的方法

animate()
function animate() {
	requestAnimationFrame(animate)
	TWEEN.update()  
}

这将负责更新所有活动 1 秒后(即 1000 毫秒)将为 position.x -> 200
使用vue如图:
//最简单的一行展示

  mounted() {
    //初始化动画
    this.initanimate();
    this.startanimate();
  },
  methods: {
    startanimate(time: number) {
      // 为了尽可能流畅地运行,应该在用于动画制作的同一主循环中调用该函数
      //每一帧动画都在变化
      requestAnimationFrame(this.startanimate);
      $Tween.update(time);
    },
    initanimate() {
      const object1 = { opacity: 0, top: 400 };
      //y轴从400 -> 0 运动
      const oneTset: any = this.$refs.oneTset;
      var tween1 = new $Tween.Tween(object1)
        .to({ opacity: 1, top: 400 }, 600)
        //运动方式
        .easing($Tween.Easing.Linear.None)
        .onUpdate(function () {
          oneTset.style.opacity = `${object1.opacity}`;
        //如果没有top==400那么就会在top等于0先展示然后再上移
          var transform = "translateY(" + object1.top + "px)";
          oneTset.style.transform = transform;
        });

      const object = { y: 400 };
      var tween2 = new $Tween.Tween(object)
        .to({ y: 0 }, 1000)
        //运动方式
        .easing($Tween.Easing.Linear.None)
        .onUpdate(function () {
          // console.log(object.y);
          var transform = "translateY(" + object.y + "px)";
          oneTset.style.transform = transform;
        });
      let anis = tween1.chain(tween2);
      anis.start();
    },

动画先出现然后在逐渐上移
我的需求是先显示再逐渐上移 如果chain的时候第一步只有透明度,第二步上移那么会先显示然后再从底部上移,不符合需求。我应该先显示透明度,top就在要上移的最初位置(那么就算我使用了translate也不会有移动的效果,也可以达到我最终的需求)
需求:第一行在指定位置显示,然后上移一定位置。出现第二行在指定位置显示,然后上移一定位置
//多行展示

<template>
  <div class="">
    <div class="my-tween" ref="oneTset">你好</div>
    <div class="my-tween" ref="twoTset">xxxxx</div>
  </div>
</template>

<script lang="ts">
import $Tween from "@tweenjs/tween.js";
export default {
  data() {
    return {};
  },

  mounted() {
    //获取第一行文字
    const oneTset = this.$refs.oneTset;
    //获取第二行文字
    const twoTset = this.$refs.twoTset;
    //初始化动画 拿到tw1
    let tw1 = this.initanimate(oneTset as HTMLDivElement);
    let tw2 = this.initanimate(twoTset as HTMLDivElement);
    // 为了让第一行上移结束和第二行的显示连起来
    tw1.tween2.chain(tw2.tween1);
    tw1.tween1.start();
    this.startanimate();
  },
  methods: {
    startanimate(time: number) {
      // 为了尽可能流畅地运行,应该在用于动画制作的同一主循环中调用该函数
      //每一帧动画都在变化
      requestAnimationFrame(this.startanimate);
      $Tween.update(time);
    },
    initanimate(oneTset: HTMLDivElement) {
      const object1 = { opacity: 0, top: 400 };
      //显示
      var tween1 = new $Tween.Tween(object1)
        .to({ opacity: 1, top: 400 }, 600)
        //运动方式
        .easing($Tween.Easing.Linear.None)
        .onUpdate(function () {
          oneTset.style.opacity = `${object1.opacity}`;
          var transform = "translateY(" + object1.top + "px)";
          oneTset.style.transform = transform;
        });
      //上移 y轴从400 -> 0 运动
      const object = { y: 400 };
      var tween2 = new $Tween.Tween(object)
        .to({ y: 0 }, 1000)
        //运动方式
        .easing($Tween.Easing.Linear.None)
        .onUpdate(function () {
          var transform = "translateY(" + object.y + "px)";
          oneTset.style.transform = transform;
        });
      // tween1.chain(tween2)是为了让每一行的文字  显示及上移 链起来
      let anis = tween1.chain(tween2);
      //返回出{ tween1, tween2 }是为了让第一行结束和第二行的显示连起来
      return { tween1, tween2 };
    },
  },
};
</script>
<style lang="css" scoped>
.my-tween {
  opacity: 0;
}
</style>

动画插件 ScrollReveal

  <template>
  <div class="anisClue">1111111</div>
  </template>
  <script>
   ScrollReveal().reveal(".anisClue", {
        origin: "bottom", // 动画开始的方向
        distance: "300px", //移动距离
        duration: 1000, // 动画持续时间
        delay: 0, // 延迟
        rotate: { x: 0, y: 0, z: 0 }, // 过度到0的初始角度,关键点想要酷炫的样式主要修改此参数
        opacity: 0, // 初始透明度
        scale: 0.8,
        viewOffset: {
          //可看到的范围,全屏往里缩
          top: 150,
          right: 0,
          bottom: 150,
          left: 0,
        },
        //当动画开始之前会被触发
        beforeReveal: function(domEl){
            console.log('动画执行了');
        },
        //动画开始之后会被触发
        afterReveal: function(domEl){
            console.log('动画结束了');
        },
      });
 </script>  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值