使用JavaScript实现某个功能或解决问题-手风琴效果 | 青训营

92 阅读4分钟

实现功能和步骤及相关知识点

a. 首先 实现动画过程函数createAnimation(options){ }(当使用时要注意其用法)
  1. 我们将会设置 from( 起始值) , to(结束值) , totalMS (变化总时间), duration(动画间隔时间) , times(变化总次数) , dis( 每一次变化改变的值) ,curTime(当前变化的次数)
  2. 使用在指定的时间间隔内重复执行某个函数或代码块的函数setInterval({}, )
  3. 在setInterval 函数中将会单独考虑变化次数达到时的情况: 将起始值设置成结束值 清除结束重复函数
function createAnimation(options) {
  var from = options.from; // 起始值
  var to = options.to; // 结束值
  var totalMS = options.totalMS || 1000; // 变化总时间
  var duration = options.duration || 15; // 动画间隔时间
  var times = Math.floor(totalMS / duration); // 变化的次数
  var dis = (to - from) / times; // 每一次变化改变的值
  var curTimes = 0; // 当前变化的次数
  var timerId = setInterval(function () {
    from += dis;
    curTimes++; // 当前变化增加一次
    if (curTimes >= times) {
      // 变化的次数达到了
      from = to; // 变化完成了
      clearInterval(timerId); // 不再变化了
      options.onend && options.onend();
    }
    // 无数的可能性
    options.onmove && options.onmove(from);
  }, duration);
}
知识点:
  • options.onmove && options.onmove(from);

这是一个条件语句,用于检查 options 对象是否有 onmove 属性,以及该属性是否为一个函数。如果这两个条件都满足,那么就会调用 onmove 函数,并将 from 作为参数传递给它。

  • onend onmove

onend 和 onmove 都是 JavaScript 中的事件处理函数,通常用于处理与动画或用户交互相关的事件。

onend 事件处理函数通常在动画或过渡效果结束时执行。例如,当一个元素的 CSS 过渡效果结束时,可以使用 onend 事件处理函数来触发其他操作。在使用某些 JavaScript 动画库时,也经常会使用 onend 事件处理函数来在动画结束时触发其他操作。

onmove 事件处理函数通常用于处理与用户交互相关的事件,例如鼠标移动或触摸事件。例如,当用户在页面上拖动一个元素时,可以使用 onmove 事件处理函数来更新元素的位置,并实时反馈给用户。在某些 JavaScript 库中,也可以使用 onmove 事件处理函数来实现拖放功能。

需要注意的是,onend 和 onmove 只是事件处理函数的名称,它们不是 JavaScript 中内置的属性或方法。通常,我们需要为元素或对象添加这些事件处理函数,以便在事件发生时执行相应的操作。

  • options.onmove && options.onmove(from);

这是一个条件语句,用于检查 options 对象是否有 onmove 属性,以及该属性是否为一个函数。如果这两个条件都满足,那么就会调用 onmove 函数,并将 from 作为参数传递给它。

具体来说,options.onmove 表示从 options 对象中获取 onmove 属性。&& 是逻辑与运算符,如果前面的条件为真,则继续执行后面的语句,否则直接返回前面的结果。所以,如果 options 对象中有 onmove 属性,且该属性为函数类型,那么 options.onmove && options.onmove(from) 这条语句就会执行,否则就会被跳过。

b. 获得每个需要展开的元素(其元素有个兄弟元素为我们需要展开的内容),设置相关值,并对每个元素设置onclick事件
c. 设置打开子菜单元素
  1. 使用createAnimation函数 但注意使用其函数是有注意事项的 必须是在子菜单关闭的状态下设置其函数

所以我们应该最先去新建给子菜单一个属性var status = subMenu.getAttribute('status'); 其状态有opened ,closed ,playing

  1. 如果状态不是关闭则啥也不干 继续以下操作
  2. 在将状态改为playing
  3. 开始设置动画函数(有相应注意事项
d. 关闭子菜单函数与打开函数有异曲同工之妙
e. 设置子菜单切换函数 (主要是确保打开其它子菜单时 已打开的子菜单关闭 页面只有一个子菜单打开)
  1. 得到子菜单的状态
  2. 若子菜单没有处于正在播放动画状态 则继续以下操作
  3. 若子菜单状态为打开 关闭其子菜单
  4. 若子菜单状态为为关闭,则 打开子菜单
f. 全局细节化

在给每个菜单设置的onclick事件里面

  1. 找到其已经打开的兄弟元素 相对应的子菜单 并对其关闭子菜单
  2. 切换子菜单

注意切换的不是this 而是this的下一个兄弟元素

知识点:
  • this.nextElementSibling

this.nextElementSibling 是 JavaScript 中的 DOM 元素属性,表示当前元素的下一个兄弟元素节点

我的易错点:

  • 实现动画过程函数createAnimation(options){ }:

options.onmove && options.onmove(from);

options.onend && options.onend();缺一不可

  • 在关闭 打开子菜单元素中 设置的动画函数中切忌省略他们onmove onend属性
onmove: function (n) {
      subMenu.style.height = n + 'px';
    },
    onend: function () {
      subMenu.setAttribute('status', 'opened');
    },