簡體   English   中英

用動畫交換div位置

[英]Swap div position with animation

單擊堆棧中的第一個div時如何交換div位置。 因此,當單擊div 2或3時,它將與DOM中父級的第一個孩子交換,而當單擊DOM中父級的第一個孩子時,則不會發生任何事情。

這是我的小提琴: http : //jsfiddle.net/exc5m046/

的HTML

<div id="container">
    <div id="one" class="move">div 1</div>
    <div id="two" class="move">div 2</div>
    <div id="three" class="move">div 3</div>
</div>

的CSS

#container {
    width: 200px;
    color:#fff;
    position: relative;
    text-align:center;
}
#container div {
    position: relative;
    margin:10px;
    background:#ff00ab;
    padding:5px;
    border-radius:3px;
    text-align:center;
    display:inline-block;
}

jQuery的

var animating = false;

$('#container').on('click', '.move', function () {

    var clickedDiv = $(this).closest('div'),

    prevDiv = clickedDiv.prev(),
    distance = clickedDiv.offset().left - prevDiv.offset().left;

    if (prevDiv.length) {
        animating = true;
        $.when(clickedDiv.animate({
           left: -distance
        }, 2000),
        prevDiv.animate({
            left: distance
        }, 2000)).done(function () {
            prevDiv.css('left', '0px');
            clickedDiv.css('left', '0px');
            clickedDiv.insertBefore(prevDiv);
            animating = false;
        });
    }
});

編輯:

將單擊的div 與第一個元素交換,您必須更改腳本。 prevDiv變量正在選擇上一個應用開關的功能,但是您想要將其更改為:

prevDiv = $("#container > :first-child")

因此它總是選擇容器的第一個孩子。


然后,添加條件,即clicked元素不能是第一個元素:

if (!clickedDiv.is(":first-child")) {


最后,要正確交換,請將prevDiv放置在prevDiv div所在的位置,並將clickedDiv設置為具有prependTo('')的第一個孩子:

prevDiv.insertBefore(clickedDiv);
clickedDiv.prependTo("#container");

而且, 現在 ,您很高興: http : //jsfiddle.net/exc5m046/3/

編輯,更新

嘗試

html

<!-- removed class `first` from element at index 0 -->
<div id="container">
    <div id="one" class="move">div 1</div>
    <div id="two" class="move">div 2</div>
    <div id="three" class="move">div 3</div>
</div>

js

var animating = false;

$('#container').on('click', '.move', function () {

    var clickedDiv = $(this).closest('div'),

        // adjusted `prevDiv` to `$(".move").eq(0)`
        prevDiv = $(".move").eq(0),
        distance = clickedDiv.offset().left - prevDiv.offset().left;

    if (/*!clickedDiv.is(".first") &&*/ prevDiv.length) {
        animating = true;
        $.when(clickedDiv.animate({
           left: -distance
        }, 2000),
        prevDiv.animate({
            left: distance
        }, 2000)).done(function () {
            prevDiv.css('left', '0px');
            clickedDiv.css('left', '0px');
            // changed `clickedDiv.insertBefore(prevDiv);` to 
            // `clickedDiv.prependTo("#container");`
            clickedDiv.prependTo("#container");
            animating = false;
        });
    }
});

http://jsfiddle.net/exc5m046/14/

參見http://api.jquery.com/prependTo/

嘗試

$('#container div').on('click', '.move', function () {
  if ( $( this ).index() == 0 ) {
    return
  } else {
    //...code
  }
}

僅當div不是父#container第一個元素時 ,這才觸發您的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM