Проблема с плавной анимацией "transform-origin"
Всем привет! Столкнулась с проблемой анимации transform-origin. Разрабатываю анимацию отрывного талона. При нажатии на синий квадрат, он принимает transform: rotate(25deg);, но при этом не принимается плавная анимация при отделении от красной части.
Какие есть варианты для реализации плавного отрывания при клике? На данный момент при нажатии он дергается и падает вниз.
$('.cardRight').click(function() {
$(this).toggleClass("cutted");
});
/* ticket */
.cardWrap {
cursor: pointer;
position: relative;
font-family: sans-serif;
margin: 0 auto;
display: flex;
border-radius: 8px;
}
.cardLeft {
width: 400px;
border-right: 18em dashed #fff;
border-radius: 8px 0 0 8px;
border: 1px solid black;
height: 250px;
background: red;
color: white;
font-size: 24px;
text-align: center;
}
.cardRight {
width: 25%;
border-left: .18em dashed #fff;
border-radius: 0 8px 8px 0;
border: 1px solid black;
height: 250px;
background: blue;
color: white;
}
.cardSingle {
width: 100%;
border-right: .18em dashed #fff;
border-radius: 8px 0 0 8px;
}
.cardWrap .form-group {
height: 0;
overflow: hidded;
opacity: 0;
}
.cardRight h1 {
opacity: 0;
text-align: center;
}
.cardRight,
.cardRight * {
-webkit-transition: all 0.3s ease-in-out;
-moz-transition: all 0.3s ease-in-out;
-o-transition: all 0.3s ease-in-out;
transition: all 0.3s ease-in-out;
}
.cardRight.cutted {
-ms-transform: rotate(25deg);
-ms-transform-origin: 0% 100%;
-webkit-transform: rotate(25deg);
-webkit-transform-origin: 0% 100%;
transform: rotate(25deg);
transform-origin: 00% 100%;
}
.cutted .cardRight h1 {
opacity: 1;
}
.cardWrap.list {
cursor: default;
}
.cardWrap.list .cardLeft .btn-group {
padding: 16px 0 0;
}
.cardWrap.list .cardLeft {
width: 65%;
}
.cardWrap.list .cardRight {
width: 35%;
}
.cardWrap.list .card {
min-height: 190px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="eventstage-6" class="cardWrap cleared" data-tt-widget-trigger="toggleStage" data-tt-stageid="6">
<div class="card cardLeft">
<span class="ticket-parts"></span> ---- Book NOW! ----
</div>
<div class="card cardRight">
CLICK!
<span class="ticket-parts"></span>
<div class="card-top">
<h1>BOOKED!</h1>
</div>
</div>
</div>
Cпасибо.
Ответы (2 шт):
Вы применяете transform-origin после того, как он читает трансформироваться.
Примените его изначально..
$('.cardRight').click(function() {
$(this).toggleClass("cutted");
});
/* ticket */
.cardWrap {
cursor: pointer;
position: relative;
font-family: sans-serif;
margin: 0 auto;
display: flex;
border-radius: 8px;
}
.cardLeft {
width: 400px;
border-right: 18em dashed #fff;
border-radius: 8px 0 0 8px;
border: 1px solid black;
height: 250px;
background: red;
color: white;
font-size: 24px;
text-align: center;
}
.cardRight {
width: 25%;
border-left: .18em dashed #fff;
border-radius: 0 8px 8px 0;
border: 1px solid black;
height: 250px;
background: blue;
color: white;
}
.cardSingle {
width: 100%;
border-right: .18em dashed #fff;
border-radius: 8px 0 0 8px;
}
.cardWrap .form-group {
height: 0;
overflow: hidded;
opacity: 0;
}
.cardRight h1 {
opacity: 0;
text-align: center;
}
.cardRight,
.cardRight * {
-webkit-transition: all 0.3s ease-in-out;
-moz-transition: all 0.3s ease-in-out;
-o-transition: all 0.3s ease-in-out;
transition: all 0.3s ease-in-out;
-ms-transform-origin: 0% 100%;
-webkit-transform-origin: 0% 100%;
transform-origin: 0% 100%;
}
.cardRight.cutted {
-ms-transform: rotate(25deg);
-webkit-transform: rotate(25deg);
transform: rotate(25deg);
}
.cutted .cardRight h1 {
opacity: 1;
}
.cardWrap.list {
cursor: default;
}
.cardWrap.list .cardLeft .btn-group {
padding: 16px 0 0;
}
.cardWrap.list .cardLeft {
width: 65%;
}
.cardWrap.list .cardRight {
width: 35%;
}
.cardWrap.list .card {
min-height: 190px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="eventstage-6" class="cardWrap cleared" data-tt-widget-trigger="toggleStage" data-tt-stageid="6">
<div class="card cardLeft">
<span class="ticket-parts"></span> ---- Book NOW! ----
</div>
<div class="card cardRight">
CLICK!
<span class="ticket-parts"></span>
<div class="card-top">
<h1>BOOKED!</h1>
</div>
</div>
</div>
Сейчас transition применяется ко всем свойствам, в том числе и к transform-origin.
По умолчанию, значение свойства transform-origin - 50%.
То есть изменения transform-origin проходит одновременно с применением rotate.
Для решения нужно либо установить transform-origin изначально.
Либо указать в transition конкретные свойства.
$('.cardRight,.cardRight2').click(function() {
$(this).toggleClass("cutted");
});
/* ticket */
.cardWrap {
cursor: pointer;
position: relative;
font-family: sans-serif;
margin: 0 auto;
display: flex;
border-radius: 8px;
}
.cardLeft {
width: 100px;
border-right: 18em dashed #fff;
border-radius: 8px 0 0 8px;
border: 1px solid black;
height: 75px;
background: red;
color: white;
font-size: 24px;
text-align: center;
}
.cardRight,
.cardRight2 {
width: 50px;
border-left: .18em dashed #fff;
border-radius: 0 8px 8px 0;
border: 1px solid black;
height: 75px;
background: blue;
color: white;
}
.cardRight2 {
transform-origin: 0 100%;
}
.cardRight,
.cardRight * {
transition: transform 0.3s ease-in-out;
}
.cardRight2,
.cardRight2 * {
transition: all 0.3s ease-in-out;
}
.cardRight.cutted {
transform: rotate(25deg);
transform-origin: 0% 100%;
}
.cardRight2.cutted {
transform: rotate(25deg);
}
.cutted .cardRight h1 {
opacity: 1;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="eventstage-6" class="cardWrap cleared" data-tt-widget-trigger="toggleStage" data-tt-stageid="6">
<div class="card cardLeft">
<span class="ticket-parts"></span> ---- Book NOW! ----
</div>
<div class="card cardRight">
CLICK!
<span class="ticket-parts"></span>
<div class="card-top">
<h1>BOOKED!</h1>
</div>
</div>
</div>
<div class="cardWrap cleared" data-tt-widget-trigger="toggleStage" data-tt-stageid="6">
<div class="card cardLeft">
<span class="ticket-parts"></span> ---- Book NOW! ----
</div>
<div class="card cardRight2">
CLICK!
<span class="ticket-parts"></span>
<div class="card-top">
<h1>BOOKED!</h1>
</div>
</div>
</div>