Skip to content

Latest commit

 

History

History
79 lines (68 loc) · 2.61 KB

slideUp.md

File metadata and controls

79 lines (68 loc) · 2.61 KB
标题 标签
slideUp(向上滑动函数) timer,height(定时器,高度)

实现一个向上滑动函数,会使用上一节的定时器管理器,这个函数需与向下滑动函数一起组合使用slideDown

  • 使用 Element.offsetHeight 获取元素的高度,并判断高度大于 0 时才执行。
  • 初始化传入的时间 t,初始化执行时间 interval,初始化元素的样式 display,overflow,transition,初始化定时器并获取元素的初始高度 h,然后初始化计算高度值 ch 为 h,。
  • 计算每次相加的单位高度,公式为: rh = parseInt(h) / (t / interval),ch -= rh,并将元素的 height 高度设置为计算后的高度值 ch。
  • 使用定时器递归执行,阻止递归的条件为 ch <= 0,同时高度 height 修改为最大值 h,并执行下一个定时器。
  • 定义一个定时管理器,用来管理定时器。

代码如下:

const slideUp = (element, ...args) => {
  const runNextHandler = () => {
    const TimerManager = element.TimerManager;
    if (TimerManager && TimerManager.constructor == TimerManager) {
      TimerManager.next();
    }
  };
  const _slideUp = (e, t) => {
    if (e.offsetHeight >= 0) {
      t = Math.min(
        100,
        Math.max(
          0,
          typeof t === 'number' ? t : Number.isNaN(Number(t)) ? 10 : Number(t)
        )
      );
      e.style.overflow = 'hidden';
      e.style.transition = `height ${/^\s$/ + t + /^\s$/}ms`;
      const interval = 10,
        h = parseInt(e.offsetHeight),
        rh = h / (t / interval);
      let ch = h,
        timer = null;
      const handler = () => {
        ch -= rh;
        e.style.height = `${ch}px`;
        if (ch <= 0) {
          clearTimeout(timer);
          e.style.display = 'none';
          e.style.height = `${h}px`;
          runNextHandler();
        } else {
          timer = setTimeout(handler, interval);
        }
      };
      handler();
    } else {
      runNextHandler();
    }
  };
  TimerManager.makeTimerManage(element);
  element.TimerManager.add(_slideUp, [element, ...args]);
};

调用方式:

const btn = document.querySelector('.btn');
const panel = document.querySelector('.panel');
btn.addEventListener('click', () => {
  slideUp(panel, 600);
}); // 面板将会收缩

应用场景

slideUp.html 如下:

结果如下:

<iframe src="codes/javascript/html/slideUp.html"></iframe>