基於jQuery實現的Accordion手風琴自定義插件

来源:http://www.cnblogs.com/cxyzj/archive/2016/11/20/6082863.html
-Advertisement-
Play Games

目前網上有很多各種各樣的手風琴插件,但是沒有一個完整實現了的側菜單,今天寫了一個可以無限子節點的手風琴側菜單,有需要的可以參考一下,有什麼好的想法可以留言。(沒有經過徹底測試,不過問題應該不大) 下麵老規矩,直接貼代碼: ...


目前網上有很多各種各樣的手風琴插件,但是沒有一個完整實現了的側菜單,今天寫了一個可以無限子節點的手風琴側菜單,有需要的可以參考一下,有什麼好的想法可以留言。(沒有經過徹底測試,不過問題應該不大)

下麵老規矩,直接貼代碼:

  1 (function ($) {
  2     'use strict';
  3     var defaults = {
  4         url: null,
  5         param: {},
  6         data: {},
  7         fill: true,
  8         level_space: 15,
  9         onitemclick: null,
 10         style: {
 11             header: "accordion-header",
 12             header_title: "accordion-header-title",
 13             content: "accordion-content",
 14             selected: "selected",
 15             icon_base: "fa",
 16             icon_collapse: "fa-angle-up",
 17             icon_expand: "fa-angle-down"
 18         }
 19     }
 20     var methods = {
 21         init: function (options) {
 22             return this.each(function () {
 23                 var $this = $(this);
 24                 if (!$this.hasClass("accordion")) {
 25                     $this.addClass("accordion");
 26                 }
 27                 var settings = $this.data('tw.accordion');
 28                 if (typeof (settings) == 'undefined') {
 29                     settings = $.extend({}, defaults, options);
 30                     $this.data('tw.accordion', settings);
 31                 } else {
 32                     settings = $.extend({}, settings, options);
 33                     $this.data('tw.accordion', settings);
 34                 }
 35                 if (settings.url) {
 36                     $.ajax({
 37                         type: "post",
 38                         async: false,
 39                         url: settings.url,
 40                         data: settings.param,
 41                         success: function (data) {
 42                             settings.data = data;
 43                         }
 44                     });
 45                 }
 46                 if (settings.fill) {
 47                     $this.height("100%");
 48                 }
 49                 if (settings.data.length > 0) {
 50                     $this.data("count", settings.data.length);
 51                     $.each(settings.data, function () {
 52                         this.level = 1;
 53                         var item = $this.accordion("add", this);
 54                         $this.append(item);
 55                     });
 56                     if ($this.find("." + settings.style.selected).length == 0) {
 57                         var data = $this.find(">li:first-child").data("data");
 58                         $this.accordion("select", data);
 59                     }
 60                 }
 61             });
 62         },
 63         add: function (data) {
 64             var $this = $(this);
 65             var settings = $this.data("tw.accordion");
 66             var item = $("<li class='" + settings.style.header + "'></li>");
 67             item.data("data", data);
 68             var header = $("<div class='" + settings.style.header_title + "' data-accordion='" + data.id + "'>" +
 69                 "<i class='" + settings.style.icon_base + "" + data.icon + "'></i>" +
 70                 "<span>" + data.name + "</span></div>");
 71             header.css("padding-left", settings.level_space * data.level);
 72             item.append(header);
 73             if (data.childrens) {
 74                 var toggle = $("<i class='" + settings.style.icon_base + "" + settings.style.icon_collapse + "'></i>");
 75                 toggle.css({ "font-size": "1.4em", "position": "absolute", "top": "7px", "right": "7px" });
 76                 header.append(toggle);
 77                 var content = $("<ul class='" + settings.style.content + "'></ul>");
 78                 content.data("count", data.childrens.length);
 79                 $.each(data.childrens, function () {
 80                     this.level = data.level + 1;
 81                     var child = $this.accordion("add", this);
 82                     content.append(child);
 83                 });
 84                 item.append(content);
 85             }
 86             header.click(function () {
 87                 $this.accordion("select", data);
 88             });
 89             if (data.selected) {
 90                 $this.accordion("select", data);
 91             }
 92             return item;
 93         },
 94         select: function (data) {
 95             var $this = $(this);
 96             var settings = $this.data("tw.accordion");
 97             var header = $this.find("[data-accordion='" + data.id + "']");
 98             var item = header.parent();
 99             if (!header.hasClass(settings.style.selected) && !item.hasClass(settings.style.selected)) {
100                 var sibling = item.siblings();
101                 sibling.removeClass(settings.style.selected).children("." + settings.style.selected).removeClass(settings.style.selected);
102                 sibling.children("." + settings.style.icon_expand).removeClass(settings.style.icon_expand).addClass(settings.style.icon_collapse);
103                 if (data.childrens) {
104                     item.addClass(settings.style.selected);
105                     header.find("." + settings.style.icon_collapse).removeClass(settings.style.icon_collapse).addClass(settings.style.icon_expand);
106                     if (settings.fill) {
107                         var count = item.parent().data("count") - 1;
108                         item.css("height", "calc(100% - " + (item.height() * count) + "px)");
109                     }
110                 } else {
111                     header.addClass(settings.style.selected);
112                 }
113             }
114             if (settings.onitemclick) {
115                 settings.onitemclick(data);
116             }
117         },
118         update: function (url, param) {
119             var $this = $(this);
120             var settings = $this.data("tw.accordion");
121             if (typeof url == "object") {
122                 settings.param = url;
123             } else {
124                 settings.url = url;
125                 settings.param = param;
126             }
127             $this.accordion("init", settings);
128         },
129         destroy: function (options) {
130             return $(this).each(function () {
131                 var $this = $(this);
132                 $this.removeData('accordion');
133             });
134         }
135     }
136     $.fn.accordion = function () {
137         var method = arguments[0];
138         var args = arguments;
139         if (typeof (method) == 'object' || !method) {
140             method = methods.init;
141         } else if (methods[method]) {
142             method = methods[method];
143             args = $.makeArray(arguments).slice(1);
144         } else {
145             $.error('Method ' + method + ' does not exist on tw.accordion');
146             return this;
147         }
148         return method.apply(this, args);
149     }
150 })(jQuery);
  1 .accordion {
  2     margin:0;
  3     padding:0;
  4     font-size:14px;
  5 }
  6     .accordion > .accordion-header {
  7         list-style: none;
  8         margin: 0;
  9         padding: 0;
 10         border-bottom: 1px solid #ddd;
 11     }
 12         .accordion > .accordion-header.selected > .accordion-header-title {
 13             color: #0094ff;
 14         }
 15         .accordion > .accordion-header > .accordion-header-title {
 16             position: relative;
 17             width: 100%;
 18             height: 35px;
 19             line-height: 35px;
 20             background: #eee;
 21             border-bottom: 1px solid #ccc;
 22             cursor: pointer;
 23         }
 24             .accordion > .accordion-header > .accordion-header-title > i:first-child {
 25                 font-size: 1.3em;
 26             }
 27             .accordion > .accordion-header > .accordion-header-title > span {
 28                 position: relative;
 29                 top: -1px;
 30                 left: 5px;
 31             }
 32         .accordion > .accordion-header > .accordion-content {
 33             display: none;
 34             width: 100%;
 35             height: calc(100% - 35px);
 36             margin: 0;
 37             padding: 0;
 38         }
 39         .accordion > .accordion-header.selected > .accordion-content {
 40             display: block;
 41         }
 42 .accordion-content > .accordion-header {
 43         list-style: none;
 44         margin: 0;
 45         padding: 0;
 46 }
 47     .accordion-content > .accordion-header.selected {
 48         color: #0094ff;
 49     }
 50     .accordion-content > .accordion-header > .accordion-header-title {
 51         position: relative;
 52         width: 100%;
 53         height: 32px;
 54         line-height: 32px;
 55         cursor: pointer;
 56         border-bottom: 1px solid #ccc;
 57     }
 58         .accordion-content > .accordion-header > .accordion-header-title:hover {
 59             background:#eee;
 60         }
 61         .accordion-content > .accordion-header > .accordion-header-title.selected {
 62             color: #fff;
 63             background: #0094ff;
 64             border-left: 3px solid #ff6a00;
 65             border-bottom: 0px;
 66         }
 67             .accordion-content > .accordion-header > .accordion-header-title > i:first-child {
 68                 font-size: 1.2em;
 69             }
 70             .accordion-content > .accordion-header > .accordion-header-title > span {
 71                 position: relative;
 72                 top: -1px;
 73                 left: 5px;
 74             }
 75             .accordion-content > .accordion-header > .accordion-header-title.selected > i:first-child {
 76                 position:relative;
 77                 left:-3px;
 78             }
 79             .accordion-content > .accordion-header > .accordion-header-title.selected > span {
 80                 position: relative;
 81                 top: -1px;
 82                 left: 2px;
 83             }
 84         .accordion-content > .accordion-header > .accordion-content {
 85             display: none;
 86             width: 100%;
 87             height: calc(100% - 32px);
 88             margin: 0;
 89             padding: 0;
 90         }
 91         .accordion-content > .accordion-header.selected > .accordion-content {
 92             display: block;
 93         }

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 響亮的標題:一個萬能的,保底的。面向過程改寫成面向對象的方法 前提朗讀:很多剛接觸js面向對象的時候都不知道如何能快速的寫出一個面向對象的程式,這個是必然的現象,不是每一位學js的一上來就會寫面向對象的程式。小編這裡介紹的方法屬於一個面向過程到面向對象的過度期間,(這裡要明白麵向對象的一些常識:構造 ...
  • 今天整理了一下瀏覽器對JS的相容問題,希望能給你們帶來幫助,我沒想到的地方請留言給我,我再加上; 常遇到的關於瀏覽器的寬高問題: event事件問題: DOM節點相關的問題,我直接封裝了函數,以便隨時可以拿來使用: document.getElementsByClassName問題: 獲取元素的非行 ...
  • 1、v-if 指令可以完全根據表達式的值在Dom中生成或移除一個元素。 例如: <div id ="example"> <p v-if="greeting">Hello!</p> </div> <script> new Vue({ el:"#example", data:{ greeting:fal ...
  • 1.盒子模型 標準CSS盒子模型=content+padding+border+margin; IE盒子模型:content+margin(content裡面已經包含了padding+margin); 2.行內元素?塊級元素?空元素? 行內元素:a、b、span、img、input、strong、s ...
  • 通過對比js、php、c三門語言的for迴圈,加強自己對js變數作用域和php for迴圈的理解。 ...
  • 最近在看《javascript數據結構和演算法》這本書,補一下數據結構和演算法部分的知識,覺得自己這塊是短板。 做點小筆記。 ...
  • JSON序列化輸出 var xiaoming = { name: '小明', age: 14, gender: true, height: 1.65, grade: null, 'middle-school': '\"W3C\" Middle School', skills: ['JavaScrip ...
  • 國內目前關註最高,維護最好的一個關於nodejs的網站應該是http://www.cnodejs.org/ windows系統下簡單nodejs環境配置。 第一步:下載安裝文件 下載地址:官網 https://nodejs.org/en/download/ 這裡用的是 第二步:安裝nodejs 下載 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...