2014-10-30 3 views
0

У меня есть функция адаптивного аккордеона внутри веб-сайта, и я хочу (открыть) и (закрыть) весь контент одной кнопкой, которая также изменит его содержимое на (открытое), когда все содержимое закрывается и закрывается, когда все содержимое открыто.Аккордеон открыть/закрыть все содержимое кнопки и больше

Также теперь содержимое, которое уже было открыто, снова закрывается при использовании кнопки (открыть), а значки «плюс» и «минус» не реагируют правильно, показывая значок (минус), когда содержимое закрыто и наоборот.

Вот fiddle

Может кто-нибудь помочь мне с этим?

// Accordion // 

$('.header').click(function(){ 
    $('.content',$(this).parent()).slideToggle(); 
    $(this).toggleClass('active'); 
}) 

$('.toggle-btn').click(function(){ 
    $('.content').slideToggle(); 
    $(this).toggleClass('active'); 
}) 

ответ

0

Там вы идете: http://jsfiddle.net/w3srayj6/21/

// Accordion // 

$(document).ready(function() { 

    $('.header').click(function(){ 
     $('.content',$(this).parent()).slideToggle(); 
     $(this).toggleClass('active'); 
     $('.toggle-btn').addClass('active').trigger("change"); 
    }) 

}); 

$(document).ready(function() { 
    $('.toggle-btn').change(function(){ 
     var headers = $('.header'); 
     var state = 'open'; 
     $.each(headers,function(){ 
      if($(this).hasClass('active')) 
       state = 'close'; 
     }); 
     if(state == 'open') 
      $(this).addClass('active') 
     $(this).text(state); 
    }); 
    $('.toggle-btn').click(function(){ 
     var current = $(this); 
     current.toggleClass('active'); 
     current.trigger("change"); 
     var contents = $('.content'); 
     $.each(contents, function(){ 
      if(!current.hasClass('active')) 
       $(this).slideUp(); 
      else 
       $(this).slideDown(); 
     }); 
     var headers = $('.header'); 
     $.each(headers, function(){ 
      if(current.hasClass('active')) 
       $(this).addClass('active'); 
      else 
       $(this).removeClass('active'); 
     });  
     current.trigger("change"); 
    }) 

}); 

// Read more // 

$(window).scroll(function() { 
    if ($(this).scrollTop() < 20) { 
     $('.read-more').slideDown(200); 
    } else { 
     console.log('there'); 
     $('.read-more').slideUp(200); 
    } 
}); 

Иногда работа с переключателями может быть немного сложной и запутанной.

В этом случае я использовал «hasClass», чтобы определить, открыты ли элементы или нет. Поскольку у нас есть только «открытые» и «закрытые» состояния, мы можем сказать, что до тех пор, пока «open» не является «активным» (на нем активен класс), мы должны добавить флаг «active» класса ко всем заголовкам и содержание. то же самое в противоположной ситуации. это гарантирует, что уже переключенные элементы не будут повторно переключены.

+0

спасибо товарищу! Большой! Где я могу поместить изменение в открытое, чтобы закрыть состояние в этом скрипте? – KP83

+0

Извините, не понял ваш вопрос – MorKadosh

+0

Извините, что это запутывает, потому что там много разных состояний, но даже если есть один контент, открытая кнопка меняет свое имя, чтобы закрыть и работать так, и если все или одно закрыто или открыто отдельно вручную кнопка меняет имя на открытие или закрытие. Извините за мой английский, надеюсь, вы понимаете. Спасибо за помощь! [Новая скрипка с кодом и статусом кнопки] (http: // jsfiddle.net/foroloca/w3srayj6/16 /) – KP83

0

Если вы отметите для класса active после возникновения тумблера, вы можете изменить текст кнопки в зависимости от того, если переключена класса активен или нет.

See this updated fiddle (отредактирован, чтобы изменить иконки также)

+0

благодарит за помощь! но по-прежнему существует проблема с тем, что, если кто-то уже открыл раздел, он закрывается, когда закрывает все содержимое и наоборот. – KP83

+0

Также, когда кто-то закрывает каждый контент вручную, а не основной кнопкой закрытия, название кнопки и функций остается прежним и наоборот, когда кто-то открывает все содержимое вручную. – KP83

+0

@foroloca вы просто прокручиваете элементы и проверяете, есть ли у них класс 'active', в то время как кнопка имеет класс' active'. Если да, пропустите это. Если это не так, добавьте класс (и наоборот) – mark

0

Чтобы изменить минус/плюс Icône с кнопкой, необходимо выбрать конкретный класс .header с родителем() и ребенка() метод JQuery, как это:

$('.toggle-btn').click(function(){ 
    $('.content').each(function() { 
    $(this).slideToggle(); 
    $(this).parent().find('.header').toggleClass('active'); 
    }); 
}); 
+0

спасибо thibault! этот код выглядит более чистым, но как бы вы могли написать код для изменения имени на кнопке и решить проблему, когда контент уже открыт, снова закрывается при нажатии кнопки «Открыть». – KP83

Смежные вопросы