Колода карточек
tinder-паттерн FLIP-раскрытие →

Карточки и UI

Колода карточек

Верхняя карта улетает с поворотом и уходит в низ колоды — бесконечный цикл.

Жмите «Следующая карта».

04
03
02
01
Код
<div class="deck">
  <div class="card">3</div>
  <div class="card">2</div>
  <div class="card">1</div>   <!-- последняя в DOM = верхняя -->
</div>
<button class="next">Следующая →</button>

<style>
.deck { position: relative; width: 300px; aspect-ratio: 3/4; }
.card { position: absolute; inset: 0; border-radius: 18px;
  transition: transform .5s cubic-bezier(.16,1,.3,1), opacity .5s;
  /* --n = глубина в колоде: смещение и уменьшение */
  transform: translateY(calc(var(--n) * -14px))
             scale(calc(1 - var(--n) * .05)); }
.card.fly { transform: translateX(120%) rotate(16deg) !important;
  opacity: 0; }                       /* верхняя улетает вправо */
</style>

<script>
var deck = document.querySelector(".deck");
function layout() {
  var cards = deck.querySelectorAll(".card");
  cards.forEach(function (c, i) {
    c.style.setProperty("--n", cards.length - 1 - i);
    c.style.zIndex = i;
  });
}
layout();
document.querySelector(".next").addEventListener("click", function () {
  var top = deck.querySelector(".card:last-child");
  top.classList.add("fly");
  setTimeout(function () {
    top.classList.remove("fly");
    deck.insertBefore(top, deck.firstChild);   // в конец колоды
    layout();
  }, 480);
});
</script>
Промпт для ИИ
Сделай колоду карточек: карточки absolute друг на друге, глубина в переменной --n задаёт transform translateY(-n*14px) scale(1-n*.05) — стопка с выглядывающими краями. По кнопке/свайпу верхняя получает класс fly (translateX(120%) rotate(16deg) + opacity 0), через 480мс возвращается без класса и переставляется в начало DOM (низ колоды), после чего пересчитываются --n и z-index — колода бесконечная. transition 0.5s cubic-bezier(0.16,1,0.3,1).