Замените Jquery .animate на 0 раз на что-то более эффективное

Я недавно использовал эту настройку на веб-сайте...

http://jsfiddle.net/mnRNE/

CSS

body {
 height:2000px;   
}

#top-box {
 position:fixed;
 width:200px;
 height:200px;
 margin-left:100px;
 margin-top:50px;
 background-color:blue;   
 z-index:2;   
}

#bottom-box {
 position:fixed;
 width:200px;
 height:200px;
 margin-left:110px;
 margin-top:60px;
 background-color:red;  
 z-index:1;    

}

JavaScript

$(document).ready(function() {
    var away = false;

 $(document).scroll(function() {
    if ($(document).scrollTop() > 250) {
        if (!away) {
            away = true;
            $('#bottom-box').stop().animate({
                'margin-top': '200px'
            }, 1500);
        }
    } else {
        away = false;
        $('#bottom-box').stop().animate({
            'margin-top': '60px'
        }, 0);
    }
});
});

HTML

<div id="top-box"></div>
<div id="bottom-box"></div>

Это делает так, что когда пользователь прокручивает страницу на 250 пикселей вниз, красный блок анимируется и выскальзывает из-под синего блока. Эта первая анимация рассчитана так, чтобы переход был очевиден (красная рамка заметно выдвигается).

Затем он устанавливается таким образом, что если пользователь прокручивает назад более 250 пикселей, красный прямоугольник перемещается обратно под синий прямоугольник. Это делается без таймера, поэтому переход происходит мгновенно (красная рамка возвращается на исходное место).

Это отлично работает и делает все, что мне нужно. Но мне любопытно, есть ли лучший способ добиться этой второй анимации, вообще не используя анимацию и просто «сбрасывая» красное поле на «margin-top: 60px» без необходимости иметь время или .animate ?

По сути, я спрашиваю, может ли...

        $('#bottom-box').stop().animate({
            'margin-top': '60px'
        }, 0);

раздел JavaScript должен быть написан по-другому и более эффективно для достижения того же результата, но без использования анимации? Как своего рода «установить «нижнее поле» на «верхнее поле»: «60 пикселей»?


person Flickdraw    schedule 20.01.2012    source источник


Ответы (3)


Я думаю, что лучше использовать jquery .css.

http://jsfiddle.net/mnRNE/1/

        $('#bottom-box').stop().css('marginTop', '60px'); 

Делает трюк

person Tim    schedule 20.01.2012
comment
Работает отлично, также кажется, что работает, если я поставлю «margin-top» вместо «marginTop». Есть ли причина, по которой я должен использовать один над другим? - person Flickdraw; 20.01.2012
comment
Я думал, что видел что-то в руководстве по CSS, которое объясняло это, см. комментарий к danwellman, но это было только для извлечения элементов, я ошибся, думая, что это было для обеих настроек как для получения css. Таким образом, margin-top и marginTop работают нормально! - person Tim; 20.01.2012

Почему бы нет

$('#bottom-box').css('margin-top', '60px');
person danwellman    schedule 20.01.2012
comment
Это не будет работать, так как Jquery запрещает это из руководства jQuery: сокращенные свойства CSS (например, поля, фон, граница) не поддерживаются. Например, если вы хотите получить визуализированное поле, используйте: $(elem).css('marginTop') и $(elem).css('marginRight') и т. д. - person Tim; 20.01.2012
comment
Эта половина работает в Firefox и Chome, она работает до тех пор, пока первая анимация завершена, но если пользователь прокручивает назад середину анимации, красное поле не сбрасывает позицию. При просмотре в IE, Opera или Safari все работает нормально. - person Flickdraw; 20.01.2012

person    schedule
comment
То же самое здесь, это не сработает, см. комментарий к ответу danwellman. - person Tim; 20.01.2012
comment
@ Тим, это работает, и твой ответ даже дублирует этот? - person Esailija; 20.01.2012
comment
Это не работает. Однако, если { и } удалены до и после 'margin-top': '60px', кажется, что все работает нормально. - person Flickdraw; 20.01.2012
comment
При этом вы можете использовать несколько правил CSS, например: .css({'margin-top': '60px','display':'block'}); только с этим: .css('margin-top', '60px'); Оба будут работать - person Fabian; 20.01.2012