2016-11-03 2 views
3

Как я могу гарантировать, что переходы CSS будут возникать в результате перемещения элементов в DOM с помощью jQuery?CSS Переходы в результате jQuery DOM Манипуляции

Следующий переход CSS игнорируется при использовании селектора состояний последнего дочернего элемента. Стиль обновляется, как ожидалось, но переходного времени к этому стилю не существует.

<ul> 
<li>A</li> 
<li>B</li> 
<li>C</li> 
</ul> 

li { 
    background-color: red; 
} 

li:last-child { 
    background-color: yellow; 
    transition: 3s ease; 
} 

// move list item to last place when clicked 
$('li').click(function() { 
    var parent = $(this).parent(); 
    $(this).detach().appendTo(parent); 
}); 

JSFiddle

Единственный способ, которым я могу показаться, чтобы обеспечить переход будет происходить, чтобы добавить класс после небольшого SetTimeout вызова, а не использовать селектор состояния.

li.activate { 
    background-color: yellow; 
    transition: 3s ease; 
} 

$('li').click(function() { 
    var item = $(this); 
    var parent = item.parent(); 
    item.detach().appendTo(parent);  
    setTimeout(function() { 
    parent.children().removeClass('activate'); 
    item.addClass('activate'); 
    }, 5); 
}); 

JSFiddle

+0

Вы не указали параметр для перехода. Каким должен быть переход? Другое дело, вам нужно установить переход для элемента li, а не: last-child. –

+0

все сложно. Перемещающийся элемент должен * оставить позади * некоторую оболочку, которая 1. анимирует до высоты входящего элемента и 2. чем становится оберткой этого элемента .... и вам нужно сделать это для всех движущихся элементов: D –

+1

Другое решение: перед перемещением всех элементов вы вычисляете их состояния и делаете их абсолютными (например, перемещая фигуры на холсте ...), чем после перехода вы восстанавливаете/перезаписываете позиции DOM и т. д. и т. д. и т. д. Итак, все, .animate() 'или' transition' является абсолютным элементом перед тем, как притворяться и перестраивать новое положение, тем самым подделывая временные анимации оберток и уничтожая их и т. д. –

ответ

3

Как вы двигаетесь элементы в дереве DOM, нет визуального состояния перехода из. Однако вы можете использовать анимацию CSS, которая запускается также, создавая новый элемент.

Не нужно сначала .detach().

// move list item to last place when clicked 
 
$('li').click(function() { 
 
    var parent = $(this).parent(); 
 
    $(this).appendTo(parent); 
 
});
li { 
 
    background-color: red; 
 
    height: 50px; 
 
} 
 

 
li:last-child { 
 
    animation: pulse 1s 1; 
 
    animation-fill-mode: forwards; 
 
} 
 

 
@keyframes pulse { 
 
    0% { 
 
    height: 50px; 
 
    } 
 
    100% { 
 
    height: 90px; 
 
    background-color: yellow; 
 
    } 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul> 
 
    <li>A</li> 
 
    <li>B</li> 
 
    <li>C</li> 
 
</ul>

В качестве альтернативы вы можете:

  1. Переместить элемент (.appendTo)
  2. В следующем цикле (setTimeout, requestAnimationFrame и т.д.) добавить имя класса, как «последний ', который должен в свою очередь инициировать переход, поскольку свойства CSS элемента изменились от это состояние без классов. (который вы как бы выяснили уже ...)
+0

«Нет визуального состояния для перехода от« ... спасибо за это. – Twitchy

Смежные вопросы