一次只翻转一张卡片 GSAP
Flip only one card at a time GSAP
我正在尝试通过单击按钮来翻转卡片。我的问题是所有卡片都在翻转,而不仅仅是被点击的卡片。我之前问过这个问题,当点击整个卡片容器时效果很好,但我意识到我需要在按钮上点击它
HTML:
<div class="flip-card-column--test">
<div class="flip-card-container">
<div class="flip-card-front">
<p class="flip-card__label">
Front of Card Label
</p>
<div class="flip-card__toggle">
<span class="flip-card__front">+</span>
</div>
</div>
<div class="flip-card-back">
<p class="flip-card__label">
Back of Card Label
</p>
<p class="flip-card__text --narrow--mobile flip-card__back">
Text
</p>
<div class="flip-card__toggle">
<span class="flip-card__back toggle__minus">-</span>
</div>
</div>
</div>
</div>
<div class="flip-card-column--test">
<div class="flip-card-container">
<div class="flip-card-front">
<p class="flip-card__label">
Front of Card Label
</p>
<div class="flip-card__toggle">
<span class="flip-card__front">+</span>
</div>
</div>
<div class="flip-card-back">
<p class="flip-card__label">
Back of Card Label
</p>
<p class="flip-card__text --narrow--mobile flip-card__back">
Text
</p>
<div class="flip-card__toggle">
<span class="flip-card__back toggle__minus">-</span>
</div>
</div>
</div>
</div>
<div class="flip-card-column--test">
<div class="flip-card-container">
<div class="flip-card-front">
<p class="flip-card__label">
Front of Card Label
</p>
<div class="flip-card__toggle">
<span class="flip-card__front">+</span>
</div>
</div>
<div class="flip-card-back">
<p class="flip-card__label">
Back of Card Label
</p>
<p class="flip-card__text --narrow--mobile flip-card__back">
Text
</p>
<div class="flip-card__toggle">
<span class="flip-card__back toggle__minus">-</span>
</div>
</div>
</div>
</div>
SCSS:
.flip-card-column--test{
.flip-card-container {
width: 200px;
height: 200px;
}
.flip-card-front, .flip-card-back {
display: flex;
flex-direction: column;
align-items: center;
position: absolute;
width: 200px;
height: 200px;
padding: 25px 5px 27px;
background-color: red;
backface-visibility: hidden;
}
.flip-card-back {
background-color: blue;
.flip-card__label{
padding-top: 0;
margin-bottom: 6px;
}
}
.flip-card__text{
margin: 0 auto;
}
.flip-card__label{
padding-top: 15px;
}
}
JQUERY GSAP:
//Card flip animations
TweenMax.set($($flipCardBack), {rotationY: -180});
$.each($flipCardContainer, function (i, element) {
var frontCard = $(this).find('.flip-card-front'),
backCard = $(this).find('.flip-card-back'),
tl = new TimelineMax({paused: true, reversed: true});
tl
.to(frontCard, 1, {rotationY: 180})
.to(backCard, 1, {rotationY: 0}, 0)
.to(element, .5, {z: 50}, 0)
.to(element, .5, {z: 0}, .5);
element.animation = tl;
$('.flip-card__toggle').on('click', function () {
if (tl.progress() === 0
|| tl.reversed()) {
tl.play();
} else {
tl.reverse();
}
});
});
这适用于卡片容器点击事件:
$('.flip-card-container').on('click', function elOver() {
if(this.animation.progress() === 0
|| this.animation.reversed()) {
this.animation.play();
} else {
this.animation.reverse();
}
});
此错误是因为您在点击函数内部 包含了一个通用点击侦听器。 $('.flip-card__toggle').on('click'
适用于 所有 个卡片切换按钮。
换句话说,每次单击任何卡片切换时,您都会告诉它为每个时间轴设置动画。
要解决此问题,请将点击事件侦听器移到点击事件之外,如下所示:
var $flipCardBack = $(".flip-card-back"),
$flipCardContainer = $(".flip-card-container");
//Card flip animations
TweenMax.set($flipCardBack, { rotationY: -180 });
$.each($flipCardContainer, function(i, element) {
var frontCard = $(this).find(".flip-card-front"),
backCard = $(this).find(".flip-card-back"),
tl = new TimelineMax({ paused: true, reversed: true });
tl
.to(frontCard, 1, { rotationY: 180 })
.to(backCard, 1, { rotationY: 0 }, 0)
.to(element, 0.5, { z: 50 }, 0)
.to(element, 0.5, { z: 0 }, 0.5);
$(this)[0].animation = tl;
});
$(".flip-card__toggle").on("click", function() {
var tl = $(this).closest(".flip-card-container")[0].animation;
if (tl.progress() === 0 || tl.reversed()) {
tl.play();
} else {
tl.reverse();
}
});
或者将点击事件侦听器的选择器更改为特定于该容器的内容:
$.each($flipCardContainer, function(i, element) {
var frontCard = $(this).find(".flip-card-front"),
backCard = $(this).find(".flip-card-back"),
toggle = $(this).find(".flip-card__toggle"),
tl = new TimelineMax({ paused: true, reversed: true });
tl
.to(frontCard, 1, { rotationY: 180 })
.to(backCard, 1, { rotationY: 0 }, 0)
.to(element, 0.5, { z: 50 }, 0)
.to(element, 0.5, { z: 0 }, 0.5);
toggle.on("click", function() {
if (tl.progress() === 0 || tl.reversed()) {
tl.play();
} else {
tl.reverse();
}
});
$(this)[0].animation = tl;
});
Demo
我正在尝试通过单击按钮来翻转卡片。我的问题是所有卡片都在翻转,而不仅仅是被点击的卡片。我之前问过这个问题,当点击整个卡片容器时效果很好,但我意识到我需要在按钮上点击它
HTML:
<div class="flip-card-column--test">
<div class="flip-card-container">
<div class="flip-card-front">
<p class="flip-card__label">
Front of Card Label
</p>
<div class="flip-card__toggle">
<span class="flip-card__front">+</span>
</div>
</div>
<div class="flip-card-back">
<p class="flip-card__label">
Back of Card Label
</p>
<p class="flip-card__text --narrow--mobile flip-card__back">
Text
</p>
<div class="flip-card__toggle">
<span class="flip-card__back toggle__minus">-</span>
</div>
</div>
</div>
</div>
<div class="flip-card-column--test">
<div class="flip-card-container">
<div class="flip-card-front">
<p class="flip-card__label">
Front of Card Label
</p>
<div class="flip-card__toggle">
<span class="flip-card__front">+</span>
</div>
</div>
<div class="flip-card-back">
<p class="flip-card__label">
Back of Card Label
</p>
<p class="flip-card__text --narrow--mobile flip-card__back">
Text
</p>
<div class="flip-card__toggle">
<span class="flip-card__back toggle__minus">-</span>
</div>
</div>
</div>
</div>
<div class="flip-card-column--test">
<div class="flip-card-container">
<div class="flip-card-front">
<p class="flip-card__label">
Front of Card Label
</p>
<div class="flip-card__toggle">
<span class="flip-card__front">+</span>
</div>
</div>
<div class="flip-card-back">
<p class="flip-card__label">
Back of Card Label
</p>
<p class="flip-card__text --narrow--mobile flip-card__back">
Text
</p>
<div class="flip-card__toggle">
<span class="flip-card__back toggle__minus">-</span>
</div>
</div>
</div>
</div>
SCSS:
.flip-card-column--test{
.flip-card-container {
width: 200px;
height: 200px;
}
.flip-card-front, .flip-card-back {
display: flex;
flex-direction: column;
align-items: center;
position: absolute;
width: 200px;
height: 200px;
padding: 25px 5px 27px;
background-color: red;
backface-visibility: hidden;
}
.flip-card-back {
background-color: blue;
.flip-card__label{
padding-top: 0;
margin-bottom: 6px;
}
}
.flip-card__text{
margin: 0 auto;
}
.flip-card__label{
padding-top: 15px;
}
}
JQUERY GSAP:
//Card flip animations
TweenMax.set($($flipCardBack), {rotationY: -180});
$.each($flipCardContainer, function (i, element) {
var frontCard = $(this).find('.flip-card-front'),
backCard = $(this).find('.flip-card-back'),
tl = new TimelineMax({paused: true, reversed: true});
tl
.to(frontCard, 1, {rotationY: 180})
.to(backCard, 1, {rotationY: 0}, 0)
.to(element, .5, {z: 50}, 0)
.to(element, .5, {z: 0}, .5);
element.animation = tl;
$('.flip-card__toggle').on('click', function () {
if (tl.progress() === 0
|| tl.reversed()) {
tl.play();
} else {
tl.reverse();
}
});
});
这适用于卡片容器点击事件:
$('.flip-card-container').on('click', function elOver() {
if(this.animation.progress() === 0
|| this.animation.reversed()) {
this.animation.play();
} else {
this.animation.reverse();
}
});
此错误是因为您在点击函数内部 包含了一个通用点击侦听器。 $('.flip-card__toggle').on('click'
适用于 所有 个卡片切换按钮。
换句话说,每次单击任何卡片切换时,您都会告诉它为每个时间轴设置动画。
要解决此问题,请将点击事件侦听器移到点击事件之外,如下所示:
var $flipCardBack = $(".flip-card-back"),
$flipCardContainer = $(".flip-card-container");
//Card flip animations
TweenMax.set($flipCardBack, { rotationY: -180 });
$.each($flipCardContainer, function(i, element) {
var frontCard = $(this).find(".flip-card-front"),
backCard = $(this).find(".flip-card-back"),
tl = new TimelineMax({ paused: true, reversed: true });
tl
.to(frontCard, 1, { rotationY: 180 })
.to(backCard, 1, { rotationY: 0 }, 0)
.to(element, 0.5, { z: 50 }, 0)
.to(element, 0.5, { z: 0 }, 0.5);
$(this)[0].animation = tl;
});
$(".flip-card__toggle").on("click", function() {
var tl = $(this).closest(".flip-card-container")[0].animation;
if (tl.progress() === 0 || tl.reversed()) {
tl.play();
} else {
tl.reverse();
}
});
或者将点击事件侦听器的选择器更改为特定于该容器的内容:
$.each($flipCardContainer, function(i, element) {
var frontCard = $(this).find(".flip-card-front"),
backCard = $(this).find(".flip-card-back"),
toggle = $(this).find(".flip-card__toggle"),
tl = new TimelineMax({ paused: true, reversed: true });
tl
.to(frontCard, 1, { rotationY: 180 })
.to(backCard, 1, { rotationY: 0 }, 0)
.to(element, 0.5, { z: 50 }, 0)
.to(element, 0.5, { z: 0 }, 0.5);
toggle.on("click", function() {
if (tl.progress() === 0 || tl.reversed()) {
tl.play();
} else {
tl.reverse();
}
});
$(this)[0].animation = tl;
});