Javascript を使って要素の上下を入れ替えるには insertBefore() を使います。
ただしこれだけでは瞬時に入れ替わるため、アニメーションを付けたい場合は先に CSS の translateY() で見かけ上の位置を入れ替えたあとで insertBefore() を使います。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.5.0/css/all.css" integrity="sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="card mb-3">
<div class="card-header">
<button type="button" class="btn btn-default btn-up">
<i class="fas fa-caret-up"></i>
</button>
<button type="button" class="btn btn-default btn-down">
<i class="fas fa-caret-down"></i>
</button>
</div>
<div class="card-body">
Card A
</div>
</div>
<div class="card mb-3">
<div class="card-header">
<button type="button" class="btn btn-default btn-up">
<i class="fas fa-caret-up"></i>
</button>
<button type="button" class="btn btn-default btn-down">
<i class="fas fa-caret-down"></i>
</button>
</div>
<div class="card-body">
Card B
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function(){
var cards = document.querySelectorAll('.card');
var swapCards = function(card1, card2){
var duration = 300;
if(!card2 || !card2.classList.contains('card')) return;
var orgDuration1 = card1.style.transitionDuration;
var orgDuration2 = card2.style.transitionDuration;
card1.style.transitionDuration = duration + 'ms';
card2.style.transitionDuration = duration + 'ms';
var diff = card2.offsetTop - card1.offsetTop;
if(diff > 0){
var spacing = card2.offsetTop - (card1.offsetTop + card1.offsetHeight);
card1.style.transform = "translateY(" + (card2.offsetHeight + spacing) + "px)";
card2.style.transform = "translateY(" + (-diff) + "px)";
} else {
var spacing = card1.offsetTop - (card2.offsetTop + card2.offsetHeight);
card1.style.transform = "translateY(" + (diff) + "px)";
card2.style.transform = "translateY(" + (card1.offsetHeight + spacing) + "px)";
}
setTimeout(function(){
card1.style.transitionDuration = orgDuration1;
card2.style.transitionDuration = orgDuration2;
card1.style.transform = "translateY(0)";
card2.style.transform = "translateY(0)";
if(diff < 0){
card1.parentNode.insertBefore(card1, card2);
} else {
card1.parentNode.insertBefore(card2, card1);
}
}, duration);
};
cards.forEach(function(card){
card.querySelector(".btn-up").addEventListener('click', function(){
swapCards(card, card.previousElementSibling);
});
card.querySelector(".btn-down").addEventListener('click', function(){
swapCards(card, card.nextElementSibling);
});
});
});
</script>
</body>
</html>
Similar Posts:
- CSS3を使ったアニメーションの作り方
- [PHP]指定した日時まであと何日(何時間)あるかを調べてカウントダウンする
- [PHP]Laravelを使ったメールフォームの作り方
- [CSS, jQuery]クリックされたボタンの色を変更したり文字を書き換えたりする
- [CSS]Transitionでマウスオーバー時(:hover)などに動きをつける
- [JS]HTML5 Canvasを使ったライフゲーム
- [PHP]クラスとオブジェクト指向の練習(タロットカード占い)
- [JS]TinyMCEでレスポンシブな独自のダイアログを使う(Bootstrap)