Проблема с вашим кодом в том, что вы проверяете начальное состояние верхнего свойства. Затем вы привязываете щелчок в зависимости от свойства initial top.
Вы хотите использовать свойство current top. Это свойство изменяется, когда пользователь нажимает #last-slide
. Поэтому вам нужно проверить состояние в обратном вызове клика, а затем обработать в зависимости от этого значения.
$(document).ready(function(){
$(document).on('click', '#list-slide', function(){
var top = parseFloat($(".tutor-list").css("top"));
if(top == 0){
$(".tutor-list").animate({top: "200px"});
}
else{
$(".tutor-list").animate({top: "0px"});
}
});
});
.wrapper{
overflow: hidden;
height: 200px;
border: 1px dotted #000;
position: relative;
}
.tutor-list{
background: #ccccff;
border: 1px dashed #000;
position: absolute;
top: 200px;
min-height: 50px;
padding: 10px;
}
<html>
<body>
<button id="list-slide">Toggle list</button>
<div class="wrapper">
<div class="tutor-list">This is the list</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</body>
</html>
Обратите внимание, что parseFloat()
на самом деле не нужен. Я просто не знаю, является ли возвращаемое значение jQuery.css("top")
строкой или числом. В j-Query docs Я не смог найти тип возврата jQuery.css()
* функция. Он говорит, что использует «вычисленный стиль» в зависимости от браузера. О вычисленном стиле документы говорят:
[C] вычисленные стили измерений почти всегда являются пикселями, но их можно указать как em, ex, px или% в таблице стилей. Различные браузеры могут возвращать CSS значений цвета, которые логически, но не текстуально равны, например, #FFF, #ffffff и rgb (255,255,255).
Так что я предполагаю, что могут быть разные возвращаемые значения для свойства top
тоже. Поэтому для go полностью кросс-браузерной работы я всегда использую функцию parseFloat()
. Кроме того, блок здесь не важен. Неважно, если это 0px, 0em или просто 0. (Обратите внимание, что для других случаев значение имеет значение . 1px не равно 1em. Для этого случая используйте jQuery.offser().top
, который всегда возвращает px. *
Я не знаю ваших точных настроек, но вы также можете проверить jQuery.hide()
. Эта функция скрывает ваш список. jQuery.hide()
может принимать аргументы для анимации, так что вы получите тот же результат. Лично я предпочитаю функцию jQuery.hide()
, потому что она меняет свойство css display
. Таким образом, элемент не заканчивается где-то в пространстве, но определяется как невидимый. Я думаю, что это лучшее решение.
Также вы можете изменить функцию привязки кликов следующим образом:
$(document).ready(function(){
$('#last-slide').on('click', function(){
// ...
});
});
Лично я предпочитаю этот способ, потому что он мне приятнее. Обратите внимание, что первый метод (используемый вами) привязывает событие к документу, а затем фильтрует, это означает, что перезагрузка содержимого с помощью js / ajax сохранит функциональность . Это может быть предназначено, но также может и не предназначаться (возможно, вы снова инициализируете страницу).