基于jQuery实现Accordion手风琴自定义插件

目前网上有很多各种各样的手风琴插件,但是没有一个完整实现了的侧菜单,今天写了一个可以无限子节点的手风琴侧菜单,有需要的可以参考一下,有什么好的想法可以留言。(没有经过彻底测试,不过问题应该不大)

下面老规矩,直接贴代码:

(function ($) {
  'use strict';
  var defaults = {
    url: null,
    param: {},
    data: {},
    fill: true,
    level_space: 15,
    onitemclick: null,
    style: {
      header: "accordion-header",
      header_title: "accordion-header-title",
      content: "accordion-content",
      selected: "selected",
      icon_base: "fa",
      icon_collapse: "fa-angle-up",
      icon_expand: "fa-angle-down"
    }
  }
  var methods = {
    init: function (options) {
      return this.each(function () {
        var $this = $(this);
        if (!$this.hasClass("accordion")) {
          $this.addClass("accordion");
        }
        var settings = $this.data('tw.accordion');
        if (typeof (settings) == 'undefined') {
          settings = $.extend({}, defaults, options);
          $this.data('tw.accordion', settings);
        } else {
          settings = $.extend({}, settings, options);
          $this.data('tw.accordion', settings);
        }
        if (settings.url) {
          $.ajax({
            type: "post",
            async: false,
            url: settings.url,
            data: settings.param,
            success: function (data) {
              settings.data = data;
            }
          });
        }
        if (settings.fill) {
          $this.height("100%");
        }
        if (settings.data.length > 0) {
          $this.data("count", settings.data.length);
          $.each(settings.data, function () {
            this.level = 1;
            var item = $this.accordion("add", this);
            $this.append(item);
          });
          if ($this.find("." + settings.style.selected).length == 0) {
            var data = $this.find(">li:first-child").data("data");
            $this.accordion("select", data);
          }
        }
      });
    },
    add: function (data) {
      var $this = $(this);
      var settings = $this.data("tw.accordion");
      var item = $("<li class='" + settings.style.header + "'></li>");
      item.data("data", data);
      var header = $("<div class='" + settings.style.header_title + "' data-accordion='" + data.id + "'>" +
        "<i class='" + settings.style.icon_base + "" + data.icon + "'></i>" +
        "<span>" + data.name + "</span></div>");
      header.css("padding-left", settings.level_space * data.level);
      item.append(header);
      if (data.childrens) {
        var toggle = $("<i class='" + settings.style.icon_base + "" + settings.style.icon_collapse + "'></i>");
        toggle.css({ "font-size": "1.4em", "position": "absolute", "top": "7px", "right": "7px" });
        header.append(toggle);
        var content = $("<ul class='" + settings.style.content + "'></ul>");
        content.data("count", data.childrens.length);
        $.each(data.childrens, function () {
          this.level = data.level + 1;
          var child = $this.accordion("add", this);
          content.append(child);
        });
        item.append(content);
      }
      header.click(function () {
        $this.accordion("select", data);
      });
      if (data.selected) {
        $this.accordion("select", data);
      }
      return item;
    },
    select: function (data) {
      var $this = $(this);
      var settings = $this.data("tw.accordion");
      var header = $this.find("[data-accordion='" + data.id + "']");
      var item = header.parent();
      if (!header.hasClass(settings.style.selected) && !item.hasClass(settings.style.selected)) {
        var sibling = item.siblings();
        sibling.removeClass(settings.style.selected).children("." + settings.style.selected).removeClass(settings.style.selected);
        sibling.children("." + settings.style.icon_expand).removeClass(settings.style.icon_expand).addClass(settings.style.icon_collapse);
        if (data.childrens) {
          item.addClass(settings.style.selected);
          header.find("." + settings.style.icon_collapse).removeClass(settings.style.icon_collapse).addClass(settings.style.icon_expand);
          if (settings.fill) {
            var count = item.parent().data("count") - 1;
            item.css("height", "calc(100% - " + (item.height() * count) + "px)");
          }
        } else {
          header.addClass(settings.style.selected);
        }
      }
      if (settings.onitemclick) {
        settings.onitemclick(data);
      }
    },
    update: function (url, param) {
      var $this = $(this);
      var settings = $this.data("tw.accordion");
      if (typeof url == "object") {
        settings.param = url;
      } else {
        settings.url = url;
        settings.param = param;
      }
      $this.accordion("init", settings);
    },
    destroy: function (options) {
      return $(this).each(function () {
        var $this = $(this);
        $this.removeData('accordion');
      });
    }
  }
  $.fn.accordion = function () {
    var method = arguments[0];
    var args = arguments;
    if (typeof (method) == 'object' || !method) {
      method = methods.init;
    } else if (methods[method]) {
      method = methods[method];
      args = $.makeArray(arguments).slice(1);
    } else {
      $.error('Method ' + method + ' does not exist on tw.accordion');
      return this;
    }
    return method.apply(this, args);
  }
})(jQuery);
.accordion {
  margin:0;
  padding:0;
  font-size:14px;
}
  .accordion > .accordion-header {
    list-style: none;
    margin: 0;
    padding: 0;
    border-bottom: 1px solid #ddd;
  }
    .accordion > .accordion-header.selected > .accordion-header-title {
      color: #0094ff;
    }
    .accordion > .accordion-header > .accordion-header-title {
      position: relative;
      width: 100%;
      height: 35px;
      line-height: 35px;
      background: #eee;
      border-bottom: 1px solid #ccc;
      cursor: pointer;
    }
      .accordion > .accordion-header > .accordion-header-title > i:first-child {
        font-size: 1.3em;
      }
      .accordion > .accordion-header > .accordion-header-title > span {
        position: relative;
        top: -1px;
        left: 5px;
      }
    .accordion > .accordion-header > .accordion-content {
      display: none;
      width: 100%;
      height: calc(100% - 35px);
      margin: 0;
      padding: 0;
    }
    .accordion > .accordion-header.selected > .accordion-content {
      display: block;
    }
