JQuery аккордеон

Я немного поигрался с попыткой создать броский аккордеон на некоторое время, и не получил его очень отзывчивым. Когда я перетаскиваю элемент над аккордеоном, для открытия элемента аккордеона требуется более 5 секунд (если он вообще открывается). Иногда мне приходится "махать" перетаскиваемым элементом над элементом аккордеона.

Я знаю, что некоторое время назад читал об обработке событий в javascript - что-то вроде браузера не всегда передавало управление движку javascript, когда вы думаете, что это происходит, или что-то подобное, что приводило к странной синхронизации.

Кто-нибудь еще видел пытался сделать это раньше? Вы нашли jquery/javascript таким медленным? Есть ли у вас какие-либо рекомендации по поводу того, как получить отзывчивый аккордеон с поддержкой отзывчивости (судя по всему, на сайте jQuery UI я ничего не нашел в SO или Google).

Спасибо!

1 ответ

Решение

Hiya! Я разместил демо, где вы можете перетащить элемент списка и поместить его в меню аккордеона.

Ключом к этому является использование dropover событие связывания, добавленное .droppable() скрипт. Но это не идеально, потому что высота закрытого аккордеона все еще используется, когда вызывается событие dropover, поэтому заголовок отлично подходит для отбрасывания элемента, но скрытый список под ним не всегда регистрируется, и аккордеон закрывается. Вам придется вернуть перетаскиваемый элемент и начать заново. Вы поймете, что я имею в виду, когда возитесь с демо. Во всяком случае, вот основные настройки:

CSS

 #droppable { width: 250px; height: 500px; padding: 0.5em; float: left; margin: 10px; background: #ddd; color:#000; }
 #draggable { width: 250px; height: 500px; padding: 0.5em; float: left; margin: 10px; background: #999; color:#000; }
 .fade { opacity: 0.3; }

 ul#droppable { list-style-type: none; }
 #droppable h5 { background: #08f; color: #fff; margin: 5px 0; padding: 3px; font-size: 14px; }
 #droppable .item, .item ul li { padding: 0 5px; background: #ccc; }

HTML

<ul id="droppable">
 <li class="item selected">
  <h5>Header #1</h5>
  <ul>
   <li>Item #1.1</li>
   <li>Item #1.2</li>
  </ul>
 </li>
 <li class="item">
  <h5>Header #2</h5>
  <ul>
   <li>Item #2.1</li>
   <li>Item #2.2</li>
  </ul>
 </li>
</ul>

скрипт

$(document).ready(function(){

 // make accordion
 var item = $('#droppable li.item');
 // dropover event is for droppable
 item.bind('mouseover dropover', function(){
  item.removeClass('selected');
  $(this).addClass('selected').find('ul').slideDown(300);
  item.not('.selected').find('ul').slideUp(300);
 }).not('.selected').find('ul').hide();

 // set up droppable
 item.droppable({
  drop: function(e,ui) {
   ui.draggable.appendTo($(this).find('ul'));
   ui.helper.remove();
  }
 });

 // set up draggable
 $('#draggable li').draggable({
  helper : 'clone',
  revert : true,
  start: function(e,ui){
   $(this).addClass('fade');
   ui.helper.css('background','#ddd');
  },
  stop: function(e,ui){
   $(this).removeClass('fade');
   ui.helper.css('background','transparent');
  }
 });

});
Другие вопросы по тегам