2010-02-04 4 views
9

У меня есть куча изображений, которые расположены абсолютно, я хочу, чтобы у вас была возможность щелкнуть кнопку, и все они ожидают, где бы они обычно находились на странице, если бы у них была позиция: относительная.jquery: можно ли анимировать положение: абсолютное положение: относительное?

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

это то, что у меня есть:

$(".change_layout").click(function(){ 

    $(".book_img").animate({position:'relative', top:'0px', left:'0px'}, 1000) 

}) 
+0

Вы уверены, что имеете в виду 'relative', а не' static'? Поскольку 'static' - это позиция по умолчанию. –

+0

Да, статичный - это то, что я имел в виду. – ExodusNicholas

ответ

15

Нет, вы не можете анимировать его напрямую, но вы можете узнать конечную точку и анимировать положение там. Нечто подобное может работать когда анимация в static положение:

$('img.foo').each(function() { 

    var el = $(this); 

    // Make it static 
    el.css({ 
     visibility: 'hidden', // Hide it so the position change isn't visible 
     position: 'static' 
    }); 

    // Get the static position 
    var end = el.position(); 

    // Turn it back to absolute 
    el.css({ 
     visibility: 'visible', // Show it 
     position: 'absolute' 
    }).animate({ // Animate to the static position 
     top: end.top, 
     left: end.left 
    }, function() { // Make it static 
     $(this).css('position', 'static'); 
    }); 
}); 

Это немного Hacky, но он должен работать.

+1

Вы должны называть 'position()', а не 'offset()'. – SLaks

+0

ах вы замечательные. единственная проблема заключается в том, что все изображения (они распространяются по всей странице) оживляют положение первого изображения, а затем они мгновенно появляются в их статическом положении, но каждое изображение не оживляет его собственную статическую позицию , любой ключ, как это исправить? – ExodusNicholas

+0

Выполняйте цикл «каждый», где вы обрабатываете каждое изображение отдельно. Вероятно, теперь вы выбираете все элементы в одном объявлении (ваш 'var el' - это что-то вроде' $ ('img.foo') ', это делает все операции относительно первого изображения. Я обновил свой пост, чтобы показать это –

0

Я не думаю, что вы можете сделать это. jQuery animate работает только с любым «числовым CSS-свойством».

+0

Не совсем ... вы также можете изменить цвет текста или фона. :) –

+0

, но не цветное числовое значение? – ExodusNicholas

+0

@TiuTalk - хорошая точка, но я думаю, что ExodusNicholas прав, в этой ситуации jQuery будет использовать числовые аспекты цвета для его анимации, увеличивая/уменьшая значения RGB, чтобы переместить цвет. – rosscj2533

0

No.

Однако, вы можете проверить текущее местоположение элемента (назовем .position()), установите position в relative и анимировать из исходного местоположения в текущий.

+0

Я не уверен, как бы я это сделал, есть ли шанс, что вы могли бы помочь мне начать? что я пытаюсь сделать, это предоставить 2 разных представления для людей, каждая статья имеет изображение, и я хочу, чтобы эти изображения могли анимировать их положение при нажатии второй кнопки просмотра, а затем при нажатии кнопки 1-го просмотра , оживите их до первой позиции. – ExodusNicholas

+0

Например, см. Ответ Тату Улманен, что я и описывал. – SLaks

0

Мне нравится решение ТАТУ, но нашел этот повторно используемый код, чтобы быть лучше для моих целей:

function specialSlide(el, properties, options){ 
    //http://stackoverflow.com/a/2202831/ 
    el.css({ 
     visibility: 'hidden', // Hide it so the position change isn't visible 
     position: 'static' 
    }); 
    var origPos = el.position(); 
    el.css({ 
     visibility: 'visible', // Unhide it (now that position is 'absolute') 
     position: 'absolute', 
     top: origPos.top, 
     left: origPos.left 
    }).animate(properties, options); 
} 

Скажем, я хочу, чтобы скользить $ («# elementToMove») на новую позицию, и я хочу его потребуется 1000 миллисекунд для перемещения. Я могу назвать это:

var props = {'top' : 200, 'left' : 300}; 
var options = {'duration': 1000}; 
specialSlide($('#elementToMove'), props, options);