- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望为 jQuery 动画制作一个自定义缓动函数,我找到了一个很好的例子来说明如何在 jQuery 中扩展缓动。查看:Looking for jQuery easing functions without using a plugin .
但是这种方法不适合我。
我有一个函数,不仅需要处理基于时间的值,还需要处理基于开始和值的值。示例:
$("selector").animate({ "height": "1400px" }, 1000);
我发现的方法使用一个函数接收 5 个参数,然后所有参数都与时间相关。
但我还需要更多。我还需要起始值(DOM 在动画之前的值)和结束值(DOM 在动画之后的值)。
在我的示例中,该值指的是高度(原始高度和 1400 像素)。
我知道您想知道为什么我需要值信息,所以我已经编写了自定义函数:
var offset = 400;
function myEasing(millisecondsSince, totalMilliseconds, startValue, endValue) {
var t = millisecondsSince / totalMilliseconds;
if (startValue == 0) startValue = 0.000001;
if (t <= 0.5) {
var m = (Math.log(endValue - offset) - Math.log(startValue))
/ (0.5 * Math.LN10);
var n = Math.log(startValue) / Math.LN10;
return Math.pow(10, m * t + n); // y = 10 ^ (mx + n)
}
var m = 2 * Math.pow(offset, 0.2);
return Math.pow(m * t - m, 5) + endValue; // y = (mx - m) ^ 5 + endValue
}
但我的问题是如何将此函数合并到 jQuery.animate()
中。谁能帮帮我?
最佳答案
这是我在 SO 上的第一次击键,我既没有帐户也没有个人资料,也没有任何声誉,但我正在开发一个 jQuery 插件,它允许为缓动函数添加额外的参数。
为了回答您的问题,我做了以下假设(如果我错了请告诉我,我会更新我的答案):1. 你使用 jQuery >= 1.8(他们在那里修改了他们的动画例程)。2. 你的 $("selector") 可能包含多个元素。3. 动画属性的 startValue(此处为“高度”)可能因元素而异。4. 只要有办法合并您的函数,您就不会坚持使用自定义缓动。
我看到了两个解决方案。为了解释我所做的事情和原因,这里是 jQuery 核心的一个片段:
// jQuery creates for each animated property of each animated element a Tween object.
// .run() of its prototype is called at each step of the animation.
Tween.prototype = {
run: function( percent ) {
// percent = actual state of the animation, a number between 0 (start) and 1 (end)
// percent is identic with your var t, you dont need to recalculate it
// this refers to the whole Tween object you are actual in
var eased,
hooks = Tween.propHooks[ this.prop ];
if ( this.options.duration ) {
// here the choosen easing function is called. It must be declared in $.easing under its name
// before animation is running, otherwise an error is thrown. But before starting you don't know
// the startValue, so your function can't reference to it
this.pos = eased = jQuery.easing[ this.easing ](
// here the five arguments are passed in. Every easing function in $.easing, even custom ones,
// have this signature (x, t, b, c, d), they may use the arguments or not. Changing this signature
// breaks any other code that relies on easings
percent, this.options.duration * percent, 0, 1, this.options.duration
// But being shameless, you may extend the signature with the additional arguments you need
/* percent, this.options.duration * percent, 0, 1, this.options.duration, this.start, this.end */
// now there are seven arguments and you can restructure your function to use the three you need
);
} else {
this.pos = eased = percent;
} // at this point the easing result is stored in this.pos. When using 'linear' its identic with percent
// (and with your var t) so we can use this.pos in the second solution
// after calculation this.now holds the actual value of the animated property. When you havn't done
// the modification above, you can't use your function for easing and this.now hasn't the value you want
this.now = ( this.end - this.start ) * eased + this.start;
if ( this.options.step ) {
// if you have defined a function in options.step it gets called now. Two arguments are passed in:
// the actual value, the whole Tween object. The latter holds all values you need
// to recalculate this.now with your function
this.options.step.call( this.elem, this.now, this );
}
if ( hooks && hooks.set ) {
hooks.set( this );
} else {
Tween.propHooks._default.set( this );
}
return this;
}
};
解决方案1:您已经完成上述jQuery 的修改。然后:
var offset = 400;
$.easing["myFunction"] = function(x, t, b, c, d, startValue, endValue) {
/* replace your var t with x; args t b c d not needed; your done; */
};
$("selector").animate({ "height": "1400px" }, 1000, "myFunction");
解决方案 2:您不会在 jQuery 中乱搞。然后:
您可以将选项对象传递给 .animate(),而不是持续时间、缓动和完成的离散参数。详情见http://api.jquery.com/animate/ .使用 specialEasing,您可以分别定义每个属性的缓动。这样你就保留了所有的可能性在同一个调用中为除“height”之外的其他属性设置动画,而不用“myFunction”影响它们。
$("selector").animate(
{ height: "1400px" , otherProp: "otherVal"}, {
duration: 1000, // your duration
specialEasing: {
height: "linear" // easing happens before step, linear won't confuse your calculations
otherProp: "anyEasingYouWant"
},
step: function(now, tween) {
// you are restricted to the two arguments jQuery passes to this function. But the Tween object
// holds all values you need to modify tween.now (= the animation output value) as you like
// if you animate more than one property and want apply your calcs only to one, do exclusions here.
// it's needed cause this function is executed once for each property of each element at each step.
if (tween.prop !== "height") return;
var ofs = 400, // your offset
stv = tween.start || 0.000001, // your startValue
env = tween.end, // your endValue
dif = env - stv, // difference between start and end to recalculate the actual value
pos = tween.pos, // your var t
m, n;
if (pos <= 0.5) {
m = (Math.log(env - ofs) - Math.log(stv)) / (0.5 * Math.LN10);
n = Math.log(stv) / Math.LN10;
tween.now = dif * Math.pow(10, m * pos + n) + stv; // y = 10 ^ (mx + n)
} else {
m = 2 * Math.pow(offset, 0.2);
tween.now = dif * (Math.pow(m * pos - m, 5) + env) + stv; // y = (mx - m) ^ 5 + endValue
}
}
}
);
关于javascript - 具有访问值的自定义 jQuery 缓动函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20638964/
好的,所以我编辑了以下... 只需将以下内容放入我的 custom.css #rt-utility .rt-block {CODE HERE} 但是当我尝试改变... 与 #rt-sideslid
在表格 View 中,我有一个自定义单元格(在界面生成器中高度为 500)。在该单元格中,我有一个 Collection View ,我按 (10,10,10,10) 固定到边缘。但是在 tablev
对于我的无能,我很抱歉,但总的来说,我对 Cocoa、Swift 和面向对象编程还很陌生。我的主要来源是《Cocoa Programming for OS X》(第 5 版),以及 Apple 的充满
我正在使用 meta-tegra 为我的 NVIDIA Jetson Nano 构建自定义图像。我需要 PyTorch,但没有它的配方。我在设备上构建了 PyTorch,并将其打包到设备上的轮子中。现
在 jquery 中使用 $.POST 和 $.GET 时,有没有办法将自定义变量添加到 URL 并发送它们?我尝试了以下方法: $.ajax({type:"POST", url:"file.php?
Traefik 已经默认实现了很多中间件,可以满足大部分我们日常的需求,但是在实际工作中,用户仍然还是有自定义中间件的需求,为解决这个问题,官方推出了一个 Traefik Pilot[1] 的功
我想让我的 CustomTextInputLayout 将 Widget.MaterialComponents.TextInputLayout.OutlinedBox 作为默认样式,无需在 XML 中
我在 ~/.emacs 中有以下自定义函数: (defun xi-rgrep (term) (grep-compute-defaults) (interactive "sSearch Te
我有下表: 考虑到每个月的权重,我的目标是在 5 个月内分散 10,000 个单位。与 10,000 相邻的行是我最好的尝试(我在这上面花了几个小时)。黄色是我所追求的。 我试图用来计算的逻辑如下:计
我的表单中有一个字段,它是文件类型。当用户点击保存图标时,我想自然地将文件上传到服务器并将文件名保存在数据库中。我尝试通过回显文件名来测试它,但它似乎不起作用。另外,如何将文件名添加到数据库中?是在模
我有一个 python 脚本来发送电子邮件,它工作得很好,但问题是当我检查我的电子邮件收件箱时。 我希望该用户名是自定义用户名,而不是整个电子邮件地址。 最佳答案 发件人地址应该使用的格式是: You
我想减小 ggcorrplot 中标记的大小,并减少文本和绘图之间的空间。 library(ggcorrplot) data(mtcars) corr <- round(cor(mtcars), 1)
GTK+ noob 问题在这里: 是否可以自定义 GtkFileChooserButton 或 GtkFileChooserDialog 以删除“位置”部分(左侧)和顶部的“位置”输入框? 我实际上要
我正在尝试在主页上使用 ajax 在 magento 中使用 ajax 显示流行的产品列表,我可以为 5 或“N”个产品执行此操作,但我想要的是将分页工具栏与结果集一起添加. 这是我添加的以显示流行产
我正在尝试使用 PasswordResetForm 内置函数。 由于我想要自定义表单字段,因此我编写了自己的表单: class FpasswordForm(PasswordResetForm):
据我了解,新的 Angular 7 提供了拖放功能。我搜索了有关 DnD 的 Tree 组件,但没有找到与树相关的内容。 我在 Stackblitz 上找到的一个工作示例.对比drag'ndrop功能
我必须开发一个自定义选项卡控件并决定使用 WPF/XAML 创建它,因为我无论如何都打算学习它。完成后应该是这样的: 到目前为止,我取得了很好的进展,但还有两个问题: 只有第一个/最后一个标签项应该有
我要定制xtable用于导出到 LaTeX。我知道有些问题是关于 xtable在这里,但我找不到我要找的具体东西。 以下是我的表的外观示例: my.table <- data.frame(Specif
用ejs在这里显示日期 它给我结果 Tue Feb 02 2016 16:02:24 GMT+0530 (IST) 但是我需要表现为 19th January, 2016 如何在ejs中执行此操作?
我想问在 JavaFX 中使用自定义对象制作 ListView 的最佳方法,我想要一个每个项目如下所示的列表: 我搜了一下,发现大部分人都是用细胞工厂的方法来做的。有没有其他办法?例如使用客户 fxm
我是一名优秀的程序员,十分优秀!