.accordion-content > .accordion-header {
    list-style: none;
    margin: 0;
    padding: 0;
}
  .accordion-content > .accordion-header.selected {
    color: #0094ff;
  }
  .accordion-content > .accordion-header > .accordion-header-title {
    position: relative;
    width: 100%;
    height: 32px;
    line-height: 32px;
    cursor: pointer;
    border-bottom: 1px solid #ccc;
  }
    .accordion-content > .accordion-header > .accordion-header-title:hover {
      background:#eee;
    }
    .accordion-content > .accordion-header > .accordion-header-title.selected {
      color: #fff;
      background: #0094ff;
      border-left: 3px solid #ff6a00;
      border-bottom: 0px;
    }
      .accordion-content > .accordion-header > .accordion-header-title > i:first-child {
        font-size: 1.2em;
      }
      .accordion-content > .accordion-header > .accordion-header-title > span {
        position: relative;
        top: -1px;
        left: 5px;
      }
      .accordion-content > .accordion-header > .accordion-header-title.selected > i:first-child {
        position:relative;
        left:-3px;
      }
      .accordion-content > .accordion-header > .accordion-header-title.selected > span {
        position: relative;
        top: -1px;
        left: 2px;
      }
    .accordion-content > .accordion-header > .accordion-content {
      display: none;
      width: 100%;
      height: calc(100% - 32px);
      margin: 0;
      padding: 0;
    }
    .accordion-content > .accordion-header.selected > .accordion-content {
      display: block;
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单

    先给大家看下效果图,效果图展示如下: 关键代码如下所示: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>首页</title> &l

  • jquery实现的Accordion折叠面板效果代码

    本文实例讲述了jquery实现的Accordion折叠面板效果代码.分享给大家供大家参考.具体如下: 这是一款Accordion折叠面板,折叠菜单代码,简单Accordion效果,采用CSS与jQuery实现,鼠标点击后展开,再次点击后折叠起来.是网上很常用的手风琴效果. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-Simple-Accordion-style-codes/ 具体代码如下: <!DOCTYPE html PUBL

  • 学习ExtJS accordion布局

    一.Accordion布局由类Ext.layout.Accordion定义,表示可折叠的布局,点击每一个子元素的头部名称或右边的按钮,则会展开该面板,并收缩其它已经展开的面板. layoutConfig:true表示在执行展开折叠时启动动画效果,默认值为false. 二.应用举例 复制代码 代码如下: Ext.onReady(function(){ var _panel = new Ext.Panel({ title:"人员信息", renderTo:Ext.getBody(), fr

  • jQuery EasyUI API 中文文档 - Panel面板

    用$.fn.panel.defaults重写defaults.用法示例 创建Panel 1. 经由标记创建Panel 从标记创建Panel更容易.把 'easyui-panel' 类添加到<div/>标记. 复制代码 代码如下: <div id="p" class="easyui-panel" title="My Panel" style="width:500px;height:150px;padding:10px;b

  • jquery实现简单合拢与展开网页面板的方法

    本文实例讲述了jquery实现简单合拢与展开网页面板的方法.分享给大家供大家参考.具体如下: 这是一款网页上常见的合拢(收缩).伸展面板代码,使用了jQuery插件,代码更加简化,点击面板的标题栏即可折叠.或展开这个层,是网上很流行的效果,由此可扩展出的功能还真挺多,只要动脑筋,一定能做出来. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-simple-hidden-show-web-table-codes/ 具体代码如下: <!

  • jQuery实现的简单折叠菜单(折叠面板)效果代码

    本文实例讲述了jQuery实现的简单折叠菜单(折叠面板)效果代码.分享给大家供大家参考.具体如下: 这是一款基于jQuery实现的折叠菜单,可展开一些内容,实际上称它为一个面板比较好,是一个折叠面板,使用了jQuery1.6.2插件. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-simple-toggle-zd-menu-codes/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD X

  • jQuery EasyUI Accordion可伸缩面板组件使用详解

    Accordion 可伸缩面板组件,基于panel,示例如下: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <script type="text/javascript" src="easyui/jquery.min.js"></script> <script type=

  • ajaxToolkit:AccordionPane演示与应用实例

    一个展开收合的ajaxToolkit:AccordionPane控件.Insus.NET在专案有用到它. 因为它可以节省显示空间.不过有点不足,就是用户刚开始使用,需要记得每个AccordionPane内容.或是需要使用一个显而可见的名字.下面的演示中,只是两个收合AccordionPane,如果多个的话,就会有上面提及的问题. 下面是HTML:ajaxToolkit:Accordion 复制代码 代码如下: <ajaxToolkit:Accordion ID="Accordion1&qu

  • Mootools 1.2 手风琴(Accordion)教程

    创建和配置一个基本的手风琴很简单,但是你一定要认真看完全文,因为更多的高级选项可能有一些复杂. 基础知识 创建一个新的手风琴 要创建一个新的手风琴,你需要选择一些成对的元素--包含标题和内容.因此,首先,需要给每一个标题和每一个内容块分别指定一个css类名: 参考代码: 复制代码 代码如下: <h3 class="togglers">Toggle 1</h3> <p class="elements">Here is the con

  • jQuery实现可展开合拢的手风琴面板菜单

    本文实例讲述了jQuery实现可展开合拢的手风琴面板菜单.分享给大家供大家参考.具体如下: 这是一款大家都常见的折叠菜单,手风琴折叠面板,会展开和合拢,带点Flash动画效果,修改时请注意: slideUp : 通过高度变化(向上减小)来动态地隐藏所有匹配的元素,在隐藏完成后可选地触发一个回调函数.这个动画效果只调整元素的高度,可以使匹配的元素以"滑动"的方式隐藏起来. slideDown: 通过高度变化(向下增大)来动态地显示所有匹配的元素,在显示完成后可选地触发一个回调函数.这个动

随机推荐