使用IntersectionObserver制作滚动动画以及其他记录
前言
最近在重做公司项目的主页,正好新来了个UI,整个都重新设计了一下,动画还挺多的。我之前没有怎么玩过这些,踩了挺多坑,最后找到了目前而言最合适的方法,现在做一个记录。
需要把原来的主页从项目中抽出来,所以干脆重新建了一个项目,使用vuecli4搭配ts,顺便踩一踩vue-ts的坑。
进入正题
需求之一是要有滚动动画,即当滚动到某个地方时播放动画,传统的方式是根据scroll距离判断滚动位置,当然可以用,不过还有其他方法可以做。
使用 IntersectionObserver api可以在很少代码量的情况下实现要求,我想既然他能做懒加载,做滚动动画应该绰绰有余。
在vue中使用IntersectionObserver
可以使用选择dom的方式,也可以使用更通用的方法,这里介绍通用方法
建一个ts文件
这里observe滚动,一旦元素达到可视区域,即加入enter class
之后unobserve,该动画只播放一次
const animatedScrollObserver: IntersectionObserver = new IntersectionObserver(
(entries,animatedScrollObserver) => {
entries.forEach((e): any => {
if (e.isIntersecting) {
e.target.classList.add('enter');
animatedScrollObserver.unobserve(e.target);
}
});
}
)
接下来export出去,只要传入一个dom,就可以observe该元素
export default {
bind(el: any) {
el.classList.add('before-enter');
animatedScrollObserver.observe(el);
}
}
在main.ts中引入,并且自定义指令,我们可以使用v-sa来引入需要observe的元素
import ScrollAnimation from "./ts/animation/scrollAnimation";
Vue.directive('sa',ScrollAnimation)
到这里工作基本完成,接下来可以设置一些动画,这些动画将在滚动到元素第一次时被播放
举例:html部分
<template>
<div id="container">
<!-- 省略 -->
<section class="text-wrapper">
<p v-sa>lorem ipsum之类的展位字符,.......</p>
</section>
<section class="pic-wrapper">
<img v-sa src="..." />
</section>
<!-- ..省略.. -->
</div>
</template>
css部分
// 文字从左侧缓入
.text-wrapper{
@keyframes moveup {
from {
left: -15px;
}
to {
top: 0;
}
}
.before-enter{
opacity: 0;
}
.enter {
opacity: 1;
animation: moveup 3s;
}
p {
position: relative;
}
}
// 图片从下往上
.pic-wrapper{
@keyframes moveup {
from {
top: 30px;
}
to {
top: 0;
}
}
.before-enter{
opacity: 0;
}
.enter {
opacity: 1;
animation: moveup 2s;
}
img {
position: relative;
}
}
关于vue ts的一些吐槽
ts是真香,但是目前vue对ts支持还不太好,比如引入外部js模块,需要在d.ts中declare module(还经常出问题),有些cdn方式引入的库,即便设置了vue.config.js中的externals,还是识别不了。可能是有些我还没研究透,但是足以体现支持不佳的现状。希望能在将来的vue3正式版中有所改进。
使用IntersectionObserver制作滚动动画以及其他记录的更多相关文章
- 推荐几款制作网页滚动动画的 JavaScript 库
这里集合了几款很棒的制作网页滚动动画的 JavaScript 库和插件.它们中,有的可以帮助你在页面滚动的时候添加动感的元素动画,有的则是实现目前非常流行的全屏页面切换动画.相信借助这些插件,你也可以 ...
- 微信小程序滚动动画,点击事件及评分星星制作!
前言 小程序上线刷爆了朋友圈,但是最近渐渐消沉了,很少有动静!最近公司项目需要,体验了一下微信小程序,制作了几个功能,布局感觉很简单,但是交互和动画等写起来确实很费劲,主要是因为他不能操作DOM,只能 ...
- 利用jquery制作滚动到指定位置触发动画
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>利用 ...
- Expression Design与Blend制作滚动的小球动画教程
原文:Expression Design与Blend制作滚动的小球动画教程 一,开发工具 Microsoft Expression Design & Blend 4.0 (3.0亦可). 这两 ...
- Adobe edge animate制作HTML5动画可视化工具(一)
Edge Animate for mac是Adobe最新出品的制作HTML5动画的可视化工具,简单的可以理解为HTML5版本的Flash Pro.在之后的文章中,我会逐一的介绍这款新的HTML5动画神 ...
- css3制作旋转动画
现在的css3真是强大,之前很多动画都是用jq来实现,但是css3制作的动画要比jq实现起来简单很多,今天呢,我自己也写了一个css旋转动画和大家分享.效果如下面的图片 思路:1.制作之前呢,我们先来 ...
- 用Canvas制作loading动画
上一篇讲到用SVG制作loading动画,其中提到了线性渐变在扇形区域中的问题,并且用SVG SIML语法制作的loading动画并不是所有浏览器都兼容,所以现在用Canvas重新实现了一遍. 这里与 ...
- 3D Grid Effect – 使用 CSS3 制作网格动画效果
今天我们想与大家分享一个小的动画概念.这个梦幻般的效果是在马库斯·埃克特的原型应用程序里发现的.实现的基本思路是对网格项目进行 3D 旋转,扩展成全屏,并呈现内容.我们试图模仿应用程序的行为,因此 ...
- ScrollMe – 在网页中加入各种滚动动画效果
ScrollMe 是一款 jQuery 插件,用于给网页添加简单的滚动效果.当你向下滚动页面的时候,ScrollMe 可以缩放,旋转和平移页面上的元素.它易于设置,不需要任何自定义的 JavaScri ...
随机推荐
- [redis读书笔记] 第一部分 数据结构与对象 字典
三 字典 字典是Hash对象的底层实现,比如用HSET创建一个HASH的对象,底层可能就是用一个字典实现的键值对. 字典的实现主要设计下面三个结构: /* * 哈希表节点 */ typedef str ...
- [Effective Java 读书笔记] 第三章类和接口 第二十三-- ??条
第二十三条 请不要再新代码中使用原生态类型 1 使用原生态类型,就失去了泛型在安全性和表述性方面的所有优势,所以新代码中不要使用原生态类型 2 List<String>可以传递给List作 ...
- 浅谈无线局域网WLAN
无线局域网WLAN 一.概述 有线局域网的组成如下图所示,多台计算机通过双绞线连接到一个集线器(hub)或交换机(switch)上,组成一个有限局域网. 无线局域网的组成如下图所示,多台计算机通过无线 ...
- java 子线程定时去更改主线程的变量
在一次代码编写场景,需要post一些数据,同时携带获得的token,(但是token的有效时间是7200s),但是post需要很多次,很长时间,不可能2小时候中断程序,手动去获取token,这样效率太 ...
- Nginx安装(yum源)
CentOS7 $ vi /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/c ...
- 在Linux实例上自动安装并运行VNC Server
#!/bin/bash ######################################### #Function: install vnc server #Usage: bash ins ...
- 使用A线程打印1-52,B线程打印A-Z,要求按照12A34B56C....5152Z的顺序进行交替打印
多线程同步问题,都需要用到监视器,用来监视资源是否可用.C++中使用condition_variable,Java中使用Condition来实现同步. 1. 实现思路 需要有一个全局变量控制当前该哪个 ...
- React中的生命周期函数
React的生命周期函数 什么是生命周期函数:生命周期函数是指在某一个时刻组件会自动调用执行的函数 Initialization:初始化 执行Constructor,初始state和props Mou ...
- C语言基础二 练习
指出正确标识符 命名 l 只能由26个英文字母的大小写.10个阿拉伯数字0~9.下划线_组成 l 严格区分大小写,比如test和Test是2个不同的标识符 l 不能以数字开头 l 不可以使用关键字作为 ...
- XPath简介、功能及使用方法
html = '''<html><head><title>The Dormouse's story</title></head><bo ...