js封装动画函数

以下俩个封装动画函数一般用于一些特效(例:轮播图,手风琴,运动的小球等等)

匀速动画函数封装

function animate(element, target) {
	//先清理定时器,这样可以保证每次点击按钮都只产生一个定时器
	clearInterval(element.timeId);
	element.timeId = setInterval(function() {
		//获取div的当前位置
		var current = element.offsetLeft;
		//设置每次移动多少像素
		var step = 10;
		step = current < target ? step : -step;
		//每次移动后的位置
		current += step;
		//判断当前位置距离目标位置多少像素
		if (Math.abs(current - target) >= Math.abs(step)) {
			element.style.left = current + "px";
		} else {
			clearInterval(element.timeId);
			element.style.left = target + "px";
		}
	}, 10);
}

变速动画函数封装

//功能函数  变速
function animate(element, target) {
	//先清理定时器,这样可以保证每次点击按钮都只产生一个定时器
	clearInterval(element.timeId);
	element.timeId = setInterval(function() {
		//获取div的当前位置
		var current = element.offsetLeft;
		//设置每次移动多少像素
		var step = (target - current) / 10;
		step = step > 0 ? Math.ceil(step) : Math.floor(step);
		//每次移动后的位置
		current += step;
		element.style.left = current + "px";
		//判断如果到达目标位置
		if (current == target) {
			//清理定时器
			clearInterval(element.timeId);
		}
	}, 10);
}


### JavaScript 动画封装函数的核心概念 JavaScript 中的动画可以通过定时器(`setInterval` 或 `setTimeout`)实现动态更新 DOM 元素的位置或其他样式属性。为了简化重复性的动画逻辑,通常会将这些操作封装成一个通用的动画函数。 #### 核心原理 动画的本质是通过不断改变目标元素的某个 CSS 属性值,在视觉上形成平滑的变化效果[^1]。这种变化通常是基于时间间隔逐步完成的,因此需要借助定时器来控制每一帧的渲染频率。 #### 实现步骤 1. **初始化参数**:定义初始状态、目标状态以及每一步的时间间隔。 2. **计算增量**:根据当前值与目标值之间的差值决定每次调整的幅度。 3. **应用缓动算法**:为了让动画更加自然流畅,可以引入线性或非线性缓动公式。 4. **清理资源**:当动画结束时清除定时器以释放内存。 下面是一个典型的动画函数封装示例: ```javascript function animate(element, target, duration = 500, callback) { clearInterval(element.timer); // 清除之前的定时器以防冲突 const startValue = parseFloat(getComputedStyle(element).getPropertyValue('left')); // 获取起始位置 const changeInValue = target - startValue; const startTime = performance.now(); // 使用高精度计时器获取开始时刻 element.timer = setInterval(() => { const currentTime = performance.now(); const elapsed = Math.min((currentTime - startTime), duration); // 应用缓动公式 (这里采用简单的线性插值) const progress = easeInOut(elapsed / duration); const currentValue = startValue + (changeInValue * progress); element.style.left = `${currentValue}px`; if (elapsed >= duration) { clearInterval(element.timer); delete element.timer; if (callback && typeof callback === 'function') { callback(); // 执行回调函数 } } }, 17); // 大约60fps刷新率对应的毫秒数 } // 缓动函数例子 function easeInOut(t) { return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t; } ``` 上述代码实现了基本的位移动画功能,并支持自定义持续时间和可选的回调机制[^4]。 #### 添加回调函数的支持 在某些场景下可能希望知道动画何时完全结束以便触发后续动作。为此可以在动画完成后调用指定的回调函数。上面的例子已经展示了这一特性。 #### 将动画函数独立至外部文件 如果项目规模较大或者想要复用该动画逻辑,则可以把此方法提取出来保存在一个单独的 `.js` 文件里供其他页面导入使用。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值