251 lines
7.2 KiB
Plaintext
251 lines
7.2 KiB
Plaintext
export class xdAnimation {
|
|
public static translate(
|
|
view : HTMLElement,
|
|
duration : number = 1000,
|
|
delay : number = 0,
|
|
translation : number = 0, //0平行移x,1平移y,2平移x,y
|
|
fromLen : number = 0, // 起始位置
|
|
len : number = 0, // 移动的距离
|
|
loop : number = 0,//-1永久播放动画,0循环1次,依次类推
|
|
start : (() => void) | null = null,
|
|
end : (() => void) | null = null
|
|
) {
|
|
view.style.transitionDuration = `${0}ms`;
|
|
view.style.transitionDelay = `${0}ms`;
|
|
view.style.transitionTimingFunction = 'linear'
|
|
// 设置初始位置
|
|
if (translation === 0) {
|
|
view.style.transform = `translateX(${fromLen}px)`;
|
|
|
|
} else if (translation === 1) {
|
|
view.style.transform = `translateY(${fromLen}px)`;
|
|
} else if (translation === 2) {
|
|
view.style.transform = `translate(${fromLen}px, ${fromLen}px)`;
|
|
}
|
|
|
|
function starttras() {
|
|
// 设置动画持续时间
|
|
view.style.transitionDuration = `${duration}ms`;
|
|
// 设置动画延迟
|
|
view.style.transitionDelay = `${delay}ms`;
|
|
if (translation === 0) {
|
|
console.log(fromLen, len)
|
|
view.style.transform = `translateX(${len}px)`;
|
|
} else if (translation === 1) {
|
|
view.style.transform = `translateY(${len}px)`;
|
|
} else if (translation === 2) {
|
|
view.style.transform = `translate(${len}px, ${len}px)`;
|
|
}
|
|
|
|
// 动画开始回调
|
|
if (start) start();
|
|
}
|
|
// 设置动画结束后的位置
|
|
if (delay == 0) {
|
|
setTimeout(() => {
|
|
starttras()
|
|
}, 50);
|
|
} else {
|
|
setTimeout(() => {
|
|
starttras()
|
|
}, delay);
|
|
}
|
|
let _this = this;
|
|
// 动画结束后的处理
|
|
view.addEventListener('transitionend', () => {
|
|
if (loop === -1) {
|
|
// 永久循环
|
|
_this.translate(view, duration, delay, translation, fromLen, len, loop, start, end);
|
|
} else if (loop > 0) {
|
|
// 有限循环
|
|
_this.translate(view, duration, delay, translation, fromLen, len, loop - 1, start, end);
|
|
} else {
|
|
// 动画结束回调
|
|
if (end) end();
|
|
}
|
|
}, { once: true });
|
|
}
|
|
|
|
public static scale(
|
|
view : HTMLElement,
|
|
duration : number = 1000,
|
|
delay : number = 0,
|
|
direction : number = 0, // 0: 水平缩放, 1: 竖直翻转,2:x,y缩放,
|
|
fromScale : number = 0, // 起始位置
|
|
scale : number = 0, // 移动的距离
|
|
loop : number = 0,//-1永久播放动画,0循环1次,依次类推
|
|
start : (() => void) | null = null,
|
|
end : (() => void) | null = null
|
|
) {
|
|
view.style.transitionDuration = `${0}ms`;
|
|
view.style.transitionDelay = `${0}ms`;
|
|
view.style.transitionTimingFunction = 'linear'
|
|
// 设置初始位置
|
|
function setValue(value : number) {
|
|
if (direction === 0) {
|
|
view.style.transform = `scaleX(${value})`;
|
|
|
|
} else if (direction === 1) {
|
|
view.style.transform = `scaleY(${value})`;
|
|
} else if (direction === 2) {
|
|
view.style.transform = `scale(${value}, ${value})`;
|
|
}
|
|
}
|
|
setValue(fromScale)
|
|
function starttras() {
|
|
// 设置动画持续时间
|
|
view.style.transitionDuration = `${duration}ms`;
|
|
// 设置动画延迟
|
|
view.style.transitionDelay = `${delay}ms`;
|
|
setValue(scale)
|
|
// 动画开始回调
|
|
if (start) start();
|
|
}
|
|
// 设置动画结束后的位置
|
|
if (delay == 0) {
|
|
setTimeout(() => {
|
|
starttras()
|
|
}, 50);
|
|
} else {
|
|
setTimeout(() => {
|
|
starttras()
|
|
}, delay);
|
|
}
|
|
let _this = this;
|
|
// 动画结束后的处理
|
|
view.addEventListener('transitionend', () => {
|
|
if (loop === -1) {
|
|
// 永久循环
|
|
_this.scale(view, duration, delay, direction, fromScale, scale, loop, start, end);
|
|
} else if (loop > 0) {
|
|
// 有限循环
|
|
_this.scale(view, duration, delay, direction, fromScale, scale, loop - 1, start, end);
|
|
} else {
|
|
// 动画结束回调
|
|
if (end) end();
|
|
}
|
|
}, { once: true });
|
|
}
|
|
|
|
public static rotate(
|
|
view : HTMLElement,
|
|
duration : number = 1000,
|
|
delay : number = 0,
|
|
fromDeg : number = 0, // 起始位置
|
|
deg : number = 0, // 移动的距离
|
|
loop : number = 0,//-1永久播放动画,0循环1次,依次类推
|
|
start : (() => void) | null = null,
|
|
end : (() => void) | null = null
|
|
) {
|
|
view.style.transitionDuration = `${0}ms`;
|
|
view.style.transitionDelay = `${0}ms`;
|
|
view.style.transitionTimingFunction = 'linear'
|
|
// 设置初始位置
|
|
function setValue(value : number) {
|
|
view.style.transform = `rotate(${value}deg)`;
|
|
}
|
|
setValue(fromDeg)
|
|
function starttras() {
|
|
// 设置动画持续时间
|
|
view.style.transitionDuration = `${duration}ms`;
|
|
view.style.transitionTimingFunction = 'linear'
|
|
// 设置动画延迟
|
|
view.style.transitionDelay = `${delay}ms`;
|
|
setValue(deg)
|
|
// 动画开始回调
|
|
if (start) start();
|
|
}
|
|
// 设置动画结束后的位置
|
|
if (delay == 0) {
|
|
setTimeout(() => {
|
|
starttras()
|
|
}, 50);
|
|
} else {
|
|
setTimeout(() => {
|
|
starttras()
|
|
}, delay);
|
|
}
|
|
let _this = this;
|
|
// 动画结束后的处理
|
|
view.addEventListener('transitionend', () => {
|
|
if (loop === -1) {
|
|
// 永久循环
|
|
_this.rotate(view, duration, delay, fromDeg, deg, loop, start, end);
|
|
} else if (loop > 0) {
|
|
// 有限循环
|
|
_this.rotate(view, duration, delay, fromDeg, deg, loop - 1, start, end);
|
|
} else {
|
|
// 动画结束回调
|
|
if (end) end();
|
|
}
|
|
}, { once: true });
|
|
}
|
|
|
|
|
|
public static flip3D(
|
|
view : HTMLElement,
|
|
duration : number = 1000,
|
|
delay : number = 0,
|
|
axis : number = 1, // 0: X轴, 1: Y轴
|
|
fromDeg : number = 0, // 起始位置
|
|
deg : number = 0, // 移动的距离
|
|
loop : number = 0,//-1永久播放动画,0循环1次,依次类推
|
|
cameraDistance : number = 8, // 控制视角距离,默认值更合理
|
|
scaleZ : number = 0.8, // 控制Z轴缩放,默认值更自然
|
|
start : (() => void) | null = null,
|
|
end : (() => void) | null = null
|
|
) {
|
|
view.style.transitionDuration = `${0}ms`;
|
|
view.style.transitionDelay = `${0}ms`;
|
|
view.style.transitionTimingFunction = 'linear'
|
|
// 设置透视视角
|
|
view.style.perspective = `${cameraDistance}px`;
|
|
view.style.transformStyle = "preserve-3d";
|
|
// 设置动画延迟
|
|
view.style.transitionDelay = `${0}ms`;
|
|
|
|
// 设置动画持续时间
|
|
view.style.transitionDuration = `${0}ms`;
|
|
// 设置初始角度
|
|
function setValue(value : number) {
|
|
if (axis === 0) {
|
|
view.style.transform = `rotateX(${value}deg) scaleZ(${scaleZ})`;
|
|
} else if (axis === 1) {
|
|
view.style.transform = `rotateY(${value}deg) scaleZ(${scaleZ})`;
|
|
}
|
|
}
|
|
|
|
setValue(fromDeg)
|
|
|
|
// 设置动画结束后的角度
|
|
setTimeout(() => {
|
|
// 设置动画延迟
|
|
view.style.transitionDelay = `${delay}ms`;
|
|
// 设置动画持续时间
|
|
view.style.transitionDuration = `${duration}ms`;
|
|
setValue(deg)
|
|
// 动画开始回调
|
|
if (start) start();
|
|
}, delay || 50);
|
|
|
|
let _this = this;
|
|
// 动画结束后的处理
|
|
view.addEventListener('transitionend', () => {
|
|
if (loop === -1) {
|
|
// 永久循环
|
|
_this.flip3D(view, duration, delay, axis, fromDeg, deg, loop, cameraDistance, scaleZ, start, end);
|
|
} else if (loop > 0) {
|
|
// 有限循环
|
|
_this.flip3D(view, duration, delay, axis, fromDeg, deg, loop - 1, cameraDistance, scaleZ, start, end);
|
|
} else {
|
|
// 动画结束回调
|
|
if (end) end();
|
|
}
|
|
}, { once: true });
|
|
}
|
|
public static clearAnimations(view : HTMLElement, _ : boolean = true) {
|
|
view.style.removeProperty('transform')
|
|
view.style.removeProperty('transition-delay')
|
|
view.style.removeProperty('transition-duration')
|
|
}
|
|
} |