Mat*_*att 3 html javascript css animation dom
我有一个容器,里面有未知数量的卡片(从 3 到 8 张)。
| -- -- -- |
| CARD CARD CARD |
| -- -- -- |
Run Code Online (Sandbox Code Playgroud)
当单击其中一张时,所有其他卡片都会消失,并且单击的卡片需要向左移动。例如,如果点击中间的卡片:
卡牌消失
| -- |
| CARD |
| -- |
Run Code Online (Sandbox Code Playgroud)
卡片向左移动(有动画)
| -- |
| CARD |
| -- |
Run Code Online (Sandbox Code Playgroud)
这些卡片可以消失,但我觉得我的解决方案不是很好。我无法将卡移至左侧。
这是我隐藏卡片的解决方案:
| -- -- -- |
| CARD CARD CARD |
| -- -- -- |
Run Code Online (Sandbox Code Playgroud)
但我很不确定如何移动卡。这是卡片容器和卡片本身的 css。
| -- |
| CARD |
| -- |
Run Code Online (Sandbox Code Playgroud)
这可以通过CSS动画实现吗?
要将元素设置为新位置的动画,请按照以下简单步骤操作:
display: nonetranslate: transform(x, y)回旧的X 和 Y 的位置。transition为0, 0 translate: transform(0, 0),这是在其他元素从视图中隐藏后该元素实际占据的位置。下面是上述列表的示例,其中包含一个额外步骤,即在隐藏其他元素之前先淡出它们,并且仅对元素进行动画处理:
const animateCards = (card) => {
const fxHide = `display: none;`;
const fxFade = `transition: opacity 0.3s; opacity: 0;`;
const fxMove = `transform: translate(${card.offsetLeft}px, ${card.offsetTop}px);`;
const fxAnim = `transition: transform 0.5s; transform: translate(0, 0);`;
let other; // Just to catch a sibling element as reference
cards.forEach(el => {
if (el === card) return;
if (!other) other = el;
el.addEventListener("transitionend", () => el.style.cssText += fxHide, {once: true});
el.style.cssText += fxFade;
});
other.addEventListener("transitionend", () => {
card.style.cssText += fxMove;
setTimeout(() => card.style.cssText += fxAnim, 0);
}, {once: true});
};
const cards = document.querySelectorAll(".card");
cards.forEach(el => el.addEventListener('click', () => animateCards(el)));Run Code Online (Sandbox Code Playgroud)
.cards {
height: 100%;
width: 100%;
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 50px;
position: relative;
}
.card {
height: 100%;
position: relative;
cursor: pointer;
}Run Code Online (Sandbox Code Playgroud)
<div class="cards">
<div class="card" style="background-color:#0bf;">1</div>
<div class="card" style="background-color:#f0b;">2</div>
<div class="card" style="background-color:#bf0;">3</div>
</div>Run Code Online (Sandbox Code Playgroud)