gsap是目前非常流行的前端动画框架,可以非常轻松构造出复杂的动画效果,这里仅对我实际使用中的一些例子进行总结

官网

示例

文章种所使用代码的在线示例

基础用法

// 声明一个滚动控制器
let ctrl = new ScrollMagic.Controller({
globalSceneOptions:{
offset:-200
}
}) // MORE+
Array.from(document.querySelectorAll(".more")).forEach((el,ix)=>{
let moreLink = new TimelineMax();
moreLink.from(el,{yPercent:300,opacity:0}) // 在timelineMax中 from是指从某种样式过渡到现在的样式
new ScrollMagic.Scene({
triggerElement:document.querySelectorAll("#app div.home")[0].children[ix+3],
triggerHook:0.35,
offset:200
}).setTween(moreLink).addTo(ctrl)
}) // 同时控制两个元素的过渡动画 // 师资简介
init_swiper_teachear(){
const vue = this
class SwiperTeacher{
now = 0
max = vue.swiperTeacher.length-1
imgDom = null;
infosDom = null;
numListDom = null
constructor () {
vue.$nextTick(()=>{this.getDom()})
}
next(){
return new Promise(async (resolve) => {
if(this.now === this.max) vue.goNext('ADVANTAGE'); const imgEnd = gsap.to(this.imgDom[this.imgDom.length - 1 -this.now],{xPercent:-100,ease:'power2.out'})
const infosEnd = gsap.to(this.infosDom[0],{xPercent:(this.now+1) * 100,ease:'power2.out'}) await imgEnd
await infosEnd
this.now+=1
resolve()
})
}
pre(){
return new Promise(async (resolve) => {
if(this.now===0){resolve();return}
this.now-=1
const imgEnd = gsap.to(this.imgDom[this.imgDom.length - 1 - this.now],{xPercent:0,ease:'power2.out'})
const infosEnd = gsap.to(this.infosDom[0],{xPercent:(this.now)*100,ease:'power2.out'}) await imgEnd
await infosEnd
resolve()
})
}
async go(ix){
const needGo = ix-this.now
if(needGo===0) return;
if(needGo<0){
for(let i = 0;i<-needGo;i++){await this.pre()}
}else{
for(let i = 0;i<needGo;i++){await this.next()}
}
}
getDom(){
this.imgDom = document.querySelectorAll('.introductionOfTeachers .sliderContent .imgContent .img')
this.infosDom = document.querySelectorAll('.introductionOfTeachers .sliderContent .infoContent')
this.numListDom = document.querySelectorAll('.introductionOfTeachers .point-teacher .numList')
}
} let control = new SwiperTeacher()
control = new Proxy(control,{
set (target, p, value) {
if(p==='now'){
control.numListDom.forEach((el,ix)=>{
el.classList.remove('active')
if(ix===value){el.classList.add('active')}
})
}
target[p] = value
return true
}
})
this.$refs['sliderRight-teacher'].addEventListener('click',async ()=>{await control.next()})
this.$refs['sliderLeft-teacher'].addEventListener('click',async ()=>{await control.pre()})
this.$nextTick(()=>{this.$refs['numList-teacher'].forEach((el,ix)=>{el.addEventListener('click',async ()=>{await control.go(ix)})})})
let randomTeacher = new TimelineMax()
randomTeacher.from('div.introductionOfTeachers .sliderContent',{
yPercent:100,
opacity:0,
onStart(){
vue.swiperTeacher = vue.randomArr(vue.raw_teacher_data,5)
control.now = 0
}
})
randomTeacher.from('div.introductionOfTeachers .point-teacher',{
yPercent:100,
opacity:0
})
new ScrollMagic.Scene({triggerElement:'div.introductionOfTeachers',triggerHook:0.35}).setTween(randomTeacher).addTo(ctrl)
} // 对某个按钮的过渡动画经行处理 通过添加一层元素来经行动画 高阶函数来处理抖动 // 选择院校和新闻大按钮
init_design_button(){
Array.from(document.querySelectorAll('div.selectInstitution .listContent .designButton,div.news .listContent .designButton')).forEach((el,ix)=>{
class onceFunction{
constructor (bg) {
this.bg = bg
this.end = false
}
main(){
this.bg.style.backgroundColor = '#e06730'
this.bg.style.visibility = 'unset'
gsap.from(this.bg,{scaleX:0}).then(()=>{this.end = true})
}
move(){
this.main()
this.move = ()=>{}
}
leave(){
if(this.end){
this.bg.style.visibility = 'hidden'
this.move =()=>{
this.main()
this.move = ()=>{}
}
}
}
}
const o = new onceFunction(el.childNodes[0].childNodes[0])
el.addEventListener('mousemove', ()=>{o.move()})
el.addEventListener('mouseleave',()=>{o.leave()})
if(ix===0||ix===3){
o.move()
}
})
}

