Установка:
Добавляем на сайт библиотеку jQuery, CSS и JS файлы
HTML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<div class="accordion-group"> <h3 class="accordion-header default-open">Заголовок 1</h3> <div class="accordion-body"> <p>Текст 1</p> <div class="accordion-group" data-multiple="true"> <h3 class="f20 accordion-header">Заголовок 1.1</h3> <div class="accordion-body"> <p>Текст 1.1</p> </div> <h3 class="f20 accordion-header">Заголовок 1.2</h3> <div class="accordion-body"> <p>Текст 1.2</p> </div> <h3 class="f20 accordion-header">Заголовок 1.3</h3> <div class="accordion-body"> <p>Текст 1.3</p> </div> </div> </div> <h3 class="accordion-header default-open">Заголовок 2</h3> <div class="accordion-body"> <p>Текст 2</p> </div> </div> |
Атрибут data-multiple
определяет открытые вкладки (только одна или все)
CSS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
.accordion-group { margin: 16px 0; } .accordion-body { display: none; padding: 14px 20px; background: #FFF; border-radius: 5px; margin: 8px 0; border: 2px solid #BFE2FF; } .accordion-body > * > .accordion-body { background: #FFF; margin: 0; } .accordion-header { background: #BFE2FF; margin: 8px 0; color: #000; padding: 8px 40px 8px 20px; cursor: pointer; border-radius: 5px; position: relative; } .accordion-header::after { content: "+"; right: 16px; font-family: Courier; font-size: 28px; line-height: 28px; font-weight: bold; color: #337AB7; position: absolute; } .accordion-header.open { background: #337AB7; color: #fff; font-weight: bold } .accordion-header.open::after { content: "-"; color: #FFF; } |
JS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
;(function ($, window, document, undefined) { "use strict"; var pluginName = 'simpleAccordion', defaults = { multiple: false, speedOpen: 300, speedClose: 150, easingOpen: null, easingClose: null, headClass: 'accordion-header', bodyClass: 'accordion-body', openClass: 'open', defaultOpenClass: 'default-open', cbClose: null, //function (e, $this) {}, cbOpen: null //function (e, $this) {} }; function Accordion(element, options) { this.$el = $(element); this.options = $.extend({}, defaults, options); this._defaults = defaults; this._name = pluginName; if (typeof this.$el.data('multiple') !== 'undefined') { this.options.multiple = this.$el.data('multiple'); } else { this.options.multiple = this._defaults.multiple; } this.init(); } Accordion.prototype = { init: function () { var o = this.options, $headings = this.$el.children('.' + o.headClass); $headings.on('click', {_t:this}, this.headingClick); $headings.filter('.' + o.defaultOpenClass).first().click(); }, headingClick: function (e) { var $this = $(this), _t = e.data._t, o = _t.options, $headings = _t.$el.children('.' + o.headClass), $currentOpen = $headings.filter('.' + o.openClass); if (!$this.hasClass(o.openClass)) { if ($currentOpen.length && o.multiple === false) { $currentOpen.removeClass(o.openClass).next('.' + o.bodyClass).slideUp(o.speedClose, o.easingClose, function () { if ($.isFunction(o.cbClose)) { o.cbClose(e, $currentOpen); } $this.addClass(o.openClass).next('.' + o.bodyClass).slideDown(o.speedOpen, o.easingOpen, function () { if ($.isFunction(o.cbOpen)) { o.cbOpen(e, $this); } }); }); } else { $this.addClass(o.openClass).next('.' + o.bodyClass).slideDown(o.speedOpen, o.easingOpen, function () { $this.removeClass(o.defaultOpenClass); if ($.isFunction(o.cbOpen)) { o.cbOpen(e, $this); } }); } } else { $this.removeClass(o.openClass).next('.' + o.bodyClass).slideUp(o.speedClose, o.easingClose, function () { if ($.isFunction(o.cbClose)) { o.cbClose(e, $this); } }); } } }; $.fn[pluginName] = function (options) { return this.each(function () { if (!$.data(this, 'plugin_' + pluginName)) { $.data(this, 'plugin_' + pluginName, new Accordion(this, options)); } }); }; }(jQuery, window, document)); |
И подключаем скрипт:
1 2 3 |
$(function() { $('.accordion-group').simpleAccordion(); }); |
Настройки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$('.accordion-group').simpleAccordion({ multiple: false, // возможность открытия одной вкладки или всех speedOpen: 300, // скорость открытия вкладки speedClose: 150, // скорость закрытия вкладки easingOpen: null, // эффект плавности открытия вкладки easingClose: null, // эффект плавности закрытия вкладки headClass: 'accordion-header', // класс для заголовка вкладки bodyClass: 'accordion-body', // класс для тела вкладки openClass: 'open', // класс для открытой вкладки, применяется к accordion-header defaultOpenClass: 'default-open', // класс для открытой вкладки по умолчанию cbClose: null, // callback-функция при закрытии вкладки - function (e, $this) {}, cbOpen: null // callback-функция при открытии вкладки - function (e, $this) {} }); |
Здравствуйте!
Отличный аккордеон, но можно ли как-то сделать так, чтобы одной определенной кнопкой открывались и закрывались все элементы аккордеона?
Буду признателен с:
На разные кнопки так:
HTML:
jQuery:
На одну кнопку тоже можно придумать, но там будет путаница и для пользователя, когда открыты вкладки, будет не понятно, складывать все или раскрывать.
О почему анимация такая дерганная. Сначала чуть приоткрывает, а потом открывает доконца. Как сделать просто плавное раскрытие?
У меня он не притормаживает, но примерно понимаю о чем вы.
Эти все эффекты скорее зависят от нагрузки компа или браузера.
И соответственно от того что анатомируется.
Развернуть 10 строчек - одно, а менять так страницы сайта - тут можно зависнуть просто и вообще ничего не откроется.
Он не поттармаживает, видно, что это анимацией делается. Комп у меня совсем зверь, на нем ничего не подтормаживает. Большой похоже на плавность анимации, типа дельта по умолчанию какая то экзотическая
Попробуйте вместо margin использовать padding
Проблему решил, виноватым было свойство *{transoition.2s}. Видимо из-за того, что глобальное.
Проблемы давно решил. Дергалось из-за глобального свойства transition. Было прописано через звездочку для всех элементов.
Здравствуйте! Имею сайт одностраничный. Хочу в указанный аккордеон на каждый раздел установить юридический калькулятор . Устанавливаю скрипт на первый раздел калькулятор открывается. Добавляю скрипт на второй раздел не открывает. Подскажите пожалуйста, как это можно реализовать. С Большим к Вам уважением.
Ну тут пример не помешал бы. Какая то ошибка...
Друзья, всем привет.
Не получается в одной вкладке сделать несколько блоков с классом <div class="accordion-body">
Дублирую этот див и он просто не появляется.
А accordion-header не забываете?
Можете попробывать в вакууме на codepen
Спасибо за отличный аккордеон, мне кажется что для людей которые не особо понимают что и как делается и копипастят бездумно следует добавить что :
-подключаем сначала jQuerry
-копируем JS код в [*].js
-подключаем [*].js внизу страницы
-в [*].js после добавления кода аккордеона не забываем его включить строчками
=)
Почему у меня не работает? =\ создаю файл html, css и js с помощью бутстрап. после этого запускаю браузер, нажимаю меню и она не открывается. Что не так? посмотрел консоль не было ошибок.
Дайте ссылку.
Кстати у бутстрапа есть свой аккордеон же
Вот ссылка https://jsfiddle.net/k1unovrd/ это пример вам которые я создал файл html, css и js. Обратите внимание, что там прикрепил ссылка директорий setting.js - это настройка, jquery.js - подключении скрипт , test.js - у вас на статье спойлер "JS:". Далее посмотрите на результате, что оно никак не раскрывающий список. Никак.
на счет бутстрапа.. Да свой, но вот только тяжело писать код для многоуровненвый и путаниц. А у вас покороче и понятнее, чем бутстрап.
То что на jsfiddle у вас - у меня работает, если подключить jQuery 3, например.
Если у вас подключена первая (версии не помню сейчас от какой до какой), например, 1.12.4, как в вордпрессе, то возникает ошибка: TypeError: $ is not a function (это из консоли)
Чтобы полечить ее, замените $ на jQuery
Странно.. как заменить $ на jQuery? прошу привести пример (не обязательно подробный исход. код)
Автозаменой все $ на jQuery
или еще проще
Код из //setting.js поместите в:
А то что у вас ниже
Это лишнее, аккордион у вас подключается в setting с настройками.
Увы, не работает. Ладно, буду время - дольше изучу. А так спасибо за все;)
https://codepen.io/atuin/pen/rNNvzpM
А как сделать чтобы по умолчание даже первая вкладка была закрыта ?
Убрать
у заголовка
Спасибо дружище! И спасибо за твои посты! Ты супер!
Рад был помочь, обращайтесь, если нужно 🙂