Подтвердить что ты не робот

JQuery - анимированный переключатель высоты

У меня есть 10px-бар в верхней части экрана, который при щелчке, я хочу, чтобы он анимировал высоту 40 пикселей, а затем, если щелкнуть снова, оживите назад до 10 пикселей. Я попытался изменить идентификатор div, но он не работает. Как я могу заставить это работать, или есть лучший способ сделать это?

body html:

<div id="topbar-show"></div>

CSS

#topbar-show { width: 100%; height: 10px; background-color: #000; }
#topbar-hide { width: 100%; height: 40px; background-color: #000; }

JavaScript:

$(document).ready(function(){
  $("#topbar-show").click(function(){
    $(this).animate({height:40},200).attr('id', 'topbar-hide');
  });
  $("#topbar-hide").click(function(){
    $(this).animate({height:10},200).attr('id', 'topbar-show');
  });
});
4b9b3361

Ответ 1

Попробуйте:

$(document).ready(function(){
  $("#topbar-show").toggle(function(){
    $(this).animate({height:40},200);
  },function(){
    $(this).animate({height:10},200);
  });
});

Ответ 2

Вы можете использовать метод toggle-event (docs) для назначения 2 (или более) обработчиков, которые переключаются с каждым щелчком.

Пример: http://jsfiddle.net/SQHQ2/1/

$("#topbar").toggle(function(){
    $(this).animate({height:40},200);
},function(){
    $(this).animate({height:10},200);
});

или вы можете создать свое собственное поведение для переключения:

Пример: http://jsfiddle.net/SQHQ2/

$("#topbar").click((function() {
    var i = 0;
    return function(){
        $(this).animate({height:(++i % 2) ? 40 : 10},200);
    }
})());

Ответ 3

Для достижения желаемого результата вы должны использовать class:

CSS

#topbar { width: 100%; height: 40px; background-color: #000; }
#topbar.hide { height: 10px; }

JavaScript:

  $(document).ready(function(){
    $("#topbar").click(function(){
      if($(this).hasClass('hide')) {
        $(this).animate({height:40},200).removeClass('hide');
      } else { 
        $(this).animate({height:10},200).addClass('hide');
      }
    });
  });

Ответ 4

Очень поздно, но прошу прощения. Извините, если это "неэффективно", но если вы обнаружили, что все вышеперечисленное не работает, попробуйте это. Работает выше 1.10 также

<script>
  $(document).ready(function() {
    var position='expanded';

    $("#topbar").click(function() {
      if (position=='expanded') {
        $(this).animate({height:'200px'});
        position='collapsed';
      } else {
        $(this).animate({height:'400px'});
        position='expanded';
      }
    });
   });
</script>

Ответ 5

<!DOCTYPE html>
<html>
<head>
  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
  <style type="text/css">
  #topbar { width: 100%; height: 10px; background-color: #000; color: #FFF;}

</style>
</head>
<body>

<div id="topbar"> example </div>

<script type="text/javascript">
$(document).ready(function(){
  $("#topbar").toggle(function(){
    $(this).animate({height:40},200);
  }, 
  function(){
    $(this).animate({height:10},200);
  });
});
</script>
</body>
</html>

Ответ 6

Я просто подумал дать вам причину, почему ваше решение не сработало:

Когда $(document).ready() выполняется, селектор $('#topbar-show') может найти соответствующий элемент из DOM. Элемент #topbar-show еще не создан.

Чтобы преодолеть эту проблему, вы можете использовать привязки живых событий

$('#topbar-show').live('click',function(e){});
$('#topbar-hide').live('click',function(e){});

Это самый простой способ исправить ваше решение. Остальные из этих ответов идут дальше, чтобы предоставить вам более эффективные решения, которые не изменяют надежно постоянный атрибут id.

Ответ 7

Вы также можете использовать этот трюк: замените

$("#topbar").click(function(){

по

$(document).on("click", "#topbar", function(){

Это привяжет событие к еще не загруженному объекту... ;)

Ответ 8

Следующий код работал у меня в jQuery2.1.3

$("#topbar").animate('{height:"toggle"}');

Не нужно вычислять высоту div, отступы, границы и границы. Это позаботится.

Ответ 9

Работал для меня:

$(".filter-mobile").click(function() {
   if ($("#menuProdutos").height() > 0) {
      $("#menuProdutos").animate({
         height: 0
      }, 200);
   } else {
      $("#menuProdutos").animate({
         height: 500
      }, 200);
   }
});