【发布时间】:2023-03-15 09:09:01
【问题描述】:
我有 2 个需要制作动画的 div:
<div class="d"></div>
<div class="p"></div>
第一个 div 的宽度应该变成 70%,第二个 div 的宽度应该变成 30%。但是,当我尝试为一个又一个 div 设置动画时,首先调用 70% 的函数,然后调用 30% 的函数,它们的宽度都变为 30%。
Javascript 代码:
Anim({
target: document.getElementsByClassName('d')[0],
drawFunc: (progress, element) => {
element.style.width = (progress * 70) + '%';
}
});
Anim({
target: document.getElementsByClassName('p')[0],
drawFunc: (progress, element) => {
element.style.width = (progress * 30) + '%';
}
});
我不明白为什么会发生这种情况以及如何使这两个功能正常工作。
如果需要,编码 sn-p:
(() => {
"use strict";
const init = (params) => {
const start = performance.now();
const element = params.target || null;
requestAnimationFrame(function animate(time) {
let timeFraction = (time - start) / params.duration;
if (timeFraction > 1) {
timeFraction = 1;
}
const progress = params.timingFunc(timeFraction, params.timingArg);
params.drawFunc(progress, element);
if (timeFraction < 1) {
requestAnimationFrame(animate);
}
if (params.callback) {
if (timeFraction >= 1) {
params.callback();
}
}
});
};
const timingFunctions = {
linear: (timeFraction) => {
return timeFraction;
}
};
const paces = {
easeIn: (func) => {
return timingFunctions[func];
}
};
const defaultParams = {
duration: 1000,
timingFunc: paces.easeIn('linear'),
timingArg: null,
delay: null,
callback: null
};
const makeParams = (def, add) => {
let params = def;
if (add) {
for (let i in add) {
if (Object.prototype.hasOwnProperty.call(add, i)) {
params[i] = add[i];
}
}
}
return params;
};
function Anim(paramArgs) {
const params = makeParams(defaultParams, paramArgs);
if ('timingFunc' in paramArgs) {
params.timingFunc = (typeof paramArgs.timingFunc === 'function') ? paramArgs.timingFunc : paces[paramArgs.timingFunc.pace](paramArgs.timingFunc.func);
}
if (!params.delay) {
init(params);
} else {
setTimeout(() => {
init(params);
}, params.delay);
}
}
window.Anim = Anim;
})();
Anim({
target: document.getElementsByClassName('d')[0],
drawFunc: (progress, element) => {
element.style.width = (progress * 70) + '%';
}
});
Anim({
target: document.getElementsByClassName('p')[0],
drawFunc: (progress, element) => {
element.style.width = (progress * 30) + '%';
}
});
.d, .p {
background-color: red;
height: 50px;
width: 0;
margin-top: 10px;
}
<div class="d"></div>
<div class="p"></div>
【问题讨论】:
-
console.log("p1:"+progress);会给你答案 ;) -
if (Object.prototype.hasOwnProperty.call(add, i)) {这里发生了什么?这里调用了hasOwnProperty方法吗?为什么不直接使用 is 呢? -
@messerbill 是的,这里调用了 hasOwnProperty 方法。我需要 IE8 支持,直接使用在那里不起作用。
-
:'D 好旧的 IE .....这很清楚....如果你看到某种看起来很奇怪的代码,请考虑一下......嗯,一定是 IE修复:D 告诉您的客户是时候升级他们的浏览器了
-
@messerbill 这个链接很好地解释了为什么我写 Object.prototype.hasOwnProperty.call 而不是直接使用:stackoverflow.com/questions/12017693/…
标签: javascript