JSスポーツセット、便利なパッケージ機能機能
35036 ワード
アニメの原理
均等運動
各要素が独自のタイマーを持つように、タイマー名を要素の属性に付けます.緩動運動:まず加速して減速して変換します.
元素によって属性が変わる.透明度の緩み:
異なる要素の複数の属性が変化します.コールバック機構:コールバック関数、アニメーションが完了したら実行します.
均等運動
// 1. s = vt v
let btn = document.querySelector("button");
let div = document.querySelector(".box");
btn.onclick = function () {
starMove(div, 300)
};
// + -
function starMove(dom, target) {
clearInterval(dom.timer);
let speed = 7; //
dom.timer = setInterval(() => {
//
speed = (target - dom.offsetLeft) > 0 ? 7 : -7;
//
// - <
if (Math.abs(target - div.offsetLeft) < Math.abs(speed)) {
clearInterval(dom.timer);
dom.style.left = target + "px";
} else {
dom.style.left = dom.offsetLeft + speed + "px";
}
}, 30);
}
運動をやわらげる各要素が独自のタイマーを持つように、タイマー名を要素の属性に付けます.緩動運動:まず加速して減速して変換します.
// 2.
let btn = document.querySelector("button");
let div = document.querySelector(".box");
btn.onclick = function () {
startMove(div, 500)
};
function startMove(dom, target) {
let speed = null;
let step = 7;
clearInterval(dom.timer);
dom.timer = setInterval(() => {
//
// ( )
speed = (target - dom.offsetLeft) / step;
//
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
//
if (dom.offsetLeft == target) {
clearInterval(dom.timer);
} else {
// speed + -
dom.style.left = dom.offsetLeft + speed + "px";
}
}, 30);
};
属性の緩動運転元素によって属性が変わる.透明度の緩み:
//
function getStyle(dom, attr) {
if (window.getComputedStyle) {
return window.getComputedStyle(dom, null)[attr];
} else {
return dom.currentStyle[attr];
}
}
// 3.
let btn = document.querySelector("button");
let div = document.querySelector(".box");
btn.onclick = function () {
// 100
startMove(div, "opacity", 20);
};
//
function startMove(dom, target) {
clearInterval(dom.timer);
let speed = null,
iCur = null;
let step = 7;
dom.timer = setInterval(function () {
iCur = parseFloat(getStyle(dom, "opacity")) * 100;
// speed 。
// ( )
speed = (target - iCur) / step;
//
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
//
if (iCur == target) {
clearInterval(dom.timer);
} else {
dom.style.opacity = (iCur + speed) / 100;
}
}, 30);
};
パッケージはすべての属性の緩動に適しています. // 4.
function startMove(dom, attr, target) {
let speed = null,
iCur = null;
let step = 7;
clearInterval(dom.timer);
dom.timer = setInterval(function () {
// opacity
if (attr == "opacity") {
iCur = parseFloat(getStyle(dom, attr)) * 100;
} else {
iCur = parseFloat(getStyle(dom, attr));
}
//
speed = (target - iCur) / step; //
//
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
if (iCur == target) {
clearInterval(dom.timer);
} else {
if (attr == "opacity") {
dom.style.opacity = (iCur + speed) / 100;
} else {
// speed + -
dom.style[attr] = iCur + speed + "px";
}
}
}, 30);
}
複数の属性が同時に入ってきます.異なる要素の複数の属性が変化します.コールバック機構:コールバック関数、アニメーションが完了したら実行します.
// 5.
let btn = document.querySelector("button");
let div = document.querySelector(".box");
btn.onclick = function () {
// 100
startMove(div, {
width: 400,
height: 400,
opacity: 50 // 100
});
};
// :
// 1. ,
// 2. , *100
// 3. : opacity /100
// 4. flag = true
// 5. . . flag = false
// 6. ,
// 7. , ,
function startMove(dom, attrObj, callback) {
clearInterval(dom.timer);
let speed = null,
iCur = null;
const step = 7;
dom.timer = setInterval(function () {
let flag = true; //
//
for (let attr in attrObj) {
// opacity
if (attr == "opacity") {
iCur = parseFloat(getStyle(dom, attr)) * 100;
} else {
iCur = parseFloat(getStyle(dom, attr));
}
//
speed = (attrObj[attr] - iCur) / step;; //
// console.log(speed);
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); //
// opacity
if (attr == "opacity") {
dom.style.opacity = (iCur + speed) / 100;
} else {
dom.style[attr] = iCur + speed + "px";
}
//
if (iCur != attrObj[attr]) {
flag = false;
}
}
// true
if (flag) {
clearInterval(dom.timer);
// :callback false ,callback callback()
callback && callback();
}
}, 30);
}