- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望在摆动效果结束时调用一个函数。
也就是说,在阻尼效果结束时(当摆动停止时),我想执行 GSAP 时间轴函数。我假设需要在 Curtains 的 onReady() 内部调用这种类型的“onComplete”函数,并且可能需要跟踪阻尼效果。我只熟悉GSAP的onComplete
函数,但不知道如何在这里实现它。也许可以检查 deltas.applied 是否小于 0.001 ,然后调用该函数?
下面是代码片段(没有片段和顶点着色器)。完整的工作代码在这里: CodePen
class Img {
constructor() {
const curtain = new Curtains({
container: "canvas",
watchScroll: false,
});
const params = {
vertexShader,
fragmentShader,
uniforms: {
time: {
name: "uTime",
type: "1f",
value: 0,
},
prog: {
name: "uProg",
type: "1f",
value: 0,
}
}
}
const planeElements = document.getElementsByClassName("plane")[0];
this.plane = curtain.addPlane(planeElements, params);
if (this.plane) {
this.plane
.onReady(() => {
this.introAnim();
})
.onRender(() => {
this.plane.uniforms.time.value++;
deltas.applied += (deltas.max - deltas.applied) * 0.05;
deltas.max += (0 - deltas.max) * 0.07;
this.plane.uniforms.prog.value = deltas.applied
})
}
// error handling
curtain.onError(function() {
document.body.classList.add("no-curtains");
});
}
introAnim() {
deltas.max = 6;
//console.log("complete") <-- need an onComplete type function~!
}
}
window.onload = function() {
const img = new Img();
}
最佳答案
你可以使用一些代数:)
首先,您应该像这样简化您的 deltas.max
函数:
deltas.max += (0 - deltas.max) * 0.07;
// Simplifies to
deltas.max -= deltas.max * 0.07;
// Rewrite to
deltas.max = deltas.max - deltas.max * 0.07;
// Rewrite to
deltas.max = deltas.max * (1 - 0.07);
// Simplifies to
deltas.max *= 0.93; // Much nicer :)
这实际上非常重要,因为它使我们计算时间变量的最终值和动画持续时间的工作显着变得更加容易:
// Given deltas.max *= 0.93, need to calculate end time value
// endVal = startVal * reductionFactor^n
// Rewrite as
// n = ln(endVal / startVal) / ln(reductionFactor) // for more see https://www.purplemath.com/modules/solvexpo2.htm
// n = ln(0.001 / 8) / ln(0.93)
const n = 123.84;
// Assuming 60fps normally: n / 60
const dur = 2.064;
一旦我们有了这些值,我们所要做的就是创建一个线性补间,以该持续时间将时间动画到该值,并更新 onUpdate
中的 max 和 prog 值:
gsap.to(this.plane.uniforms.time, {
value: n,
duration: dur,
ease: "none",
onUpdate: () => {
this.deltas.applied += (this.deltas.max - this.deltas.applied) * 0.05;
this.deltas.max *= 0.93;
this.plane.uniforms.prog.value = this.deltas.applied;
},
onComplete: () => console.log("complete!")
});
然后你就“完成了!”当动画结束时!
为了确保您的 Curtains 动画即使在高刷新率的显示器上也能以正确的速率运行(即使是那些没有直接使用 GSAP 制作动画的显示器),关闭 Curtain 的 autoRender
ing 也是一个好主意并使用 GSAP 的股票代码代替:
const curtains = new Curtains({ container: "canvas", autoRender: false });
// Use a single rAF for both GSAP and Curtains
function renderScene() {
curtains.render();
}
gsap.ticker.add(renderScene);
总共你会得到 this demo .
关于javascript - 使用 Curtains.js 在动画完成时运行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64364972/
我正在尝试创建一个类似于 android 通知下拉区域的菜单。 (从顶部向下拖动的位置) 菜单必须包含它自己的滚动条、图像和动画(向下滚动,而不仅仅是跳跃) 我该怎么做,这有可能吗? ps:这不是移动
我希望在摆动效果结束时调用一个函数。 也就是说,在阻尼效果结束时(当摆动停止时),我想执行 GSAP 时间轴函数。我假设需要在 Curtains 的 onReady() 内部调用这种类型的“onCom
我希望在摆动效果结束时调用一个函数。 也就是说,在阻尼效果结束时(当摆动停止时),我想执行 GSAP 时间轴函数。我假设需要在 Curtains 的 onReady() 内部调用这种类型的“onCom
我想实现与在 http://nautil.us 上类似的“幕布”效果. 我写了一个运行良好的脚本,这是我的 JSFiddle 。该函数如下所示: function curtain() {
我说的是像 this FullToss one 这样的网站和 this ASUS one . 我对每个 float 元素似乎以不同速度滚动的方式着迷。以及当用户向下或向上滚动页面时,背景是如何分层和像
我正在使用 curtains.js from github作为视差效果,但我想更改动画效果。当我滚动当前元素上升但我希望下一个元素高于当前元素时,有没有人知道如何做到这一点 谢谢 最佳答案 我猜您是在
我正在尝试制作一个包含未知数量元素的列表,当它悬停在 div 上方时,它会从下面动画出来,这样列表看起来像是被下拉而不是调整大小。 (jquery slideDown() 和 slideToggle(
如果我的“幕布”div 在固定 DIV 之外,我就无法使其透明。在下面的示例中,我想实现视差幕 DIV 的透明度,而不必将其放置在视差 DIV 内。 https://jsfiddle.net/0kfa
我目前正在制作一个网站,可以在 www.TheOneCraft.co.uk 上看到。 它使用 curtain.js jquery 插件在用户向下滚动时为幻灯片/页面设置动画,但我一直在尝试“但失败”让
在我看来,Guice 实现在处理泛型时做了一些非常棘手的事情。看起来它在运行时就知道在编译时使用的泛型类型。让我们看一个简单的例子: @Inject public void Bar(Provider
假设我正在运行我的应用程序 sakana.herokuapp.com 我拥有域 www.fishywebsites.com 如果我指向我的 DNS 昵称 对于 鱼腥网站 指向 sakana.herok
我是一名优秀的程序员,十分优秀!