前端动画框架GSAP框架随笔的更多相关文章

  1. 准备.Net转前端开发-WPF界面框架那些事,值得珍藏的8个问题

    题外话 不出意外,本片内容应该是最后一篇关于.Net技术的博客,做.Net的伙伴们忽喷忽喷..Net挺好的,微软最近在跨平台方面搞的水深火热,更新也比较频繁,而且博客园的很多大牛也写的有跨平台相关技术 ...

  2. Yii框架学习笔记(二)将html前端模板整合到框架中

    选择Yii 2.0版本框架的7个理由 http://blog.chedushi.com/archives/8988 刚接触Yii谈一下对Yii框架的看法和感受 http://bbs.csdn.net/ ...

  3. (转) 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ

    特别棒的一篇文章,仍不住转一下,留着以后需要时阅读 基于Theano的深度学习(Deep Learning)框架Keras学习随笔-01-FAQ

  4. 前端开发者使用JS框架的三个等级

    目前前端开发者使用JS框架是种很普遍的现象,因为框架可以加快开发速度,同时避免各类浏览器的兼容性问题.不过同样是用框架开发,不同开发者的境界水平还是有一定差距,本文将这些前端开发者分为三个等级. 第一 ...

  5. Web前端-Vue.js必备框架(五)

    Web前端-Vue.js必备框架(五) 页面组件,商品列表组件,详情组件,购物车清单组件,结算页组件,订单详情组件,订单列表组件. vue-router 路由 vuex 组件集中管理 webpack ...

  6. Web前端-Vue.js必备框架(四)

    Web前端-Vue.js必备框架(四) 计算属性: <div id="aaa"> {{ message.split('').reverse().join('') }} ...

  7. Web前端-Vue.js必备框架(三)

    Web前端-Vue.js必备框架(三) vue是一款渐进式javascript框架,由evan you开发.vue成为前端开发的必备之一. vue的好处轻量级,渐进式框架,响应式更新机制. 开发环境, ...

  8. Web前端-Vue.js必备框架(二)

    Web前端-Vue.js必备框架(二) vue调式工具vue-devtools 过滤器:vue.js允许你自定义过滤器,可被用作一些常见的文本格式化. mustache插值和v-bind表达式. vu ...

  9. Web前端-Vue.js必备框架(一)

    Web前端-Vue.js必备框架(一) <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

随机推荐

  1. 炉石传说酒馆战棋一键拔线(windows)

    小编的业余游戏之一<炉石传说>,这里分享的是现在很火的游戏拔线(跳过约20秒的战斗动画),用夜吹的话说,注意,不是"日你大坝",是"整活",哈哈.小 ...

  2. MacBook连接蓝牙鼠标、蓝牙键盘失败的解决方案

    问题: keychron k4连接不上MacBook,但是win10和iPhone都可以成功连接. 解决方法: 1.关闭wifi: 2.连接蓝牙键盘: 3.稍等一会,再连接wifi就可以了. 另外,苹 ...

  3. 霍夫曼编码(Huffman)

    题目:有一个字符串:cabcedeacacdeddaaaba,问题: (1)采用霍夫曼编码画出编码的过程,并写出各字符的编码 (2)根据求得的编码,求得各编码需要的总位数 (3)求出整个字符串总编码长 ...

  4. vs code 编译python 输出到调试控制台

    如图所示,在debug菜单中点击齿轮按钮,进入launch.json,更改console选项的值(有三种) "console": "internalConsole&quo ...

  5. day39 Pyhton 并发编程02 后

    一.开启子进程的另一种方式 import os from multiprocessing import Process class MyProcess(Process): def __init__(s ...

  6. xuexi

    1.内存的编址方法就是内存地址与内存单元格一一对应且永久绑定.计算机的cpu只认识内存地址,不关心内存单元格的位置和内容.通过硬件的设计来达到通过内存地址找到内存单元格. 2.内存的编址是以字节为单位 ...

  7. spring boot:用redis+redisson实现分布式锁(redisson3.11.1/spring boot 2.2)

    一,为什么要使用分布式锁? 如果在并发时锁定代码的执行,java中用synchronized锁保证了线程的原子性和可见性 但java锁只在单机上有效,如果是多台服务器上的并发访问,则需要使用分布式锁, ...

  8. scrapy Request方法

    # -*- coding: utf-8 -*- import scrapy class TestSpider(scrapy.Spider): name = 'test' allowed_domains ...

  9. 3. Distributional Reinforcement Learning with Quantile Regression

    C51算法理论上用Wasserstein度量衡量两个累积分布函数间的距离证明了价值分布的可行性,但在实际算法中用KL散度对离散支持的概率进行拟合,不能作用于累积分布函数,不能保证Bellman更新收敛 ...

  10. 56.Qt-滚动字幕之无间隙滚动(原创)

    1.描述 最近要实现一个滚动条字幕,但是搜到的系列文章都是利用定时器QTimer,在固定的时间截取文本并显示,这样滚动的时候其实是断断续续的,因为实际上是一个个字符位移实现的,不过实现方便. 所以只有 ...