UNPKG

rabbit-simple-ui

Version:

A simple UI component library based on JavaScript

158 lines (143 loc) 6.08 kB
/* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable prefer-rest-params */ // @ts-nocheck export default window.Slider = (() => { // 定义Slider对象 const Slider = { slideDown: (el: Element, time: number) => { void 0; }, slideUp: (el: Element, time: number) => { void 0; } }; // I.定义一个TimerManager类 // 1)构造函数 function TimerManager() { this.timers = []; // 保存定时器 this.args = []; // 保存定时器的参数 this.isFiring = false; } // 2)静态方法:为element添加一个TimerManager实例 TimerManager.makeInstance = function (element) { // 如果element.__TimerManager__上没有TimerManager,就为其添加一个 if (!element.__TimerManager__ || element.__TimerManager__.constructor != TimerManager) { element.__TimerManager__ = new TimerManager(); } }; // 3)扩展TimerManager原型,分别实现add,fire,next方法 TimerManager.prototype.add = function (timer, args) { this.timers.push(timer); this.args.push(args); this.fire(); }; TimerManager.prototype.fire = function () { if (!this.isFiring) { const timer = this.timers.shift(), // 取出定时器 args = this.args.shift(); // 取出定时器参数 if (timer && args) { this.isFiring = true; // 传入参数,执行定时器函数 timer(args[0], args[1]); } } }; TimerManager.prototype.next = function () { this.isFiring = false; this.fire(); }; // II. 修改动画函数并在定时器结束后调用element.__TimerManager__.next() // 1)下滑函数 function fnSlideDown(element, time) { if (element.offsetHeight == 0) { //如果当前高度为0,则执行下拉动画 // 获取元素总高度 element.style.display = 'block'; // 1.显示元素,元素变为可见 const totalHeight = element.offsetHeight; // 2.保存总高度 element.style.height = '0px'; // 3.再将元素高度设置为0,元素又变为不可见 // 定义一个变量保存元素当前高度 let currentHeight = 0; // 当前元素高度为0 // 计算每次增加的值 const increment = totalHeight / (time / 10); // 开始循环定时器 const timer = setInterval(() => { // 增加一部分高度 currentHeight += increment; // 把当前高度赋值给height属性 element.style.height = `${currentHeight}px`; // 如果当前高度大于或等于总高度则关闭定时器 if (currentHeight >= totalHeight) { // 关闭定时器 clearInterval(timer); // 把高度设置为总高度 element.style.height = `${totalHeight}px`; if ( element.__TimerManager__ && element.__TimerManager__.constructor == TimerManager ) { element.__TimerManager__.next(); } } }, 10); } else { // 如果当前高度不为0,则直接执行队列里的下一个函数 if (element.__TimerManager__ && element.__TimerManager__.constructor == TimerManager) { element.__TimerManager__.next(); } } } // 2)上拉函数 function fnSlideUp(element, time) { if (element.offsetHeight > 0) { // 如果当前高度不为0,则执行上滑动画 // 获取元素总高度 const totalHeight = element.offsetHeight; // 定义一个变量保存元素当前高度 let currentHeight = totalHeight; // 计算每次减去的值 const decrement = totalHeight / (time / 10); // 开始循环定时器 const timer = setInterval(() => { // 减去当前高度的一部分 currentHeight -= decrement; // 把当前高度赋值给height属性 element.style.height = `${currentHeight}px`; // 如果当前高度小于等于0,就关闭定时器 if (currentHeight <= 0) { // 关闭定时器 clearInterval(timer); // 把元素display设置为none element.style.display = 'none'; // 把元素高度值还原 element.style.height = `${totalHeight}px`; if ( element.__TimerManager__ && element.__TimerManager__.constructor == TimerManager ) { element.__TimerManager__.next(); } } }, 10); } else { // 如果当前高度为0, 则直接执行队列里的下一个函数 if (element.__TimerManager__ && element.__TimerManager__.constructor == TimerManager) { element.__TimerManager__.next(); } } } // III.定义外部访问接口 // 1)下拉接口 Slider.slideDown = function (element, time) { TimerManager.makeInstance(element); element.__TimerManager__.add(fnSlideDown, arguments); return this; }; // 2)上滑接口 Slider.slideUp = function (element, time) { TimerManager.makeInstance(element); element.__TimerManager__.add(fnSlideUp, arguments); return this; }; // 返回Slider对象 return Slider; })();